是否應(yīng)該建外鍵的討論
Posted on 2008-04-14 20:44 leekiang 閱讀(1236) 評(píng)論(0) 編輯 收藏 所屬分類: 架構(gòu)設(shè)計(jì)
http://www.javaeye.com/topic/124612
http://www.javaeye.com/topic/2832
http://www.javaeye.com/topic/8283
http://www.javaeye.com/topic/151187
http://www.javaeye.com/topic/2312
http://www.itpub.net/viewthread.php?tid=510215&extra=&page=1
以下摘幾個(gè)我自己認(rèn)同的觀點(diǎn):
1, 其實(shí)有一段時(shí)間我們的開發(fā)人員也有這種想法,以為程序可以控制好
后來(lái)發(fā)現(xiàn)沒(méi)有外鍵的表里經(jīng)常有垃圾數(shù)據(jù)(找不到父親的孩子),然后又把外鍵一一加上去,后面測(cè)試才發(fā)現(xiàn)是應(yīng)用的BUG,在特定情況下才會(huì)發(fā)生的BUG。
如果沒(méi)有外鍵那數(shù)據(jù)庫(kù)就不會(huì)報(bào)錯(cuò),也就是說(shuō)垃圾數(shù)據(jù)不能阻止。
2,在復(fù)雜的業(yè)務(wù)邏輯下,程序來(lái)保證這個(gè)是極不可靠的,只有交給數(shù)據(jù)庫(kù)從底層來(lái)保證才能避免出錯(cuò)。
當(dāng)然,如果是穩(wěn)定的程序中把外鍵去掉會(huì)怎么樣,這又是另一回事了。
外鍵的存在對(duì)數(shù)據(jù)庫(kù)的維護(hù)來(lái)說(shuō)是有一些不方便的地方。
3,我們以前做開發(fā)的時(shí)候,在開發(fā)、測(cè)試階段,是所有業(yè)務(wù)邏輯需要的外鍵都加上的。數(shù)據(jù)量小,并發(fā)少,也無(wú)所謂什么性能什么的。等測(cè)試和試運(yùn)行一段時(shí)間后,再將外鍵去掉,以提高性能。
4,怎么這么多人不用外鍵的,外鍵可是邏輯的約束啊!說(shuō)外鍵影響性能,可以denormalize外鍵表啊,但是插入更新必須要符合約束啊,我覺(jué)得這是不可替代的啊
對(duì)數(shù)據(jù)的約束最好盡可能放到db里,集中管理清晰準(zhǔn)確,以前吃過(guò)應(yīng)用管理約束的虧,不過(guò)好好看看oracle sap這些范式做的都還不錯(cuò)啊,他們都這樣做我想多少能說(shuō)明點(diǎn)問(wèn)題吧
5,你看看oracle系統(tǒng)數(shù)據(jù)表的設(shè)計(jì),再看看大型數(shù)據(jù)庫(kù)表的設(shè)計(jì),
你就明白,外鍵約束無(wú)處不在.
6,該用的地方,就一定要用!前幾天我們的應(yīng)用程序發(fā)現(xiàn)一個(gè)bug,后來(lái)我仔細(xì)一查,就是由于沒(méi)有使用外建,數(shù)據(jù)不匹配導(dǎo)致的。教訓(xùn)深刻!
7,如果現(xiàn)在要我來(lái)選擇,我決定是要用的一定要用,這是系統(tǒng)設(shè)計(jì)的嚴(yán)謹(jǐn)性的要求,不然產(chǎn)生一堆垃圾數(shù)據(jù),這是在一個(gè)好的系統(tǒng)中是不允許的。
8,呵呵,做過(guò)開發(fā)的DBA應(yīng)該都會(huì)有這樣的體會(huì)
當(dāng)統(tǒng)計(jì)報(bào)表中的數(shù)據(jù)不對(duì)的時(shí)候就知道什么叫問(wèn)題嚴(yán)重了,要一點(diǎn)點(diǎn)數(shù)據(jù)去核查。
9,最好還是使用數(shù)據(jù)庫(kù)外鍵這個(gè)最直觀的功能吧
至于性能不知有沒(méi)有什么測(cè)試數(shù)據(jù),究竟能慢到什么程度,不要聽說(shuō)會(huì)慢就不用吧(呵呵,從TOM的書里學(xué)到的)
10,這要看是建立那中類型的數(shù)據(jù)庫(kù)了
如果是操作類型的數(shù)據(jù)庫(kù) OLTP 面向應(yīng)用的
數(shù)據(jù)的規(guī)范化是很有必要的.. 該用外鍵的情況一定要用.
如果是面向部門 用于OLAP或建立數(shù)據(jù)倉(cāng)庫(kù).
這種時(shí)候 往往需要反規(guī)范化 存取效率是首要因素
我自己的結(jié)論:如果是做企業(yè)級(jí)的OLTP應(yīng)用,并且數(shù)據(jù)量不是非常大的話,一定要建外鍵。畢竟對(duì)于企業(yè)來(lái)說(shuō),保證數(shù)據(jù)的正確性是最重要的。但如果經(jīng)過(guò)長(zhǎng)時(shí)間的運(yùn)行證明代碼可靠、并且數(shù)據(jù)量已經(jīng)很大,這時(shí)也可以去掉外鍵以提高運(yùn)行速度。
http://www.javaeye.com/topic/2832
http://www.javaeye.com/topic/8283
http://www.javaeye.com/topic/151187
http://www.javaeye.com/topic/2312
http://www.itpub.net/viewthread.php?tid=510215&extra=&page=1
以下摘幾個(gè)我自己認(rèn)同的觀點(diǎn):
1, 其實(shí)有一段時(shí)間我們的開發(fā)人員也有這種想法,以為程序可以控制好
后來(lái)發(fā)現(xiàn)沒(méi)有外鍵的表里經(jīng)常有垃圾數(shù)據(jù)(找不到父親的孩子),然后又把外鍵一一加上去,后面測(cè)試才發(fā)現(xiàn)是應(yīng)用的BUG,在特定情況下才會(huì)發(fā)生的BUG。
如果沒(méi)有外鍵那數(shù)據(jù)庫(kù)就不會(huì)報(bào)錯(cuò),也就是說(shuō)垃圾數(shù)據(jù)不能阻止。
2,在復(fù)雜的業(yè)務(wù)邏輯下,程序來(lái)保證這個(gè)是極不可靠的,只有交給數(shù)據(jù)庫(kù)從底層來(lái)保證才能避免出錯(cuò)。
當(dāng)然,如果是穩(wěn)定的程序中把外鍵去掉會(huì)怎么樣,這又是另一回事了。
外鍵的存在對(duì)數(shù)據(jù)庫(kù)的維護(hù)來(lái)說(shuō)是有一些不方便的地方。
3,我們以前做開發(fā)的時(shí)候,在開發(fā)、測(cè)試階段,是所有業(yè)務(wù)邏輯需要的外鍵都加上的。數(shù)據(jù)量小,并發(fā)少,也無(wú)所謂什么性能什么的。等測(cè)試和試運(yùn)行一段時(shí)間后,再將外鍵去掉,以提高性能。
4,怎么這么多人不用外鍵的,外鍵可是邏輯的約束啊!說(shuō)外鍵影響性能,可以denormalize外鍵表啊,但是插入更新必須要符合約束啊,我覺(jué)得這是不可替代的啊
對(duì)數(shù)據(jù)的約束最好盡可能放到db里,集中管理清晰準(zhǔn)確,以前吃過(guò)應(yīng)用管理約束的虧,不過(guò)好好看看oracle sap這些范式做的都還不錯(cuò)啊,他們都這樣做我想多少能說(shuō)明點(diǎn)問(wèn)題吧
5,你看看oracle系統(tǒng)數(shù)據(jù)表的設(shè)計(jì),再看看大型數(shù)據(jù)庫(kù)表的設(shè)計(jì),
你就明白,外鍵約束無(wú)處不在.
6,該用的地方,就一定要用!前幾天我們的應(yīng)用程序發(fā)現(xiàn)一個(gè)bug,后來(lái)我仔細(xì)一查,就是由于沒(méi)有使用外建,數(shù)據(jù)不匹配導(dǎo)致的。教訓(xùn)深刻!
7,如果現(xiàn)在要我來(lái)選擇,我決定是要用的一定要用,這是系統(tǒng)設(shè)計(jì)的嚴(yán)謹(jǐn)性的要求,不然產(chǎn)生一堆垃圾數(shù)據(jù),這是在一個(gè)好的系統(tǒng)中是不允許的。
8,呵呵,做過(guò)開發(fā)的DBA應(yīng)該都會(huì)有這樣的體會(huì)
當(dāng)統(tǒng)計(jì)報(bào)表中的數(shù)據(jù)不對(duì)的時(shí)候就知道什么叫問(wèn)題嚴(yán)重了,要一點(diǎn)點(diǎn)數(shù)據(jù)去核查。
9,最好還是使用數(shù)據(jù)庫(kù)外鍵這個(gè)最直觀的功能吧
至于性能不知有沒(méi)有什么測(cè)試數(shù)據(jù),究竟能慢到什么程度,不要聽說(shuō)會(huì)慢就不用吧(呵呵,從TOM的書里學(xué)到的)
10,這要看是建立那中類型的數(shù)據(jù)庫(kù)了
如果是操作類型的數(shù)據(jù)庫(kù) OLTP 面向應(yīng)用的
數(shù)據(jù)的規(guī)范化是很有必要的.. 該用外鍵的情況一定要用.
如果是面向部門 用于OLAP或建立數(shù)據(jù)倉(cāng)庫(kù).
這種時(shí)候 往往需要反規(guī)范化 存取效率是首要因素
我自己的結(jié)論:如果是做企業(yè)級(jí)的OLTP應(yīng)用,并且數(shù)據(jù)量不是非常大的話,一定要建外鍵。畢竟對(duì)于企業(yè)來(lái)說(shuō),保證數(shù)據(jù)的正確性是最重要的。但如果經(jīng)過(guò)長(zhǎng)時(shí)間的運(yùn)行證明代碼可靠、并且數(shù)據(jù)量已經(jīng)很大,這時(shí)也可以去掉外鍵以提高運(yùn)行速度。