如果公共關鍵字在一個關系中是主關鍵字,那么這個公共關鍵字被稱為另一個關系的外鍵。由此可見,外鍵表示了兩個關系之間的相關聯系。以另一個關系的外鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。外鍵又稱作外關鍵字。
優點:
1、由數據庫自身保證數據一致性,完整性,更可靠,因為程序很難100%保證數據 的完整性,而用外鍵即使在數據庫服務器當機或者出現其他問題的時候,也能夠最大限度的保證數據的一致性和完整性。
eg:數據庫和應用是一對多的關系,A應用會維護他那部分數據的完整性,系統一變大時,增加了B應用,A和B兩個應用也許是不同的開發團隊來做的。他們如何協調保證數據的完整性,而且一年以后如果又增加了C應用呢?
2、有主外鍵的數據庫設計可以增加ER圖的可讀性,這點在數據庫設計時非常重要。
3、外鍵在一定程度上說明的業務邏輯,會使設計周到具體全面
4、除非能證明觸發器的性能和可維護性比外鍵更優,否則憑什么一定要否定外鍵呢?使用應用程序來維護數據完整性,則是嚴重降低數據庫安全性的一種做法。連接字符串里如果有uid和pwd或者類似的這兩個東西,可以使用工具獲取你數據庫的帳號。因為每次建立數據庫聯接的時候都會在網線上以標准格式傳遞這些信息。從此編碼內的任何保證都是空的。
5、不使用外鍵,會導致數據冗余,在級聯最底層的表可能會重復好幾層的數據。必然導致最底層的表數據量翻倍,IO瓶頸是數據庫性能瓶頸之一
缺點:
1、可以用觸發器或應用程序保證數據的完整性(外鍵可代替)
2、過分強調或者說使用主鍵/外鍵會平添開發難度,導致表過多等問題
3、不用外鍵時數據管理簡單,操作方便,性能高(導入導出等操作,在insert, update, delete 數據的時候更快)
eg: 在海量的數據庫中想都不要去想外鍵,試想,一個程序每天要insert數百萬條記錄,當存在外鍵約束的時候,每次要去掃描此記錄是否合格,一般還不止一個 字段有外鍵,這樣掃描的數量是成級數的增長!我的一個程序入庫在3個小時做完,如果加上外鍵,需要28個小時!
4、幾乎不用,拋開性能不說,開發、測試、部署、實施,以及維護的時候都帶來不少問題。數據完整性幾乎都是業務的要求,理應由業務部分負責維護,而不是依賴數據庫訪問量較大的web應用,以及有一定規模的企業應用,都關注伸縮性和性能問題,各種形式的垂直、水平切分運用越來越多,外鍵、觸發器、存儲過程之類的基本屬禁區
建立外鍵
假設我們有張主表user表,表結構如下:
我們希望以id這個字段作為別的表的外鍵關聯一張子表balance。 balance表記錄着user的賬戶余額以及幣種。表結構如下
主鍵:是唯一標識一條記錄,不能有重復的,不允許為空,用來保證數據完整性
外鍵:是另一表的主鍵, 外鍵可以有重復的, 可以是空值,用來和其他表建立聯系用的。所以說,如果談到了外鍵,一定是至少涉及到兩張表。例如下面這兩張表:
如果大家分不清主外鍵表記住:有外鍵字段的是外鍵表,沒有外鍵字段,但與外鍵表有關聯是主鍵表
注意:
1、外鍵字段在創建的時候就應該與主表的類型完全一致(長度啊等),否則創建外鍵會報錯
2、外鍵表是不能插入主表不存在的數據。
3、外鍵表不能刪除已經關聯上的主表數據。
參考鏈接:https://blog.csdn.net/nakiri_arisu/article/details/79718442
https://www.cnblogs.com/qiantuwuliang/archive/2011/05/13/2045496.html