1. 程式人生 > >Mysql外鍵約束

Mysql外鍵約束

是我 約束 頻繁 傳遞 數據庫安全 服務器 完整 即使 完全

優點:

1)數據一致性

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

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

2)ER圖可靠性

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

3)使設計更全面

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

4)級聯性能未必最低

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

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

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

約束:

1)程序邏輯

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

2)性能問題

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

3)維護麻煩

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

4)外鍵定死了先後生成關系

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

Mysql外鍵約束