- 論壇徽章:
- 0
|
轉(zhuǎn)自 http://www.javaeye.com/topic/920511
今天看天乙社區(qū)的程序,發(fā)現(xiàn)一個(gè)外鍵都沒(méi)有啊,太狠了。上網(wǎng)看了一些資料,稍微整理了一下。
這個(gè)帖子很牛:
http://www.itpub.net/viewthread. ... p;extra=&page=1
我的觀點(diǎn)是,外鍵在初始階段能加的都加上,只有迫不得已的時(shí)候才disable或drop掉。遇到性能瓶頸的時(shí)候,盡量采用其它方式調(diào)優(yōu),而不要輕易犧牲掉外鍵。有外鍵約束的時(shí)候,寫程序的確會(huì)有約束,但從直覺(jué)上說(shuō)這種約束一定程度上揭示了設(shè)計(jì)或?qū)崿F(xiàn)上不合理的地方。帶著外鍵寫出來(lái)的應(yīng)用更傾向于嚴(yán)謹(jǐn)。產(chǎn)品上線之前如果確實(shí)需要通過(guò)犧牲外鍵達(dá)到性能上的優(yōu)化,再撿相對(duì)不重要的外鍵廢棄掉,同時(shí)要把這個(gè)document下來(lái),下次遇到數(shù)據(jù)不一致問(wèn)題的時(shí)候,是個(gè)線索。兩點(diǎn)說(shuō)明:1. 我們?cè)谧龅囊粋(gè)項(xiàng)目確實(shí)是小項(xiàng)目。 2. 我得承認(rèn)我最近三年開(kāi)發(fā)都不用關(guān)系型數(shù)據(jù)庫(kù),貌似 no sql那么nb的key-value pair存數(shù)據(jù),其實(shí)這三年在持久層上很多糾結(jié)。如果我說(shuō)的不對(duì),請(qǐng)指正!
下面引用一些有見(jiàn)地的想法:
× 支持外鍵的:
1. 你的程序再嚴(yán)謹(jǐn)也有可能出現(xiàn)BUG;你自己判斷不如交給數(shù)據(jù)庫(kù)判斷,它做得又快又好。
大多數(shù)人的程序沒(méi)有考慮并發(fā)問(wèn)題。一旦考慮了就得手工加鎖,效率很低。
數(shù)據(jù)可能繞過(guò)你的應(yīng)用程序進(jìn)入數(shù)據(jù)庫(kù)。
2. 性能問(wèn)題:難道你自己做就沒(méi)有開(kāi)銷?
一個(gè)外鍵判斷分?jǐn)偟绞聞?wù)級(jí)別,開(kāi)銷可以忽略,用戶完全沒(méi)有察覺(jué)。
如果是批量導(dǎo)入數(shù)據(jù),可以先暫時(shí)屏蔽外鍵,事后用NOVALIDATE選項(xiàng)快速恢復(fù),前提是你的數(shù)據(jù)是干凈的。
也有人提到了如果100張表可能需要建立300個(gè)約束,導(dǎo)致性能太差。
我要說(shuō)的仍然是,是否這300個(gè)外鍵約束都是業(yè)務(wù)必須的,如果是,沒(méi)有辦法這就是必須要加的,如果不是,那么大可不必在所有的地方都增加外鍵。
如果在程序中僅對(duì)其中的5、6張表的10來(lái)個(gè)外鍵約束進(jìn)行判斷,然后和數(shù)據(jù)庫(kù)中的300個(gè)外鍵去比較,并評(píng)價(jià)Oracle的外鍵性能太差,恐怕是有失公允的。
× 反對(duì)外鍵的:
的確外鍵在大系統(tǒng)中用的很少,在開(kāi)發(fā)初級(jí),設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候一般會(huì)加入外鍵,以保證系統(tǒng)設(shè)計(jì)的完整性和業(yè)務(wù)需求的完整性,也便于開(kāi)發(fā)人員了解業(yè)務(wù)規(guī)則,在程序中加以控制,很多大系統(tǒng)在系統(tǒng)穩(wěn)定后,會(huì)逐步將外鍵去掉,以保證性能,將太多的功能強(qiáng)加于數(shù)據(jù)庫(kù),雖然說(shuō)數(shù)據(jù)庫(kù)很強(qiáng)大,但是畢竟很多人不信任數(shù)據(jù)庫(kù)的能強(qiáng)大到什么都能干的地步。所以在一個(gè)大系統(tǒng)中外鍵見(jiàn)的少也不足為奇,小系統(tǒng)就無(wú)所謂了,用不用外鍵取決于設(shè)計(jì)人員,這樣的系統(tǒng)也隨處可見(jiàn)。
另引用一篇:
引自http://blog.csdn.net/neusoft_lkz/archive/2009/07/21/4366668.aspx
數(shù)據(jù)庫(kù)設(shè)計(jì)是否需要外鍵。這里有兩個(gè)問(wèn)題:一個(gè)是如何保證數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性和一致性;二是第一條對(duì)性能的影響。
正方觀點(diǎn):
1,由數(shù)據(jù)庫(kù)自身保證數(shù)據(jù)一致性,完整性,更可靠,因?yàn)槌绦蚝茈y100%保證數(shù)據(jù)的完整性,而用外鍵即使在數(shù)據(jù)庫(kù)服務(wù)器當(dāng)機(jī)或者出現(xiàn)其他問(wèn)題的時(shí)候,也能夠最大限度的保證數(shù)據(jù)的一致性和完整性。
eg:數(shù)據(jù)庫(kù)和應(yīng)用是一對(duì)多的關(guān)系,A應(yīng)用會(huì)維護(hù)他那部分?jǐn)?shù)據(jù)的完整性,系統(tǒng)一變大時(shí),增加了B應(yīng)用,A和B兩個(gè)應(yīng)用也許是不同的開(kāi)發(fā)團(tuán)隊(duì)來(lái)做的。他們?nèi)绾螀f(xié)調(diào)保證數(shù)據(jù)的完整性,而且一年以后如果又增加了C應(yīng)用呢?
2,有主外鍵的數(shù)據(jù)庫(kù)設(shè)計(jì)可以增加ER圖的可讀性,這點(diǎn)在數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)非常重要。
3,外鍵在一定程度上說(shuō)明的業(yè)務(wù)邏輯,會(huì)使設(shè)計(jì)周到具體全面。
反方觀點(diǎn):
1,可以用觸發(fā)器或應(yīng)用程序保證數(shù)據(jù)的完整性
2,過(guò)分強(qiáng)調(diào)或者說(shuō)使用主鍵/外鍵會(huì)平添開(kāi)發(fā)難度,導(dǎo)致表過(guò)多等問(wèn)題
3,不用外鍵時(shí)數(shù)據(jù)管理簡(jiǎn)單,操作方便,性能高(導(dǎo)入導(dǎo)出等操作,在insert, update, delete 數(shù)據(jù)的時(shí)候更快)
eg:在海量的數(shù)據(jù)庫(kù)中想都不要去想外鍵,試想,一個(gè)程序每天要insert數(shù)百萬(wàn)條記錄,當(dāng)存在外鍵約束的時(shí)候,每次要去掃描此記錄是否合格,一般還不止一個(gè)字段有外鍵,這樣掃描的數(shù)量是成級(jí)數(shù)的增長(zhǎng)!我的一個(gè)程序入庫(kù)在3個(gè)小時(shí)做完,如果加上外鍵,需要28個(gè)小時(shí)!
結(jié)論:
1,在大型系統(tǒng)中(性能要求不高,安全要求高),使用外鍵;在大型系統(tǒng)中(性能要求高,安全自己控制),不用外鍵;小系統(tǒng)隨便,最好用外鍵。
2,用外鍵要適當(dāng),不能過(guò)分追求
3,不用外鍵而用程序控制數(shù)據(jù)一致性和完整性時(shí),應(yīng)該寫一層來(lái)保證,然后個(gè)個(gè)應(yīng)用通過(guò)這個(gè)層來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。 |
|