10.19 用?不用?數據庫外鍵約束之優缺點

有些同學可能還不清楚什麼是主鍵和外鍵,那麼簡單先給大家過一遍。

什麼是主鍵、外鍵?

  • 學生表(學號,姓名,性別,班級) 學號是一個主鍵
  • 課程表(課程號,課程名,學分) 課程號是一個主鍵
  • 成績表(學號,課程號,成績) 學號和課程號的屬性組構成一個主鍵

成績表中的學號不是成績表的主鍵,不過是學生表的主鍵,成績表的外鍵,同理課程號也是成績表的外鍵

定義:如果公共關鍵字在一個關係中是主關鍵字,那麼這個公共關鍵字被稱為另一個關係的外鍵。以一個關係的外鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表

用?不用?數據庫外鍵約束之優缺點

男人歡呼在錢臺階與鍵孔

好,那麼外鍵的約束是否有用?又有哪些優缺點呢?

優點(用)

1.數據一致性

由數據庫自身保證數據一致性,完整性,更可靠,因為程序很難100%保證數據 的完整性,而用外鍵即使在數據庫服務器當機或者出現其他問題的時候,也能夠最大限度的保證數據的一致性和完整性。

eg:數據庫和應用是一對多的關係,A應用會維護他那部分數據的完整性,系統一變大時,增加了B應用,A和B兩個應用也許是不同的開發團隊來做的。他們如何協調保證數據的完整性,而且一年以後如果又增加了C應用呢?

2.ER圖可靠性

有主外鍵的數據庫設計可以增加ER圖的可讀性,這點在數據庫設計時非常重要。

3.使設計更全面

外鍵在一定程度上說明的業務邏輯,會使設計周到具體全面

4.級聯性能未必最低

除非能證明觸發器的性能和可維護性比外鍵更優,否則憑什麼一定要否定外鍵呢?

5.程序能完全保證安全性嗎?

使用應用程序來維護數據完整性,則是嚴重降低數據庫安全性的一種做法。連接字符串裡如果有uid和pwd或者類似的這兩個東西,可以使用工具獲取你數據庫的帳號。因為每次建立數據庫聯接的時候都會在網線上以標準格式傳遞這些信息。從此編碼內的任何保證都是空的。

6.導致冗餘

不使用外鍵,會導致數據冗餘,在級聯最底層的表可能會重複好幾層的數據 必然導致最底層的表數據量翻倍,IO瓶頸是數據庫性能瓶頸之一。

缺點(不用)

1.程序邏輯

某些程序邏輯中,程序的邏輯已經足夠保證完整性,我會在存儲過程或包等地方做嚴謹的判斷;

2.性能問題

這是很多人不喜歡用的關鍵原因,比如一個業務流水錶,頻繁插入數據,如果這個表身上有3外鍵,那麼每次插入一條,就必須對這3個外鍵對應的3個表做相應的查找判斷有無對應數據,如果這3個表也很大,那就這3個表的判斷時間就很常,雖然外鍵指向的關聯表的字段肯定是索引,但是我覺得很多時候,這樣的判斷本來就在程序裡控制好了,通過外鍵再判斷一次,就是降低性能;而且其實有的地方判不判斷也無所謂的,但是用了外鍵,就必須化時間去判斷,無論oracle內部多麼優化外鍵對於數據的檢索速度,它總是一個不小的消耗;

3.維護麻煩

很多公司的軟件都是定製的,這種定製的東西,隨意性相對較大,項目開發實施過程中,需要經常對錶修修補補;還有就是業務邏輯有bug或者其他情況,需要經常手工維護數據,有錯綜複雜的外鍵關聯著,很是麻煩;

4.外鍵定死了先後生成關係

外鍵定死了兩個表之間數據的先後生成關係,最常見的是單據主從表,有的時候,在生成單據的時候,是先生成明細,再生成主表;如果釘死了外鍵,這個就沒法實現;

PS: 當然有些關鍵的業務,確實需要外鍵;


分享到:


相關文章: