是否有必要使用外键?为什么不用外键?
什么是外鍵:
如果一個實體的某個字段指向另一個實體的主鍵,就稱為外鍵。被指向的實體,稱之為主實體(主表),也叫父實體(父表)。負責指向的實體,稱之為從實體(從表),也叫子實體(子表)
外鍵的作用:
①為了一張表記錄的數據不要太過冗余。
②保持數據的一致性、完整性。
是否有必要使用外鍵?
正方:(需要)
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: 當然有些關鍵的業務,確實需要外鍵;
為什么不用外鍵?
[數據庫外鍵爭論]
http://blog.csdn.net/wacthamu/article/details/7255811
http://www.cnblogs.com/chenkai/archive/2009/11/11/1601193.html?page=2#commentform
下面的話全是上面爭論里的原話,我就截取了三個人的,因為我個人也偏向不使用外鍵
1、淡化外鍵,并不能簡單武斷的說淡化或不淡化。 必須根據實際情況來決定,如數據來源,關聯影響,業務控制邏輯等。
以下是個人關于是否淡化外鍵的個人經驗和想法。
淡化外鍵的情況:如果對于某此數據來源復雜,且單表操作對系統基本沒有什么影響的情況下,可以淡化外鍵。 何謂數據來源復雜?數據的來源不止僅限于自由系統,更可能來源于其它系統,或人工的數據導入,并且導入的數據不全面,在這種情況下,淡化外鍵可以極大減少工作量,并且極大的降低工作的復雜度。
不能淡化外鍵的情況:關鍵數據,業務邏輯很嚴謹,數據來源單一,數據來源規則標準固定的。業務邏輯嚴謹是指數據表之間的關聯很好,變動一個表的數據,必須對另一個表產生影響,有時這種影響還相當的大。數據來源單一是指數據都從自身系統來,或固定的其它系統通過一定的邏輯錄入;數據來源規則標準固定是指從其它地方人工錄入或是對過庫對庫的數據錄入或同步時,數據規則是一致的。 在這種情況下,根據約束完整性設置外鍵,一方面能保證系統的健壯性,另一方面可以及排除淡化外鍵的情況可能出現的一些數據問題(你懂的,很多時候是人工操作,或來源數據不全導致的一些問題)。
完美的系統一定不是最合適的系統,依據現實而言,只需要最合適的。
2、幾乎不用,拋開性能不說,開發、測試、部署、實施,以及維護的時候都帶來不少問題
數據完整性幾乎都是業務的要求,理應由業務部分負責維護,而不是依賴數據庫
訪問量較大的web應用,以及有一定規模的企業應用,都關注伸縮性和性能問題,各種形式的垂直、水平切分運用越來越多,外鍵、觸發器、存儲過程之類的基本屬禁區
轉載于:https://my.oschina.net/zjllovecode/blog/1586130
總結
以上是生活随笔為你收集整理的是否有必要使用外键?为什么不用外键?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么Controller层注入的是Se
- 下一篇: 赛后总结:第四届工业大数据竞赛注塑成型