官术网_书友最值得收藏!

1.4 E-R模型

1.4.1 E-R模型的組成要素

E-R模型(Entity Relationship Model),也被稱為實體-聯系模型或E-R圖,是一種描述概念數據模型的工具。E-R模型分別用實體、屬性、聯系描述現實世界中的對象、對象的屬性、對象之間的聯系,這三者被稱為E-R模型的三要素。

E-R模型以規范的圖例描述現實世界。常用的圖例規范有兩種,如圖1-10所示。在第一種圖例規范中,將實體、屬性和聯系分別用矩形、橢圓形和菱形表示;實體及其屬性之間、聯系及其屬性之間用實線段連接;實體和聯系之間也用實線段連接,連線旁標注聯系的映射基數(Mapping Cardinality)。映射基數表示一個實體通過一個聯系所關聯的實體值的數量。映射基數的值可以是“一”或“多”。在第二種圖例規范中,實體及其屬性用一個兩行的矩形表示,第一行為實體名,第二行為屬性名;聯系用菱形表示,聯系的屬性用矩形表示,聯系及其屬性之間用虛線連接;實體與聯系之間用實線段連接,連線旁標注聯系的映射基數。

圖1-10 E-R模型的圖例規范

假設某高校請你設計校園卡管理系統,你首先需要到該校不同部門去調研,了解校園卡管理涉及哪些人,哪些部門,他們分別有什么屬性,會對校園卡進行什么操作。然后你需要進行數據抽象,把相關的人、物、事和概念按照共同特性進行歸類,梳理各類對象的屬性,以及對象與對象之間的聯系。最后你需要調研和分析,結果是該高校擬實行一卡通管理,相關人員可以持校園卡在校內的食堂、超市、洗衣房和熱水房等商戶消費。該系統中校園卡和商戶之間的消費關系可以描述為如圖1-11和圖1-12所示的E-R模型,兩種描述形式是等價的,后文以第二種為例進行示例。其中,校園卡實體有卡號、密碼、卡狀態(分為正常使用、掛失和凍結三種狀態,簡稱狀態)與余額等四種屬性;商戶實體有編號、名稱和地址等三種屬性。一張卡可以在多個商戶消費,一個商戶可以接受多張校園卡消費,所以校園卡實體和商戶實體之間是多對多的聯系,消費時會產生消費日期和消費金額屬性。

1. 實體

實體(Entity)是指現實世界中可區別于所有其他對象的一類“事物”或“對象”。例如,校園卡、商品、商戶、消費行為等。實體可能是具象的,也可能是抽象的,如校園卡、商品、商戶是具象的,而消費行為是抽象的。

圖1-11 校園卡消費的E-R模型1

同一類實體具有共性的屬性,可以通過一組屬性來表示一類實體,并與其他類實體區分開來。例如,校園卡可以用卡號、密碼、狀態、余額等屬性來描述,而學生可以用學號、姓名、性別、學院等屬性來描述。

實體有“型”和“值”的區別。實體型中的個體稱為實體值(Entity Value),每個實體值的屬性類型相同,但是可以取不同的屬性值。例如,學生是實體型,張偉是學生、周萍是學生,他們是學生這個實體型的實體值,都可以用學號、姓名、性別、學院等屬性來描述,只是不同個體的學號、姓名等屬性的值是不同的,如表1-1所示。后文如不特別說明,實體指的是實體型。

圖1-12 校園卡消費的E-R模型2

表1-1 學生實體型及實體值示例

同一個實體型內的若干個實體值的集合稱為實體集(Entity Set)。實體集中每個實體值具有相同的屬性。例如,張偉和他的同班同學構成了一個實體集。

2. 聯系

放在同一個數據庫系統中進行處理的實體往往存在聯系,例如學生持有校園卡在商戶消費,學生在教師的授課下完成課程的學習。在E-R模型中把實體之間會發生的關系稱為聯系(Relationship)。

(1)聯系的度。

聯系的度(Degree)是指參與聯系的實體的數目。如果一個應用涉及兩個實體及其聯系,就建立一個二元聯系,聯系的度為2。例如,學生和校園卡之間是二元聯系。如果一個應用同時涉及三個實體,且通過二元聯系無法準確描述三個實體間的聯系時,就要建立一個三元聯系,聯系的度為3。例如,超市中同一種商品有多個供應商,同一個供應商給多家超市供貨且向同一家超市供應多種商品。供應商、商品和超市之間是三元聯系。三元及以上的聯系統稱為多元聯系。

(2)聯系的屬性。

實體一定有屬性,某些情況下聯系也有屬性。例如,學生持卡在商戶消費,產生的消費金額和消費日期既不是校園卡的屬性,也不是商戶的屬性,而是消費行為發生后產生的“消費”聯系的屬性。

(3)二元聯系的映射基數。

二元聯系的映射基數有一對一、一對多、多對一、多對多等四種情況,A、B實體二元聯系的映射基數如表1-2所示,其中1表示“一”,n或者m表示“多”。

表1-2 二元聯系的映射基數示例

一對一(One-to-one):A中的一個實體值至多與B中的一個實體值關聯,B中的一個實體值也至多與A中的一個實體值關聯,記為1:1。例如,一個學生只能擁有一張校園卡,一張校園卡也只能由一個學生持有,學生與校園卡之間是一對一的聯系,如圖1-13所示。

一對多(One-to-many):A中的一個實體值可與B中任意數目(0到多個)的實體值關聯,B中的一個實體值至多與A中的一個實體值關聯,記為1:n。例如,一個部門中有若干名職工,每名職工只能在一個部門工作,則部門與職工之間是一對多的聯系,如圖1-14所示。

圖1-13 一對一聯系示例

多對一(Many-to-one):A中的一個實體值至多與B中的一個實體值關聯,B中的一個實體值可與A中任意數目(0到多個)的實體值關聯,記為n:1。上例中,職工與部門之間是多對一的聯系。

多對多(Many-to-many):A中的一個實體值可與B中任意數目(0到多個)的實體值關聯,B中的一個實體值可與A中任意數目(0到多個)的實體值關聯,記為m:n。例如,某高校的圖書借閱制度是一個學生可以借閱多本圖書,一本圖書可以被多個學生借閱。學生與圖書之間是多對多的聯系,如圖1-15所示。

圖1-14 一對多/多對一聯系示例

圖1-15 多對多聯系示例

(4)多元聯系的映射基數。

多元聯系映射基數的確定方法是分別以一個實體作為中心,假設另外的實體都只有一個實體值,根據關聯的中心實體的數量進行判斷。例如,三元聯系中,分別以一個實體作為中心,假設另兩個實體都只有一個實體值。若中心實體只有一個實體值能與另兩個實體的實體值進行關聯,則中心實體的連通數為“一”;若中心實體有多于一個實體值能與另兩個實體的實體值進行關聯,則中心實體的連通數為“多”。三元聯系的映射基數有以下四種情況:一對一對一、一對一對多、一對多對多、多對多對多,分別表示為1:1:1、1:1:n、1:m:nm:n:p

假設A公司的技術員可能負責多個項目,而且一名技術員在每個項目中只使用一本手冊,一名技術員在不同的項目中使用不同的手冊,一個項目的每本手冊只屬于一名技術員。技術員、項目和手冊之間是1:1:1的三元聯系,如圖1-16所示。

假設B公司中,每個員工在一個地點僅僅能被分配一個項目,但能夠在不同地點做不同的項目。每個地點的一個項目能夠由多個員工來做。項目、地點和員工之間的聯系是1:1:n的三元聯系,如圖1-17所示。

再如,C公司中,一名經理手下的一名工程師可能參與多個項目。一名經理管理的一個項目可能會有多名工程師。一個項目的每名工程師僅由一名經理管理。經理、工程師和項目之間的聯系是1:m:n的三元聯系,如圖1-18所示。

圖1-16 1:1:1的三元聯系示例

圖1-17 1:1:n的三元聯系示例

最后來看一個m:n:p聯系的例子。D公司中,一位店員可以向一位顧客銷售多種商品,而一名店員也可以將一種商品銷售給多位顧客,一位顧客可以從不同店員處購買同一種商品。店員、顧客和商品之間的聯系是m:n:p的三元聯系,如圖1-19所示。

圖1-18 1:m:n的三元聯系示例

圖1-19 m:n:p的三元聯系示例

(5)自環聯系及其表示。

自環聯系是一類特殊的聯系,是指同一個實體以不同角色多次參與一個聯系。例如,每個班只有一名班長,班長管理本班的所有學生,而班長也是一名學生。該聯系中學生實體以班長和普通學生兩種角色參與管理與被管理的聯系。發生自環聯系時,有必要在菱形和矩形的連線上標注角色名,指明實體是如何參與聯系的,如圖1-20所示。

圖1-20 自環聯系示例

3. 屬性

E-R模型中的屬性除了按照描述對象的不同,分為實體的屬性和聯系的屬性之外,還可以按照其他標準進行分類。

(1)簡單屬性和復合屬性。

簡單屬性是指不能劃分為更小部分的基本屬性,反之稱為復合屬性。復合屬性中的子屬性也可以是復合屬性。E-R圖中,復合屬性用縮進式目錄結構表示。例如,如圖1-21所示的學生實體的屬性中,學號、姓名、出生日期、學院都是不可再分的簡單屬性;通信地址是由省、市、區、街道組成的復合屬性。其中,街道是由街道號、街道名和門牌號組成的復合屬性。

(2)單值屬性和多值屬性。

如果某個屬性對于一個特定的實體只有單獨的一個值,這樣的屬性稱為單值屬性;反之稱為多值屬性。多值屬性用{}表示。例如,絕大多數學生只有一個電話號碼,但只要有學生有多個電話號碼,則電話號碼就是多值屬性,如圖1-21所示。

(3)派生屬性。

派生屬性是指可以從別的相關屬性或實體派生出來的屬性。派生屬性用()表示。為了減少冗余和數據不一致,數據庫中不存儲派生屬性,僅在需要時通過相應的公式計算得到。例如,圖1-21中,學生的年齡是可由其出生日期計算得到的派生屬性,故建議刪除該屬性。

圖1-21 復合屬性、多值屬性、派生屬性示例

主站蜘蛛池模板: 五原县| 南昌县| 霍城县| 阜阳市| 上林县| 成武县| 金沙县| 普兰县| 商水县| 陵川县| 阳曲县| 廊坊市| 宁蒗| 历史| 聂拉木县| 惠东县| 长治市| 高州市| 平塘县| 崇明县| 黔西县| 阿合奇县| 黄冈市| 高碑店市| 佛教| 贵阳市| 法库县| 盐源县| 新巴尔虎左旗| 水富县| 景东| 武宁县| 电白县| 麻城市| 理塘县| 卢氏县| 尉氏县| 西峡县| 汤阴县| 衡阳县| 龙里县|