這個問題是在標題!你如何看待mysql表級聯刪除?
我使用的存儲DATAS從我的(生產)的網站數據庫中包含了大量的ON DELETE CASCADE
。
我只是想知道這是一件好事,還是手動編碼所有刪除的更好方法。
一方面,它不是很明確:刪除通過魔術和在其他手工製作,它使開發更容易:我沒有讓我的數據庫的整個模式在我的腦海。
這個問題是在標題!你如何看待mysql表級聯刪除?
我使用的存儲DATAS從我的(生產)的網站數據庫中包含了大量的ON DELETE CASCADE
。
我只是想知道這是一件好事,還是手動編碼所有刪除的更好方法。
一方面,它不是很明確:刪除通過魔術和在其他手工製作,它使開發更容易:我沒有讓我的數據庫的整個模式在我的腦海。
我認爲保持參照完整性是一件好事。你想要的最後一件事是你的數據庫中的孤行。
參見事情MySQL文檔不使用參照完整性時需要考慮:
的MySQL允許數據庫開發人員要使用的方法的選擇。如果您不需要外鍵,並且希望避免與強制執行引用完整性相關的開銷,則可以選擇其他存儲引擎,例如MyISAM。 (例如,MyISAM存儲引擎爲僅執行INSERT和SELECT操作的應用程序提供了非常快的性能,在這種情況下,表格中間沒有孔,插入操作可以與檢索同時執行,參見8.10.3節, 「併發插入」)
如果您選擇不採取參照完整性檢查的優勢,請注意以下注意事項:。
在不存在服務器端外鍵關聯檢查,自身必須處理的應用關係問題。例如,它必須小心地按正確的順序將行插入表中,並避免創建孤立的子記錄。它還必須能夠從多記錄插入操作過程中發生的錯誤中恢復。
如果ON DELETE是應用程序需要的唯一引用完整性功能,那麼可以通過使用多表DELETE語句通過單個語句從多個表中刪除行來達到與MySQL Server 4.0類似的效果。請參見第13.2.2節「刪除語法」。
一種缺少ON DELETE的解決方法是適當的DELETE語句添加到您的應用程序時,你從具有外鍵的表刪除記錄。實際上,這通常與使用外鍵一樣快,並且更便攜。
請注意,使用外鍵有時會導致問題:
外鍵的支持解決了許多參照完整性問題,但它仍需要仔細設計鍵的關係,以避免循環規則或級聯的不正確組合刪除。
DBA創建關係的拓撲結構並不罕見,這使得難以從備份中恢復單個表。 (MySQL通過允許您在重新加載一個依賴於其他表的表時重新加載一個表時暫時禁用外鍵檢查來緩解這一困難,請參見第14.3.5.4節「FOREIGN KEY約束條件」從MySQL 4.1.1開始,mysqldump生成轉儲文件,當這些能力被重新加載時,這個能力會自動被重新加載)
來源:http://dev.mysql.com/doc/refman/5.5/en/ansi-diff-foreign-keys.html
級聯刪除是供您使用提供你確保只有它可以完美的做到使用它們一個很好的工具。
您選擇使用級聯刪除的主要情況是當您有一個表模擬由另一個表中的一個(且只有一個)「行」擁有的實體時。例如,如果您有一個模擬人員的表格和一個模擬電話號碼的表格。在這裏你的電話號碼錶將會有一個外鍵給你的人員表。現在,如果您決定不再希望自己的應用跟蹤某人 - 比如說「道格拉斯」 - 那麼您不想再跟蹤道格拉斯的電話號碼是非常合理的。把電話號碼放在數據庫中是沒有意義的,不知道它是誰。
但是與此同時,當您想從「人員」表中刪除某個人時,您不希望首先費力地檢查您是否有該人的任何電話號碼並將其刪除。爲什麼當你可以在數據庫結構中編碼時,當一個人被刪除時,他們的電話號碼可以全部去呢?這是級聯刪除會爲你做的。只要確保你知道你有什麼級聯刪除,並且它們都有意義。
注意:如果你使用觸發器,你需要更加小心。 MySQL不會在級聯刪除時觸發觸發器。
我個人不會信任MySQL來做到這一點。 –
@ ta.speot.is:如果你有這樣的不信任,那麼也許你應該使用一種你認爲可以獲得更多信任的RDBMS。 (也許這就是你所做的一點,我不知道。)如果你避免使用yor RDBMS的基本關係數據庫特性,那麼你可能會爲自己做更多的工作而不是必要的。 – Hammerite
@Hammerite不使用MySQL是關鍵。 –