全面解析關(guān)系數(shù)據(jù)模型存在的不足之處
導(dǎo)讀:關(guān)系數(shù)據(jù)模型的存在推動(dòng)了數(shù)據(jù)庫(kù)技術(shù)的發(fā)展,關(guān)系數(shù)據(jù)模型有很多的優(yōu)點(diǎn),關(guān)系數(shù)據(jù)庫(kù)以其完備的理論基礎(chǔ)、簡(jiǎn)單的模型、說(shuō)明性的查詢語(yǔ)言和使用方便等優(yōu)點(diǎn)得到了最廣泛的應(yīng)用,盡管如此,關(guān)系數(shù)據(jù)模型仍然存在著一些不足之處。下面就一一為大家例舉。
一.對(duì)“現(xiàn)實(shí)世界”實(shí)體的表達(dá)能力比較弱
規(guī)范化通常導(dǎo)致表與“現(xiàn)實(shí)世界”中的實(shí)體不對(duì)應(yīng),它將“現(xiàn)實(shí)世界”中的實(shí)體分割成幾張表來(lái)顯示,以物理表示法來(lái)反映實(shí)體結(jié)構(gòu),這樣效率會(huì)比較差,常常要在查詢處理中進(jìn)行很多連接操作。
二.語(yǔ)義過(guò)載
關(guān)系模型表達(dá)數(shù)據(jù)和數(shù)據(jù)間關(guān)系的構(gòu)造只有一種——表。例如,為了表達(dá)實(shí)體A和實(shí)體B之間的多對(duì)多(*:*)關(guān)系、我們需要?jiǎng)?chuàng)建三張表,兩個(gè)分別用于表達(dá)實(shí)體A和B,第三張表用于表達(dá)實(shí)體間的關(guān)系。它沒(méi)有一種機(jī)制來(lái)區(qū)分實(shí)體和關(guān)系,也無(wú)法區(qū)分在實(shí)體間存在的不同種類的關(guān)系。例如,一個(gè)1:*關(guān)系可能是Has、Supervises、Manages等等。如果可以進(jìn)行區(qū)分,也許我們就可以將語(yǔ)義構(gòu)建到操作中。所以,我們說(shuō)關(guān)系模型語(yǔ)義過(guò)載了。
三.不能很好的支持業(yè)務(wù)規(guī)則
很多商業(yè)化系統(tǒng)不能完全支持實(shí)體和參照完整性、域等業(yè)務(wù)規(guī)則,所以需要將它們內(nèi)置到應(yīng)用程序中。這樣當(dāng)然是危險(xiǎn)的,而且容易導(dǎo)致做重復(fù)的工作。更糟糕的是,可能還會(huì)引起不一致現(xiàn)象。而且,在關(guān)系模型中不支持其他類型的業(yè)務(wù)規(guī)則,這又意味著它們需要被構(gòu)建到DBMS或應(yīng)用程序中。
四.有限的操作
關(guān)系模型只有一些固定的操作集,例如面向集合和記錄的操作,操作是在SQL規(guī)格說(shuō)明中提供的。但是,SQL目前不允許指定新的操作。因此,在給許多“現(xiàn)實(shí)世界”對(duì)象的行為建模就有了太多的限制。例如,一個(gè)GIS應(yīng)用程序典型的使用點(diǎn)、線、線組、多邊形和一些處理距離、交叉點(diǎn)和包含關(guān)系的操作。
五.處理遞歸查詢困難
數(shù)據(jù)的原子性意味著在關(guān)系模型中不允許出現(xiàn)重復(fù)的數(shù)據(jù)組,這樣就導(dǎo)致了處理遞歸查詢極為困難。遞歸查詢就是那些有關(guān)表和自身直接或間接的關(guān)系的查詢。為了解決這個(gè)問(wèn)題,SQL可以嵌入在一個(gè)高級(jí)程序設(shè)計(jì)語(yǔ)言中,由高級(jí)程序設(shè)計(jì)語(yǔ)言來(lái)提供支持反復(fù)操作的功能。而且,很多RDBMS提供了具有類似結(jié)構(gòu)的報(bào)表書(shū)寫(xiě)程序。不管是哪種情況,都是應(yīng)用程序而不是系統(tǒng)的內(nèi)在功能提供了所需的功能。
六.阻抗失配
直到最新版本的SQL標(biāo)準(zhǔn),都缺少完全的計(jì)算功能。為了解決這個(gè)問(wèn)題并且提供更多的靈活性,SQL標(biāo)準(zhǔn)提供嵌入式SQL來(lái)幫助開(kāi)發(fā)更加復(fù)雜的數(shù)據(jù)庫(kù)應(yīng)用程序。但是,這引起了阻抗不匹配(impedance mismatch)的問(wèn)題,因?yàn)槲覀儗煞N不同的程序設(shè)計(jì)模式混合在了一起。
1.SQL是一種處理行數(shù)據(jù)的聲明性語(yǔ)言,而諸如C語(yǔ)言這樣的高級(jí)語(yǔ)言則是過(guò)程化的語(yǔ)言,一次只能處理一行數(shù)據(jù)。
2.SQL和3GL使用不同的模型來(lái)表達(dá)數(shù)據(jù)。比如,SQL提供內(nèi)置的數(shù)據(jù)類型Date(日期型)和Interval(時(shí)間間隔型),而在傳統(tǒng)的編程語(yǔ)言中卻沒(méi)有這樣的類型。因此,就需要應(yīng)用程序在兩種表示法之間進(jìn)行轉(zhuǎn)換。而這樣做無(wú)論從程序設(shè)計(jì)的工作量還是運(yùn)行時(shí)資源的使用來(lái)看都是低效的。而且,由于我們使用兩種不同的系統(tǒng),因此,不可能將類型檢測(cè)作為一個(gè)整體自動(dòng)進(jìn)行。
注:SQL標(biāo)準(zhǔn)(SQL3)通過(guò)引入許多新的特征已經(jīng)彌補(bǔ)了上文中講述的一些不足之處。
通過(guò)上文中的介紹,大家在以后的關(guān)系數(shù)據(jù)模型的使用中藥盡量避開(kāi)這些不足之處,要最大程度的發(fā)揮關(guān)系數(shù)據(jù)模型的優(yōu)點(diǎn)。盡管關(guān)系數(shù)據(jù)模型有這些不足的地方,但我堅(jiān)信有一天關(guān)系數(shù)據(jù)模型一定會(huì)變的很完善。
【編輯推薦】