Oracle的實(shí)體-Oracle關(guān)系模型
對一個(gè)數(shù)據(jù)庫管理員來說,所能為他的數(shù)據(jù)庫做的***的事情就是使之開始于一個(gè)合理的邏輯設(shè)計(jì)。不幸的很,數(shù)據(jù)庫設(shè)計(jì)常常被匆匆地完成以致于做錯(cuò),甚至在數(shù)據(jù)庫建立后重新返工。一個(gè)見聞廣博的和聰明的數(shù)據(jù)庫管理員知道對數(shù)據(jù)庫進(jìn)行很好的設(shè)計(jì),會(huì)大大提高數(shù)據(jù)庫的性能,而不是減損數(shù)據(jù)庫的性能,這種思想與流行的思想相反。事實(shí)上,直接投入物理設(shè)計(jì)或更深層的工作,只會(huì)帶來麻煩,不僅在性能方面,而且在數(shù)據(jù)完整性方面同樣如此。
如果一個(gè)數(shù)據(jù)庫運(yùn)行得很快,但收藏的數(shù)據(jù)卻是錯(cuò)誤的,這又有什么好處呢?而且,在數(shù)據(jù)庫系統(tǒng)的早期設(shè)計(jì)階段,創(chuàng)建一個(gè)合理的邏輯設(shè)計(jì),可以讓它接受以后創(chuàng)建和維護(hù)階段物理設(shè)計(jì)改變的考驗(yàn)??墒牵绻阍谶壿嬙O(shè)計(jì)階段走捷徑,你將不但可能需要重新設(shè)計(jì)邏輯模型,而且還可能需要重新構(gòu)造下面的物理模型。間接的代價(jià)(職員的工作時(shí)間、停工期等等)可能會(huì)是令人吃驚的。在進(jìn)行和建立數(shù)據(jù)庫之前,需要了解邏輯數(shù)據(jù)庫設(shè)計(jì)和標(biāo)準(zhǔn)化背后的基本原則。
在70年代中期,關(guān)系數(shù)據(jù)庫模型逐漸超越其他的數(shù)據(jù)模型占據(jù)主導(dǎo)地位,Oracle關(guān)系模型技術(shù)的風(fēng)靡使設(shè)計(jì)性能得到規(guī)范化。這其中***的是實(shí)體關(guān)系圖(Entity-RelationshipDiagram,ERD),它是P.P.Chen在1976年提出來的。這就是語義數(shù)據(jù)模型,因它試圖捕獲業(yè)務(wù)要素(業(yè)務(wù)本質(zhì))的語義或正確含義。因?yàn)殛P(guān)系模型本身幾乎就是一個(gè)依據(jù)語法的模型,是一種主要處理結(jié)構(gòu)的模型,實(shí)體關(guān)系圖(ERD)通常用于補(bǔ)充它。實(shí)際上,ERD建模必然先于關(guān)系建模。當(dāng)一個(gè)ERD結(jié)束時(shí),它或多或少地被直接映射到關(guān)系模型上,而后關(guān)系模型再被映射到它的物理模型上。
一個(gè)實(shí)體是一個(gè)業(yè)務(wù)元素,比如一個(gè)雇員或一個(gè)項(xiàng)目。一個(gè)關(guān)系就是兩個(gè)實(shí)體之間的聯(lián)系,比如工作于不同項(xiàng)目的雇員。屬性即組成實(shí)體的特征,比如一個(gè)雇員的工資或項(xiàng)目的預(yù)算。屬性被認(rèn)為是來自定義域中的取值或值的集合,它們所取的值是它們以后在關(guān)系模型中所用到的數(shù)據(jù)。它們是對一個(gè)事物全部抽取或部分抽取。ERD有許多畫法,只要你選擇一種并在整個(gè)使用過程中保持含義一致即可。
使用方框代表實(shí)體畫高級(jí)圖(那些不帶屬性的),將實(shí)體的名字列于方框的中心。低級(jí)圖的實(shí)體名稱列于方框中的上部,后面跟著屬性名稱。
在方框之間畫有箭頭,代表關(guān)系類型,有三種基本類型的關(guān)系:一對一、一對多以及多對多。一對一的關(guān)系根據(jù)一對一關(guān)系的類型,在線條的一端或兩端使用單箭頭。一對多使用雙箭頭,多對多在兩邊使用雙箭頭。當(dāng)一個(gè)實(shí)體的每一個(gè)值都和另一個(gè)實(shí)體的一個(gè)值并且只有一個(gè)值有關(guān)時(shí),就存在著一個(gè)純粹的一對一關(guān)系,反之亦然。這種類型的關(guān)系是很少見。
一種更為普遍的一對一關(guān)系是子類型關(guān)系,這是面向?qū)ο蠓治龊驮O(shè)計(jì)的基礎(chǔ)之一。在面向?qū)ο笙到y(tǒng)中,這被看作是類和子類(或者更簡單地說,類的級(jí)別)。換句話說,在更為普遍的實(shí)體中的屬性(長方形)上,將屬性(如長和寬)送給更為特定的實(shí)體(正方形)。因此,繼承的方向是從一般到特殊。子類型關(guān)系比純類型的一對一關(guān)系更為常見,但這兩種都不常用。通常,當(dāng)一個(gè)設(shè)計(jì)者偶然遇到一對一關(guān)系時(shí),他必須問下列問題:
■這兩個(gè)實(shí)體能結(jié)合嗎?
■它們對于自己的目標(biāo)是否是完全相同的?
■它們是否由于某些業(yè)務(wù)原因必須保持獨(dú)立和不同嗎?
通常情況下,一對一實(shí)體是可以合并的。在Oracle關(guān)系模型中,使用得最多的關(guān)系是一對多關(guān)系。在這種情況下,作為一名設(shè)計(jì)者,你所能為自己做的***的事情就是把自己從所有的多對多關(guān)系中解脫出來;并不是真正地除去它們,但你可以在它們原先位置上使用兩個(gè)或多個(gè)一對多關(guān)系來代替多對多關(guān)系。之所以要這樣做,是因?yàn)殛P(guān)系模型并不能實(shí)際處理一個(gè)多對多關(guān)系的直接實(shí)現(xiàn)。仔細(xì)想想,如果有許多從事多個(gè)項(xiàng)目的雇員,你怎樣來貯存外鍵?你不能在一列中貯存多個(gè)值,這樣違反了數(shù)據(jù)必須是原子的關(guān)系型要求,這意味著沒有一個(gè)單元能夠持有一條以上的信息。信息法則也說明:它是***范式(FirstNormalForm)的一個(gè)特殊情況。因此,為確保數(shù)據(jù)的原子性,每條多對多關(guān)系都被兩個(gè)或者多個(gè)一對多關(guān)系所取代。
你所要作的工作就是分割多對多關(guān)系。在關(guān)系模型中,被稱為職位的新實(shí)體通常被叫做交叉表,因?yàn)樗碇c其相關(guān)的兩個(gè)表中每一對實(shí)際值的交集,有時(shí)也稱為叫紐帶表( junction table)或連接表( join table),交叉表是這樣的一個(gè)實(shí)體:它不一定總是一些業(yè)務(wù)元素的真實(shí)抽象,但是它是解決和實(shí)現(xiàn)Oracle關(guān)系模型中多對多關(guān)系的基本方法。
【編輯推薦】