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


















