26

在處理關係的MVC框架中定義外鍵的優點是什麼?定義外鍵的優點是什麼

我使用的是一個框架,允許模型定義與關係的關係數據庫。因爲外鍵是通過模型定義的,所以外鍵似乎是多餘的。在開發中管理應用程序的數據庫時,編輯/刪除使用外鍵的表是一件麻煩事。

是否有任何優勢,使用的是我被完全丟棄使用它們放棄外鍵?

+1

外鍵關係強化數據層的數據完整性,從而減少進入系統的壞數據;不,不是真的。例如,如果您的人員表具有與性別表的FK關係,則開發人員可以將記錄插入「whocares」性別的人員。現在,你可能不關心這一點,但如果你建立邏輯關閉有效的條目,只希望男性/女性,那麼......你會有一個問題。如果您想要對數據庫進行逆向工程以獲得ERD,那麼您也會遇到問題。和腳手架和其他技術繼續在這個設計水平... – xQbert 2012-04-16 23:38:24

+1

高度相關:[爲什麼外鍵在理論上比在實踐中更多使用?](http://stackoverflow.com/questions/1876013/why-are-foreign -keys-more-in-theory-practice-practice) – 2012-04-16 23:38:26

+1

我曾經在一個曾經工作過的地方有過類似的情景:一個應用沒有外鍵,因爲ORM處理了所有這些事情等等。重要的客戶發現了重大的數據丟失,最終追溯到ORM中的錯誤。非常損害這種關係,指責ORM開發人員並沒有幫助。之後很快就添加了外鍵! – onedaywhen 2012-04-17 10:43:09

回答

31

與限制(在某些數據庫引擎)外鍵給你低級別的數據完整性(數據庫級)。 這意味着您無法物理創建不符合關係的記錄。 這只是一種更安全的方式。

+3

另一個優點是級聯DELETE。例如,假設你有一個'User'表和一個'Class'表。不要在'Class'中重寫所有的用戶數據,而只需引用用戶的id。但是,如果該用戶被刪除?如果您沒有打開級聯刪除,則Cl​​ass表中的行將指向一個不存在的用戶。如果該用戶標識被完全不同的用戶替換,該怎麼辦?這是什麼時候東西變得非常糟糕。級聯刪除將刪除與該用戶關聯的所有記錄。這可能看起來並不重要,但如果'User'連接到很多表格,這會有很大的幫助。 – 2015-07-21 14:10:56

+0

它是否對我們有任何費用? – Ahmad 2015-09-10 05:45:51

13

它爲您提供在數據庫級別實施的數據完整性。這有助於防止應用程序邏輯中可能導致無效數據的錯誤。

如果任何數據操縱曾經在SQL繞過應用程序邏輯直接完成,這也對守衛打破這些限制壞的數據。

另外一個側面好處是,它可以讓工具自動生成從模式本身推斷的關係數據庫圖表。現在理論上所有的圖表都應該在創建數據庫之前完成,但是隨着數據庫的發展超出其最初的化身,這些圖表通常不會保持最新,並且從現有數據庫生成圖表的能力對於審查,以及向參與項目的新開發人員解釋結構。

這可能是一個有益的禁用FKS而數據庫結構仍然在不斷變化,但他們良好的保障有當架構更加穩定。

11

外鍵保證匹配記錄存在於外表中。設想一個名爲Books的表,它在名爲Authors的表上具有FK約束。每本書都保證有Author。現在

,你可以做一個查詢,如:

SELECT B.Title, A.Name FROM Books B 
INNER JOIN Authors A ON B.AuthorId = A.AuthorId; 

沒有FK約束,缺少Author行將導致整個Book行被丟棄,從而導致你的數據集丟失的書籍。

此外,在FK約束條件下,嘗試刪除至少一本書引用的作者會導致錯誤,而不是破壞數據庫。

2

主要好處是數據完整性和級聯刪除。當他們被定義並且這些字段被正確索引時,你也可以獲得性能增益。例如,您將無法創建不屬於聯繫人的電話號碼,或者當您刪除聯繫人時,可以將其設置爲自動刪除其所有電話號碼。是的,您可以在您的用戶界面或中間層中建立這些連接,但如果有人使用SQL而不是您的用戶界面直接針對服務器運行更新,那麼您仍然會收到孤兒。 「麻煩」部分只是強制您在進行批量更改之前考慮這些關係。 FKs多次拯救了我的培根。

5

雖然它們在操縱開發/測試數據時可能很痛苦,但它們爲我節省了很多生產中的麻煩。

將它們看作是保持數據完整性的一種方法,特別是作爲防止孤立記錄的一種防範措施。

舉例來說,如果你有很多相關的記錄PhoneNumber數據庫到Person,什麼時候Person記錄無論出於何種原因刪除恰好PhoneNumber記錄? 它們仍將存在於數據庫中,但它們相關的Person的ID將不再存在於相關的Person表中,並且您有孤立的記錄。

是的,你可以寫一個觸發刪除每當Person被刪除PhoneNumber,但是這可能會導致混亂,如果你不小心刪除Person,需要回滾。

是的,你可能記得手動清除PhoneNumber記錄,但是你寫了9個月後寫的其他開發者或方法呢?

通過創建一個確保任何PhoneNumber與現有的Person相關的外鍵,您都可以確保不會破壞這種關係,還可以針對預期的數據結構添加「線索」。