在博客園上看到了一篇關(guān)于數(shù)據(jù)庫范式的文章《數(shù)據(jù)庫設(shè)計(jì)中的五個(gè)范式》:
第三范式規(guī)則查找以消除沒有直接依賴于第一范式和第二范式形成的表的主鍵的屬性。我們?yōu)闆]有與表的主鍵關(guān)聯(lián)的所有信息建立了一張新表。每張新表保存了來自源表的信息和它們所依賴的主鍵。
關(guān)于第三范式的思想,我想有很多朋友都熟悉,在數(shù)據(jù)庫設(shè)計(jì)時(shí),也是我們盡可能采用的范式之一,第三范式的出發(fā)點(diǎn)是什么?就是盡可能的減小“數(shù)據(jù)冗余”、并也能得到“數(shù)據(jù)”的整潔性,提高維護(hù)性,不容懷疑,第三范式是我們努力、必須要去遵從的。
然而,有很多朋友把第三范式作為“不死的法寶”,但其實(shí)在實(shí)際的應(yīng)用中,我們還是要從不同的業(yè)務(wù)出發(fā),要合理的應(yīng)用“第三范式”。下面我也就簡單的舉個(gè)例子:
一張訂單會關(guān)聯(lián)很多的基礎(chǔ)資料,如:客戶,付款條款,貨運(yùn)方式等,這些信息是有專門表進(jìn)行維護(hù)的,在下訂單時(shí)也是用下拉框選擇的,在保存訂單信息時(shí),按照“第三范式”的要求,那應(yīng)該只保存對應(yīng)的主鍵值就OK了。因?yàn)檫@樣可以避免數(shù)據(jù)冗余,但對我來說,我不會這樣做,我會把客戶的名稱、聯(lián)系電話、付款條款名稱等訂單上要求記錄的信息直接COPY到訂單的表中。
這樣看來,我們違背了“第三范式”,是的,但在這里,我們違背“第三范式”也是有理由的:
1我不想在訂單下達(dá)完以后,刪除了某條付款條款,導(dǎo)致這些訂單無法知道“真實(shí)的付款條款”了,這肯定不合理。
2我也不想,因?yàn)橄铝诉@張訂單了,而“嚴(yán)格控制”付款條款的“刪除”功能,這也不合理,憑啥不能刪除了?下個(gè)月這個(gè)“條款”確實(shí)永遠(yuǎn)不會采用了。
3我也不想,付款條款修改后,導(dǎo)致以前所有采用此付款條款的訂單都變成新的條款,那在系統(tǒng)中的訂單如何與手頭的紙張訂單再對應(yīng),這肯定也不合理。
所以,我的設(shè)計(jì)原則是,對于這種訂單我們應(yīng)該采用“隔離”的方式來對待,讓基礎(chǔ)數(shù)據(jù)COPY到訂單中,這當(dāng)然會違背所謂的“第三范式”,但這也是實(shí)際的需要啊。理論與實(shí)際是有差別的。
訂單--這種在現(xiàn)實(shí)中以實(shí)物的方式存在,實(shí)物具有與基礎(chǔ)數(shù)據(jù)的參考性,而不是關(guān)聯(lián)性,基礎(chǔ)數(shù)據(jù)只能是作為訂單這個(gè)實(shí)物的一個(gè)“參考”,而不是“關(guān)聯(lián)”,這可以稱為“獨(dú)立性”;再者,訂單具有一定的歷史性,因?yàn)槭菍?shí)物,在實(shí)際的過程中,是即時(shí)生成的,那么在生成的當(dāng)時(shí)去參考了基礎(chǔ)數(shù)據(jù),訂單就在當(dāng)時(shí)被確定,確對不能因?yàn)榛A(chǔ)數(shù)據(jù)的修改而導(dǎo)致訂單被“無辜變性”了,這也就是訂單的“歷史性”,當(dāng)以后翻閱這些紙張訂單時(shí)也能對應(yīng)上系統(tǒng)里的訂單。
這是我所理解的最典型的例子,在實(shí)際的系統(tǒng)設(shè)計(jì)中,我們應(yīng)該多思考一下,是不是要采用“第三范式”,不要再盲目追捧了。
以上純屬我個(gè)人意見,僅供參考,歡迎大家討論。
Feedback
#1樓 回復(fù) 引用 查看
2005-05-08 14:23 by
#2樓 回復(fù) 引用 查看
2005-05-08 14:25 by 嘿嘿
#3樓 回復(fù) 引用 查看
2005-05-08 14:39 by
#4樓 回復(fù) 引用 查看
2005-05-08 14:56 by
#5樓 回復(fù) 引用 查看
2005-05-08 15:07 by
#6樓 [樓主] 回復(fù) 引用 查看
2005-05-08 15:21 by
寒楓天傷 :
我覺得這也是指關(guān)聯(lián),因?yàn)槲覀円部梢圆捎玫谌妒絹韺?shí)現(xiàn),只是訂單在這種情況下會遇到好多的問題.
在訂單的設(shè)計(jì)中,我一般會有“條款ID”、“條款名稱”,也就是我會把主鍵對應(yīng)上以后,把Name也帶過來,之所以要帶入"條款ID",主要還是因?yàn)橛唵涡枰薷模谛薷臅r(shí),可以默認(rèn)選中原來的值。而“條款名稱”的帶入就是我前面的說的原因。
因此,從這一點(diǎn)來說,這些確實(shí)是違背了“第三范式”。
#7樓 回復(fù) 引用 查看
2005-05-08 18:17 by lay
#8樓 回復(fù) 引用 查看
2005-05-08 18:58 by
我不想在訂單下達(dá)完以后,刪除了某條付款條款,導(dǎo)致這些訂單無法知道“真實(shí)的付款條款”了,這肯定不合理。
==為何要允許刪除付款條件?不可以設(shè)為失效嗎?
2我也不想,因?yàn)橄铝诉@張訂單了,而“嚴(yán)格控制”付款條款的“刪除”功能,這也不合理,憑啥不能刪除了?下個(gè)月這個(gè)“條款”確實(shí)永遠(yuǎn)不會采用了。
==不能刪除就是不能刪除,規(guī)定下來不可以嗎?同樣,設(shè)為失效不行嗎?
3我也不想,付款條款修改后,導(dǎo)致以前所有采用此付款條款的訂單都變成新的條款,那在系統(tǒng)中的訂單如何與手頭的紙張訂單再對應(yīng),這肯定也不合理。
==付款條件可以隨意修改的嗎?同樣,需要修改的不可以新建一個(gè)條件嗎?
我認(rèn)為,你的數(shù)據(jù)庫這樣設(shè)計(jì)是非常不成功的。就因?yàn)槟闵厦娴睦碛删驮斐沙汕先f條記錄的冗余?這合理嗎?
一已之見,只承擔(dān)有限責(zé)任。。。
#9樓 回復(fù) 引用 查看
2005-05-08 19:26 by
#10樓 回復(fù) 引用 查看
2005-05-08 20:12 by
#11樓 回復(fù) 引用 查看
2005-05-08 20:29 by 一川煙草
#12樓 回復(fù) 引用 查看
2005-05-08 20:36 by 一川煙草
#13樓 [樓主] 回復(fù) 引用 查看
2005-05-08 21:27 by
上山砍柴去 :
其實(shí)我非常不想跟你討論這些問題,你說的幾個(gè)跟我的意思根本不是一回事。你可以用“是否有效”來實(shí)現(xiàn),你的意思是所有的基礎(chǔ)都有“是否有效”,可客戶就是不喜歡這種“是否有效”的標(biāo)志,"是否有效"是在客戶"暫時(shí)不用"的情況下會采用,知道什么叫"暫時(shí)"嗎?再者,時(shí)間一長你搞那么多"無效"的多惡心啊。
還有我說的就是能允許客戶刪除,你憑什么不讓客戶刪除,你以為這是給客戶考慮嗎?
自己去悟吧。
#14樓 回復(fù) 引用 查看
2005-05-08 21:52 by rIPPER
#15樓 回復(fù) 引用 查看
2005-05-08 22:10 by 一川煙草
#16樓 [樓主] 回復(fù) 引用 查看
2005-05-08 22:25 by
#17樓 回復(fù) 引用 查看
2005-05-08 22:40 by
#18樓 回復(fù) 引用 查看
2005-05-08 23:01 by
#19樓 回復(fù) 引用 查看
2005-05-09 00:12 by
個(gè)人意見,在數(shù)據(jù)庫里只添加新規(guī)則,不能改變已有規(guī)則,任何改動都視作新添加,這樣就能實(shí)現(xiàn)第三點(diǎn)了。不過這樣的數(shù)據(jù)也。。。
#20樓 回復(fù) 引用 查看
2005-05-09 00:57 by
#21樓 回復(fù) 引用 查看
2005-05-09 08:56 by
#22樓 [樓主] 回復(fù) 引用 查看
2005-05-09 09:15 by
老翅寒暑 :
我說的就是你指的意思,一張訂單已經(jīng)確定,那么具有獨(dú)立性與歷史性。
@ 上山砍柴去 :
客戶說是保留,那你當(dāng)然保留好了,我沒有否認(rèn)這一點(diǎn)啊,但就怕客戶說不要保留,你卻偏偏要保留啊。至于數(shù)據(jù)冗余你看下面的。
至于“為什么還要ID呢?”就是有可能會進(jìn)行修改,那么如果不帶ID過去,修改時(shí)如何選中默認(rèn)值,要是不能默認(rèn)選中,結(jié)果客戶修改只是為了修改其它的一個(gè)屬性,而這個(gè)ID可能會在不注意的情況下被修改掉了。因?yàn)槭窍吕虻摹?span lang="EN-US">
至于作標(biāo)記,也是一種方式,比如客戶說給作個(gè)標(biāo)記或者是此值是應(yīng)該具有“暫時(shí)不用”的情況,那么用標(biāo)識當(dāng)然是最好的。
就像老翅寒暑 說的,一張訂單是實(shí)物,在業(yè)務(wù)實(shí)際中明明確確存在,要是從法律上講也具有法律,就算沒有法律性,我們也要把它視為一個(gè)獨(dú)立性,有朋友說,以后修改怎么辦?一張訂單在當(dāng)時(shí)下達(dá),就具有當(dāng)時(shí)的即時(shí)性與歷史性,不可能因?yàn)槟阋院蟮幕A(chǔ)數(shù)據(jù)的修改而導(dǎo)致訂單失去原來的屬性,因此這些所謂的“冗余”只是從"第三范式"上講的,而在實(shí)際的業(yè)務(wù)中,其實(shí)沒有所謂的“冗余”。
#23樓 回復(fù) 引用 查看
2005-05-09 09:39 by na
#24樓 回復(fù) 引用 查看
2005-05-09 09:41 by
作為基礎(chǔ)數(shù)據(jù),修改和刪除的權(quán)限都是比較高的,特別是這種有關(guān)聯(lián)其它數(shù)據(jù)的基礎(chǔ)數(shù)據(jù),使用后更是不能隨意修改和刪除的,這在系統(tǒng)一級就應(yīng)該予以禁止。系統(tǒng)級不能解決的,就要在管理一級予以解決。
如果依你這樣的設(shè)計(jì),那么其它的基礎(chǔ)數(shù)據(jù)不都要帶進(jìn)別的表中去?產(chǎn)品數(shù)據(jù),供貨商數(shù)據(jù),客戶數(shù)據(jù),。。。。等等等等。你這樣的數(shù)據(jù)設(shè)計(jì)有你認(rèn)為是成功的嗎?
你認(rèn)為沒法跟我說,至少你覺得說服我有難度,我認(rèn)為你這樣的觀念去做需求分析肯定是失敗的。最終出來的產(chǎn)品也肯定是個(gè)N不像產(chǎn)品。懂系統(tǒng)設(shè)計(jì)沒什么也不起,隨便找?guī)讉€(gè)人來都會做。反正都是客戶說了算。出了錯(cuò)也是客戶自已找的。
#25樓 回復(fù) 引用 查看
2005-05-09 09:56 by
#26樓 [樓主] 回復(fù) 引用 查看
2005-05-09 10:20 by
小陸 :
ID可以考慮不保留,確實(shí)可以直接修改NAME,因?yàn)閺哪撤N意義上說,參考的數(shù)據(jù)COPY過來后,就認(rèn)為已經(jīng)確定了。
至于刪除的控制,有些基礎(chǔ)數(shù)據(jù)是需要使用“控制來限制的”,但不是全部。為何有人不思考實(shí)際中的一些差別呢。
na說有很多要隔離??也不是啊,具有獨(dú)立性與歷史性的實(shí)物,是建議要隔離的。
上山砍柴去說這么多人都是沒有經(jīng)驗(yàn)的??
我真不知道,是不是很有經(jīng)驗(yàn)的人跟你一樣,所有的基礎(chǔ)數(shù)據(jù)都采用“刪除控制”來做的,你可以去調(diào)查一下。
#27樓 回復(fù) 引用 查看
2005-05-09 10:37 by ayya__@hotmail.com
#28樓 [樓主] 回復(fù) 引用 查看
2005-05-09 10:41 by
對,如果那些需要“暫時(shí)”不用的,是應(yīng)該要用標(biāo)記來做的。應(yīng)該可以修改狀態(tài),也可以刪除吧,要是他們確實(shí)想刪除。
其實(shí)這種刪除不刪除無所謂了,問題是基礎(chǔ)數(shù)據(jù)應(yīng)該COPY過去。
#29樓 回復(fù) 引用 查看
2005-05-09 10:59 by
#30樓 回復(fù) 引用 查看
2005-05-09 11:02 by
,一個(gè)表里的字段數(shù)如果太多,你說有沒有問題,比如有張表TestTable,里面包含了60多個(gè)字段,你認(rèn)為這有不有問題?
#31樓 回復(fù) 引用 查看
2005-05-09 11:05 by
#32樓 [樓主] 回復(fù) 引用 查看
2005-05-09 11:15 by
#33樓 回復(fù) 引用 查看
2005-05-09 14:50 by
#34樓 回復(fù) 引用 查看
2005-05-09 15:30 by step
#35樓 [樓主] 回復(fù) 引用 查看
2005-05-09 15:38 by
你的觀點(diǎn)跟我們大致一樣,只是你可能沒搞清楚什么叫“付款條款”,英文名叫“Payment Term”,它不是一個(gè)2000字的協(xié)議,只是說明30天付款還是60天付款。
給你看個(gè)圖:

#36樓 回復(fù) 引用 查看
2005-05-09 16:46 by rIPPER
的 term在這里翻譯作條款,還要搞清楚?
term
n.
1.
A. A limited period of time.
B. A period of time that is assigned to a person to serve: a six-year term as senator. See Synonyms at period.
C. A period when a school or court is in session.
2.
以下略 ...
你們那兒做l10n的太爛了,趕快建議老板辭掉他 :)
#37樓 [樓主] 回復(fù) 引用 查看
2005-05-09 17:08 by
老兄,在SAP里全都翻譯成“付款條款”的!!
你查了查字典就以為可以想翻什么就翻什么嗎?
不了解ERP也不至于要把老板炒了吧???
早知道我就把文章寫成Payment Term了,那估計(jì)你肯定知道是什么意思了。哦,你不信的話用Google搜一下吧。
#38樓 回復(fù) 引用 查看
2005-05-09 18:35 by james wong
各人應(yīng)用的環(huán)境不一樣,各人的經(jīng)驗(yàn)也不一樣。干嘛爭來爭去的?哪個(gè)你用好了沒問題就是對的,否則就是錯(cuò)的。別人是對的你拿過來不一定是對的,別人是錯(cuò)的也不一定在你那里就也是錯(cuò)的。既然別人是對的你也不一定是對的,別人是錯(cuò)的你也不一定是錯(cuò)的,那這個(gè)問題也就是不對不錯(cuò)的。那么,那么還要討論誰對誰錯(cuò)做什么呢??
打雷了。。下雨了。。。大家快收衣服啊。。。
#39樓 回復(fù) 引用 查看
2005-05-09 19:17 by
#40樓 回復(fù) 引用 查看
2005-05-09 19:39 by rIPPER
#41樓 回復(fù) 引用 查看
2005-05-09 20:49 by
有道理喲,想問一下,一個(gè)表里的字段數(shù)如果太多,你說有沒有問題,比如有張表TestTable,里面包含了60多個(gè)字段,你認(rèn)為這有不有問題?"
字段多不是問題,你可以去看看SPS的數(shù)據(jù)表Userdata,微軟為每一種數(shù)據(jù)類型預(yù)留了64個(gè)字段,該表的字段數(shù)超過300個(gè),記錄數(shù)在100萬條以上,也沒有見嚴(yán)重影響性能.
很多時(shí)候,數(shù)據(jù)冗余是提升性能最有效的方法,特別是三個(gè)以上的表間聯(lián)接,通過數(shù)據(jù)冗余來改善性能是非常明顯的,同時(shí)也減小了SQL的復(fù)雜度.
#42樓 回復(fù) 引用 查看
2005-05-09 21:33 by 一川煙草
#43樓 回復(fù) 引用 查看
2005-05-09 21:42 by
#44樓 [樓主] 回復(fù) 引用 查看
2005-05-09 22:29 by
小陸 :
現(xiàn)在我現(xiàn)在討論根本不是指你說的冗余,我所指的這種冗余是必須,根本不需要同步不同步的。因?yàn)橛唵蔚哪切┬畔⒕哂袣v史性。從一點(diǎn)上來說,你說的冗余是另一回事。
#45樓 回復(fù) 引用 查看
2005-05-12 11:42 by 平常
我不想在訂單下達(dá)完以后,刪除了某條付款條款,導(dǎo)致這些訂單無法知道“真實(shí)的付款條款”了,這肯定不合理。
2我也不想,因?yàn)橄铝诉@張訂單了,而“嚴(yán)格控制”付款條款的“刪除”功能,這也不合理,憑啥不能刪除了?下個(gè)月這個(gè)“條款”確實(shí)永遠(yuǎn)不會采用了。
3我也不想,付款條款修改后,導(dǎo)致以前所有采用此付款條款的訂單都變成新的條款,那在系統(tǒng)中的訂單如何與手頭的紙張訂單再對應(yīng),這肯定也不合理。
參照(Reference)
參照在數(shù)據(jù)庫設(shè)計(jì)中是一個(gè)比較復(fù)雜的問題,它是實(shí)現(xiàn)數(shù)據(jù)的完整性主要要素之一,詳細(xì)論述參考后面數(shù)據(jù)的約束。
在PowerDesigner中,可對參照完整性進(jìn)行各項(xiàng)設(shè)置,參照的基數(shù)從0到n,對修改和刪除約束可分別設(shè)置為None、Restrict、Cascade、Set Null、Set Default。由于INSERT包含在UPDATE操作中,因此沒有單獨(dú)的INSERT約束。
約束的不同設(shè)置產(chǎn)生不同的效果,以修改為例(刪除相同):
None:父表修改,子表不影響。
Restrict:父表修改,如果子表存在,則出錯(cuò)。
Cascade:父表修改,如果子表存在,則相應(yīng)的修改。
Set Null:父表修改,如果子表存在,則相應(yīng)置空。
Set Default:父表修改,如果子表存在,則相應(yīng)置默認(rèn)值。
#46樓 回復(fù) 引用 查看
2005-05-12 11:50 by 平常
◆ 表域完整性
通過主鍵來強(qiáng)制表的域完整性。
◆ 引用完整性
利用參照來加強(qiáng)表之間的邏輯關(guān)系。
◆ 數(shù)值域完整性
任何輸入的數(shù)據(jù)在類型和范圍上必須與指定的數(shù)據(jù)類型相匹配,只有當(dāng)某列被說明允許NULL值,才允許向該列輸入NULL。
數(shù)據(jù)庫的性能測試
生成數(shù)據(jù)庫之后,應(yīng)進(jìn)行數(shù)據(jù)庫性能測試,以便優(yōu)化數(shù)據(jù)庫的設(shè)計(jì),因此需要生成測試數(shù)據(jù),由于是性能測試,數(shù)據(jù)的規(guī)范性要求不高。通過PowerDesigner可方便地生成測試數(shù)據(jù)(Generate Test Data),完成性能測試。
數(shù)據(jù)的約束
O-O約束
對父表的INSERT、UPDATE、DELETE操作沒有限制。
M-O約束
對父表操作的約束:
父表的INSERT操作,對M-O約束,父表中間的記錄可以沒有任何約束地添加到表中,因?yàn)檫@種約束中不一定必須有子女。
父表的鍵值修改操作,只有在子表中其所有的子女對應(yīng)均做修改后,才能修改,即一般采用級聯(lián)更新的方法。
父表的刪除,父親只有在其所有子女均被刪除或重新分配之后該父親才能被刪除。
強(qiáng)制對可選(M-O)約束
O-M約束
父表操作的約束:
父表的INSERT操作,對O-M約束,一個(gè)父親只有當(dāng)至少當(dāng)它的一個(gè)、子女同時(shí)被加入或至少存在一個(gè)合法的子女時(shí),才能被加入。
父表的鍵值修改操作,只有當(dāng)一個(gè)子女被創(chuàng)建或已經(jīng)有一名子女存在才行。
父表的刪除,理論上刪除父親是沒有限制的,實(shí)際上,刪除主表記錄時(shí),不采用級聯(lián)刪除子表的方案,而采用將子表的外鍵置空。
可選對強(qiáng)制(O-M)約束
M-M約束
父表操作的約束:
父表的INSERT操作,可能隨后需要生成子女,即在子表中創(chuàng)建新的行。也可能通過對子表的重新分配來實(shí)施完整行限制。
父表的鍵值修改操作,只有在子表對應(yīng)的外鍵的值修改成新值時(shí)才能進(jìn)行。實(shí)際可能是先創(chuàng)建新的父表紀(jì)錄,接著修改子表所有對應(yīng)的紀(jì)錄,使其與父表的新紀(jì)錄關(guān)聯(lián),最后刪除原父表紀(jì)錄。
父表的刪除,只有在子表中所有相關(guān)的行全部刪除或重新分配之后,才能刪除父表中的紀(jì)錄,一般對子表也進(jìn)行刪除操作。
強(qiáng)制對強(qiáng)制(M-M)約束
在四類約束:M-M、M-O、O-M、O-O。鍵值的修改可能會改變表之間的關(guān)系,而且可能違反一些約束。違反約束的操作是不允許的。具體的應(yīng)用必須根據(jù)實(shí)際的要求和商業(yè)規(guī)則進(jìn)行適當(dāng)?shù)倪x擇。但在設(shè)計(jì)和開發(fā)時(shí),必須考慮所分析的約束。
#47樓 回復(fù) 引用 查看
2005-05-13 01:26 by magic007
、要看開發(fā)的這個(gè)系統(tǒng)是個(gè)什么樣的系統(tǒng),僅僅是一個(gè)OLTP系統(tǒng),或者還要在系統(tǒng)上進(jìn)行數(shù)據(jù)分析和數(shù)據(jù)挖掘。如果僅僅是一個(gè)事務(wù)處理系統(tǒng),則以樓主所說的做法,行得通,否則的話,最好不要那樣做。
2、以我的經(jīng)驗(yàn),數(shù)據(jù)冗余在開發(fā)上更方便一點(diǎn),效率可能會高一點(diǎn),但是后期可維護(hù)性和擴(kuò)展性是比較差的。
3、關(guān)系數(shù)據(jù)庫一個(gè)核心的理念應(yīng)該就是“關(guān)系”了,數(shù)據(jù)關(guān)系。設(shè)計(jì)數(shù)據(jù)庫,準(zhǔn)確的說是設(shè)計(jì)數(shù)據(jù)模型,一是保證整個(gè)數(shù)據(jù)模型具有良好的擴(kuò)展性,也就是說為以后業(yè)務(wù)的發(fā)展,需求的變化提供足夠的可擴(kuò)展性。開發(fā)的方便來說應(yīng)該是次要的,無非就是多點(diǎn)編碼。
4、在樓主的例子中,我從數(shù)據(jù)關(guān)系上談一下,訂單與客戶之間是很強(qiáng)的耦合關(guān)系,沒有客戶,那么訂單就沒有存在的意義。所以肯定是需要主外鍵關(guān)聯(lián)的。對于“付款條款”,在業(yè)務(wù)領(lǐng)域內(nèi),對于訂單來說是必須具備的,那么也需要主外健關(guān)聯(lián)。比如客戶有同名的情況,怎么標(biāo)識多張相同客戶名的訂單是同一客戶還是不同的客戶?客戶改名了,如何標(biāo)識改名前的訂單和改名后的訂單是同一張訂單?為了避免在客戶改名后,改名前的訂單的客戶名變成新的客戶名,可以在客戶表中建立組合主鍵,如cust_id與cust_seq_id。
#48樓 回復(fù) 引用 查看
2005-06-04 17:27 by
#49樓 回復(fù) 引用 查看
2005-06-07 21:45 by shewo
#50樓 [樓主] 回復(fù) 引用 查看
2005-06-08 08:20 by
:
老兄啊。你怎么還在講這個(gè)理論呢,前面的回復(fù)你看了嗎?我文章的主要目的就是寫給你這樣的人看的。
一般的人都是以為這樣想的,這個(gè)誰都知道,我的文章中也指出了,對于象訂單這種客觀存在的東西,不能死板的搬那種理論。
你說的這種數(shù)據(jù)不一致,你覺得需要保持嗎?已經(jīng)成為歷史的訂單,你認(rèn)為以后因?yàn)榛緮?shù)據(jù)的修改,需要全部修改進(jìn)去嗎?那么歷史訂單怎么辦??客戶會把已經(jīng)完成的訂單存檔作為備案,你的意思是客戶還要把以前的訂單找出來一個(gè)個(gè)修改。。最好再理解一下我文章的意思。真沒想到,你什么也沒看懂。
#51樓 回復(fù) 引用 查看
2005-06-13 13:20 by skyworht
#52樓 回復(fù) 引用 查看
2005-06-13 21:01 by
#53樓 回復(fù) 引用 查看
2005-07-01 23:15 by min
#54樓 回復(fù) 引用
2005-08-04 15:54 by tx-zero [未注冊用戶]
#55樓 回復(fù) 引用 查看
2005-08-05 17:46 by
#56樓 回復(fù) 引用
2005-08-15 16:08 by nwc [未注冊用戶]
#57樓 回復(fù) 引用
2005-08-15 16:39 by nwc [未注冊用戶]
#58樓 回復(fù) 引用
2005-09-28 11:01 by 榴彈炮 [未注冊用戶]
#59樓 回復(fù) 引用
2005-09-28 12:45 by luckcp [未注冊用戶]
#60樓 回復(fù) 引用 查看
2005-11-08 23:37 by
#61樓 回復(fù) 引用 查看
2006-05-07 17:22 by
只要抽象出歷史版本的概念,就可以解決樓主所說的問題,并且可以不違反3nf。
歸根結(jié)底,還是樓主對業(yè)務(wù)的概念抽象得不對,不是3nf的問題。
對于類似的問題,都可以通過引入歷史版本的問題。在設(shè)計(jì)的時(shí)候就要考慮是引用對象本身,還是引用對象的歷史版本,不要把概念搞錯(cuò)了,更不要以此來懷疑3nf。
#62樓 回復(fù) 引用
2007-01-30 16:16 by 雨恨云愁 [未注冊用戶]
#63樓 回復(fù) 引用
2007-08-28 09:30 by zhanglin [未注冊用戶]
#64樓 回復(fù) 引用
2008-06-04 02:58 by solidco2 [未注冊用戶]
認(rèn)為這條記錄并沒有消失,只是你無法找回了。
扯多了,我確實(shí)同意你的結(jié)論,不得不違背范式,滿足范式的表會很羅索。倒庫的方法我其實(shí)用的不多,更多的是“啟用”字段,或者狀態(tài)字段。
--------------------------------------------------
嘿嘿: 范式原則是用于指導(dǎo)性地設(shè)計(jì)數(shù)據(jù)的存儲結(jié)構(gòu)的,僅僅只是理論。必要的時(shí)候是需要反范式,或者容忍一定的數(shù)據(jù)冗余,使得系統(tǒng)的性能或邏輯清晰性上更好。
范式是一種基于純粹的從數(shù)據(jù)存儲量上來優(yōu)化數(shù)據(jù)結(jié)構(gòu)的方式,并不是一個(gè)非常通用的東西。
另外:
“1我不想在訂單下達(dá)完以后,刪除了某條付款條款,導(dǎo)致這些訂單無法知道“真實(shí)的付款條款”了,這肯定不合理。
2 我也不想,因?yàn)橄铝诉@張訂單了,而“嚴(yán)格控制”付款條款的“刪除”功能,這也不合理,憑啥不能刪除了?下個(gè)月這個(gè)“條款”確實(shí)永遠(yuǎn)不會采用了。”
上述情況,實(shí)際上可以考慮采用倉庫性質(zhì)的數(shù)據(jù)管理方法:即,對于所有的數(shù)據(jù),分為可用與不可用,放在不同的表間,然后可以把其中的數(shù)據(jù)挪來挪去。
你說的情況非常現(xiàn)實(shí),從業(yè)務(wù)角度出發(fā),將數(shù)據(jù)結(jié)構(gòu)優(yōu)化為最高存儲效率的是沒有意義的,范式更多是一種指導(dǎo),而不是原則。
--------------------------------------------------------
#65樓 回復(fù) 引用
2008-06-04 03:32 by 還是上面那個(gè)人 [未注冊用戶]
#66樓 回復(fù) 引用
2008-12-11 17:30 by 用版本控制來解決 [未注冊用戶]
只要抽象出歷史版本的概念,就可以解決樓主所說的問題,并且可以不違反3nf。
歸根結(jié)底,還是樓主對業(yè)務(wù)的概念抽象得不對,不是3nf的問題。
對于類似的問題,都可以通過引入歷史版本的問題。在設(shè)計(jì)的時(shí)候就要考慮是引用對象本身,還是引用對象的歷史版本,不要把概念搞錯(cuò)了,更不要以此來懷疑3nf。”
=====================
其實(shí)這就和我們用cvs或subversion等版本控制系統(tǒng)一樣,應(yīng)該讓客戶表成為一個(gè)時(shí)間機(jī)器,只能進(jìn)行查詢和新增操作,而不可能進(jìn)行真正的刪除和修改操作,我的解決方案是對客戶表加三個(gè)字段:ID(Int類型),SerialID(自增,標(biāo)記版本),deletemark(boolean),對客戶表的修改就是新增一條ID相同的記錄,SerialID不同以反映版本,刪除就是標(biāo)記對應(yīng)ID的deletemark字段。
以上方案可以完美的解決樓主提出的問題,邏輯自洽且不違反范式要求。
同時(shí)也能解決
======================
一個(gè)公司在04年叫“河北科技有限公司”開始下訂單。記錄了。05年改名為“北方科技有限公司”,繼續(xù)下訂單。他們是一個(gè)公司嗎?查找這個(gè)公司的全部訂單怎么辦?
那就是還要記錄一個(gè)營業(yè)執(zhí)照號碼。這個(gè)營業(yè)執(zhí)照和ID就是等同地位了,為什么不用ID做一個(gè)唯一索引
======================
的問題,因?yàn)?span lang="EN-US">ID不變。
大家以為如何?