資料庫該不該用外來鍵

2021-05-22 04:35:38 字數 2109 閱讀 1667

外來鍵這個東西讓多少程式設計師又愛又恨,雖然高效的保證了資料庫的完整性,一度讓我們覺得有了它,維護資料庫是多麼幸福的一件事情,我們不需要寫那麼多繁瑣的**來保證資料的完整性。可是隨著我們的系統逐漸龐大,我們又發現它給我們帶來了不少麻煩,複雜度、效能都受到了影響,於是我們就產生了到底該不該用外來鍵的疑問。

不管是我們做程式設計的,還是社會上的各行各業,或是任何一件事情都是有乙個度的約束。上學的時候政治課上總是在說事物都是具有兩面性的,好的一面有,當然壞的一面也有,於是外來鍵這個東西自然也逃不出這個道道。在我看來,任何一項技術都有它存在的價值,也許是我們沒有發現,但並不代表它不存在,缺點同樣如此。理論聯絡實際,這是我們都明白的道理,一味的說某個技術好或者壞而脫離實際應用的言論,那都是片面的。說的有點多了,下面就來談談外來鍵這個東西吧。

先說說外來鍵有那些好處

1.通過外來鍵,資料庫自身能夠保證資料的完整性與一致性,雖然我們在程式中也能夠寫些**來維護,但是程式始終沒有辦法100%的保證資料的完整性與一致性。而外鍵本身屬於資料庫的一部分,所以在資料庫伺服器出現問題的時候,它也能最大限度的儲存資料庫的完整性與一致性。

2.有外來鍵的資料庫可以使er圖更具有可讀性,資料庫中表與表之間的關係更加一目了然,這對於系統的二次開發或是維護也是相當有用的。

3.在業務邏輯上,通過外來鍵可以更加直觀的理解業務邏輯,在設計功能時起到了輔助作用,讓設計更加周到完善。

4.對於乙個專案,開發人員總是不斷變動的,開發人員的能力也是層次不齊的,那麼通過**來保證資料完整性更是難上加難的事情,有了外來鍵在一定程度上約束了開發人員,能夠避免一些低階錯誤而導致資料的不完整。

至於壞處也有以下幾點

1.過分使用外來鍵,會讓系統的開發難度增加,同時也導致表過多,增加了系統的複雜度。

2.效能問題,由於外來鍵對資料庫有了一定的約束,那麼在我們每次進行資料庫操作的時候必然要驗證這個約束,對於資料量小的系統來說沒有任何問題,但是當資料變的很龐大的時候,那麼效能上的劣勢就很明顯了。

顯而易見,對於外來鍵的應用我們還是要根據具體的問題來分析。用會給我們這個系統帶來什麼好處,不用會給系統帶來什麼壞處,哪個更多一些,那我們的選擇自然也就明了了。道理其實大家都明白,那我們究竟該怎麼分析好與壞,或是怎麼看出使用外來鍵的時候是好處多一點還是壞處多一點呢。我認為,當我們開始做乙個專案的時候,我們要從以下幾個方面來分析該不該上外來鍵約束:

1.專案業務邏輯的複雜度

業務邏輯其實是乙個專案最根本的東西,是專案的乙個核型,它就像一條主線,貫穿於專案的始末。所以當業務邏輯非常複雜的時候,那麼各個實體之間的關係也是非常「曖昧」的,這裡之所以用「曖昧」是因為有的時候實體之間的關係錯綜複雜,有很多都存在關聯。這個時候外來鍵恰恰幫我們理清了他們之間的關係,同時在專案中使用外來鍵更容易保證資料的完整性與一致性。由於關係的複雜,我們已經沒有辦法使用程式來100%保證資料的完整性與一致性了。相反,如果業務邏輯不複雜,關係很明了,近似於「一夫一妻制」,那麼我們在程式裡就可以保證完整性與一致性了,當然也沒有必要用外來鍵的了。

2.專案計畫進行的時間

程式設計師的流動性是很大的,也許乙個專案開發到一半的時候,整個專案組除了專案經理外程式設計師都全部換人了,如果文件沒有及時跟上,或是交接的時候不明確,那對於專案來說是很危險的。對於那些半路殺進來的程式設計師,雖然有經驗的程式設計師會在編碼的時候思考完整性的問題,但是由於各種原因,他們沒有辦法100%的通過程式保證資料的完整性與一致性。有經驗的尚且如此,所以這個時候外來鍵就為專案的完整性把好了最後一道關卡,無論他們對專案是否熟悉,在完整性與一致性的問題上面,資料庫自身已經做好了充分的準備。相反,專案如果週期很短,人員變動也很小,那就可以撇開這個因素,從其他方面考慮是否需要使用外來鍵。

3.安全性與完整性

這個問題其實最好理解,如果專案對資料有著非常苛刻的安全性、完整性與一致性的要求,那必然要用外來鍵,可能會缺失一部分效能,即使是這樣也是值得的,這樣從最大程度上滿足了專案的需求,這才是關鍵。

4.效能

上面第三點已經討論的效能的問題了。對於大型的系統,如果每天有百萬級的資料操作,這個時候如果使用外來鍵,那效能就變成了致命的問題。外來鍵就是一種約束,我們沒操作一次insert、update或是delete的時候都要通過這個約束來驗證資料是否完整一致。這個時候效能上的缺失可能是幾小時甚至是幾十個小時。

以上幾點是我自己總結出來的,也許更有經驗的人還會有其他方面的考慮,總而言之,技術是在不斷發展的,每天都會有很多新的技術誕生,在我們了解它們之後更多的是應該去思考它們適用於哪些場合。

資料庫該不該使用外來鍵

以前的意識裡都是需要建立外來鍵,外來鍵能起到約束作用,能保證資料的完整性和一直性,比如如果沒有外來鍵約束,你自己程式控制又不到位把基本資訊都刪除了,詳情卻存在,人的基本資訊不存在了,工資資訊裡卻存在這個人,想要找這個人究竟是誰都找不到。今天看到原來的外來鍵都被去掉了,問了下組長,結果回答就兩個字 效...

外來鍵該不該有索引

參考 在資料庫中,索引的使用非常重要,恰當的使用索引可以提高資料庫訪問的效率,但是索引的不當使用則會影響效能並占用不必要的儲存空間。在oracle資料庫中,是否應該對外鍵使用索引呢?這可能是很多人都有的疑問,答案是肯定的,即在一般情況下應該對外鍵使用索引。不過在弄清這個問題之前首先要明確乙個概念,就...

資料庫 外來鍵

外來鍵是什麼?外來鍵 fk 是用於建立和加強兩個表資料之間的鏈結的一列或多列。通過將儲存表中主鍵值的一列或多列新增到另乙個表中,可建立兩個表之間的鏈結。這個列就成為第二個表的外來鍵。外來鍵資料庫一級的完整性約束,由資料庫自行維護.你也可以手動建立.1如果存在外來鍵關係的話,任何修改主表主鍵欄位和刪除...