Mysql

如果外鍵/級聯刪除不好,為什麼要使用具有該功能的數據庫伺服器?

  • June 17, 2013

我注意到 wordpress/rails 等不使用外鍵約束或級聯從數據庫中刪除功能。相反,他們在 PHP/Ruby/腳本級別處理這個!

我讀過這個這個。大多數反對外鍵約束的論點都是關於性能、多執行緒、鎖定、可伸縮性等。

假設反對外鍵的論點是有效的,我的問題是:

  1. 如果外鍵不好,為什麼 WordPress/Rails/etc 使用支持外鍵的 sql-server?他們會從 MySQL 轉向 NoSQL 類型的伺服器中受益嗎?
  2. 另一方面,應用程序編碼的方式是否可以利用外鍵功能而不會遇到問題?
  3. 如果我們僅將數據庫用於儲存和管理應用程序/腳本層的“關係”,那麼 noSQL/redis 會更好嗎?

讓我們從您的第一個連結開始。它清楚地說:

在具有參照完整性的大型數據庫上工作表現不佳。

這是正確的。只是您可能不知道“大型數據庫”是 TB 大小,表中有數十億行。一個簡單的選擇可能會級聯成數億個相關元素被刪除,然後你就會遇到性能問題。

對於正常的小型數據庫(例如 wordpress 日誌或大多數 CMS)來說,這不是問題——如果您執行 facebook 之類的操作或處理財務模擬數據,它就會變成問題。我經常處理數十億行表並刪除在事務之外的儲存過程中工作的 x 批次 - 因為最終刪除可能很容易清理數億行。

他們會從 MySQL 轉向 NoSQL 類型的伺服器中受益嗎?

幾乎不。當專業人士酌情使用它們時,它們很有用。

另一方面,應用程序編碼的方式是否可以利用外鍵功能而不會遇到問題?

是的。

如果我們僅將數據庫用於儲存和管理應用程序/腳本層的“關係”,那麼 noSQL/redis 會更好嗎?

我曾經對一家不使用參照完整性(以提高性能)的銀行進行技術升級的應用程序審查。將數據載入到 SQL Server(它應該替換他們老化的 Adabas 安裝)它失敗了,違反了完整性約束。發生 40% 的歷史記錄是無效的,因為某些*****已刪除不再使用的查找表值(例如舊的客戶分類程式碼,它被替換為所有活躍的客戶,而不是舊的)​​。從來沒有出現過參照完整性警告。結果是一些人被解雇了,一個問題被困在了解決方法中,並且在頂部建構了一個部分無用的數據倉庫。

在應用程序/腳本層管理關係就這麼多。錯誤將會發生。數據很有價值,應用程序會發生變化。

大多數抱怨 SQL 級別特性的人會更建議閱讀有關它們的書,並嘗試理解它們,而不是抱怨。可悲的是,網際網路上的許多建議都是由拒絕閱讀文件的人撰寫的。始終要小心。大多數對 NoSql 的建議都是基於無知。

引用自:https://dba.stackexchange.com/questions/44342