關於數據庫的外鍵

一般情況下,去掉外鍵的原因都是想要提高性能,但是在哪裏提高性能呢?如果說每一次操作外鍵都會幫我們檢查約束,那麼

我們自己維護數據完整性的話不是也要麼?

1、當批量插入的時候,每一次數據庫都會去檢測外鍵的約束,而我們代碼可能只需要檢測一次。

試想,一個程序每天要insert數百萬條記錄,當存在外鍵約束的時候,每次要去掃描此記錄是否合格,一般還不止一個字段有外鍵,這樣掃描的數量是成級數的增長!我的一個程序入庫在3個小時做完,如果加上外鍵,需要28個小時!

2、 當系統龐大的時候,如果讓代碼來維護外鍵,軟件方面的效率,可以通過加幾臺服務器來處理,使得效率提高,而數據庫如果只有1份的話,那麼數據庫承受的壓力必然很大。


=========================================================================

下面的內容是轉自:http://apps.hi.baidu.com/share/detail/15593176


對於主/外鍵/索引來說,在一些開發團隊中被認爲是處理數據庫關係的利器,也被某些開發團隊認爲是處理某些具體業務的魔鬼,您的觀點呢?在實際應用中您會採取哪種方式?


大家共同觀點:

主鍵和索引是不可少的,不僅可以優化數據檢索速度,開發人員還省不其它的工作,

矛盾焦點:數據庫設計是否需要外鍵。這裏有兩個問題:一個是如何保證數據庫數據的完整性和一致性;二是第一條對性能的影響。


正方觀點:

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

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

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

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


反方觀點:

1,可以用觸發器或應用程序保證數據的完整性

2,過分強調或者說使用主鍵/外鍵會平添開發難度,導致表過多等問題

3,不用外鍵時數據管理簡單,操作方便,性能高(導入導出等操作,在insert,   update,   delete   數據的時候更快)

eg:在海量的數據庫中想都不要去想外鍵,試想,一個程序每天要insert數百萬條記錄,當存在外鍵約束的時候,每次要去掃描此記錄是否合格,一般還不止一個字段有外鍵,這樣掃描的數量是成級數的增長!我的一個程序入庫在3個小時做完,如果加上外鍵,需要28個小時!  


結論:

1,在大型系統中(性能要求不高,安全要求高),使用外鍵;在大型系統中(性能要求高,安全自己控制),不用外鍵;小系統隨便,最好用外鍵。

2,用外鍵要適當,不能過分追求

3,不用外鍵而用程序控制數據一致性和完整性時,應該寫一層來保證,然後個個應用通過這個層來訪問數據庫。





 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章