第三部分 - 數據庫分析與設計 - 3 - 實體 - 聯系建模

下圖所示的 ER 圖是對 DreamHome 案例的 Branch 視圖 ER 建模的結果。

DreamHome Branch 視圖的 ER 圖

1. 實體類型

實體類型:被企事業單位認可的、能夠獨立存在的一組具有相同屬性的對象。

ER 模型的基本概念是 實體類型,實體類型代表現實世界中具有相同屬性的一組對象。實體類型能夠獨立存在,既可以是物理(真實)存在的對象,也可以是概念(抽象)存在的對象,具體實例如下表所示。注意,關于實體類型我們只能給出一個能工作的定義,目前尚不存在一種嚴格的形式化定義。這意味著不同的設計人員可能會確定不同的實體。

實體出現(entity occurrence):實體類型中可唯一標識的一個對象。

一個實體類型中每一個可被唯一標示的對象都可簡稱為一個實體出現。本書使用 “實體類型” 或 “實體出現” 這兩個術語,然而在沒有歧義時,我們也常使用 “實體” 這個術語。

不同的實體類型可以通過名字和一組屬性來區分。一個數據庫里通常包含很多實體類型。

實體類型的圖形化表示

每個實體類型都用一個標有名字的矩形表示,名字通常是名詞。在 UML 中,每個實體名字的首字母是大寫的 (如 Staff 和 PropertyForRent)。實體類型 Staff 和 Branch 的圖形化表示如下圖所示。

Staff 和 Branch 實體類型的圖形化表示

2. 聯系類型

聯系類型:實體類型間的一組有意義的關聯。

一個 聯系類型 是一個或多個實體類型間的一組關聯。每個聯系類型都被賦予一個能夠描述其功能的名字。DreamHome Branch 中有個 POwns 的聯系類型,它將 PrivateOwner 和 PropertyForRent 這兩類實體關聯起來。

與實體類型一樣,也有必要區分 “聯系類型” 和 “聯系出現”。

聯系出現:由參與該聯系的各個實體類型的一個出現組成的可被唯一標識的關聯。

一個 聯系的實例出現 是指相互關聯的多個實體的實例出現。本書使用術語 “聯系類型” 或 “聯系的實例出現”, 和術語 “實體” 一樣,無歧義時,我們更多的是使用 “聯系” 這個術語。

考慮聯系類型 Has, 它表示 Branch 實體和 Staff 實體之間的一種關聯,即 Branch Has Staff(分公司擁有員工)。Has 聯系的每一個實例出現都將一個 Branch 實體的實例出現和一個 Staff 實體的實例出現關聯在一起。可以使用 語義網(semantic net) 來表示聯系 Has 的實例出現的個體。語義網是一種對象層的模型,它使用符號實心圓 “●” 表示實體,使用 “?”表示聯系。下圖所示的語義網中,有三個 Has 聯系的實例出現(分別標識為 r1、r2 和 r3)。每個聯系都描述了某個 Branch 實體的實例出現和某個 Staff 實體的實例出現之間的關聯。聯系是使用連接參與實體(Branch 實體和 Staff 實體)的線來表示的。例如 r1 表示 Branch 的實體 B003 和 Staff 的實體 SG37 之間的關聯。

聯系類型 Has 的實例出現的語義網表示

注意,表示每個 Branch 和 Staff 實體的實例出現時,我們使用的是 Branch 和 Staff 的主關鍵字屬性,即 branchNo 和 staffNo 的值。主關鍵字能唯一的標識每個實體的實例出現,在后面的小節中詳細討論。

如果使用語義網來表示某個企事業單位,將會陷入細節層面而難以理解。而是用實體聯系(ER)模型的概念更容易標識企事業單位中實體之間的聯系。ER 模型比語義網具有更高層次的抽象,這是因為 ER 模型將實體的實例出現集合組成實體類型,把聯系的實例出現組合成聯系類型。

聯系類型的圖形化表示

每個聯系類型都表現為用現將相關的實體類型聯系起來,并在線上標上聯系的名字。通常用一個動詞(如 Supervises 或 Manages)或者一個動詞短語(如 LeasedBy)來命名一個聯系。同樣,聯系名字的首字母也應大寫。應該盡可能保證同一個 ER 模型中的聯系名字是唯一的。

一個聯系還應標記一個方向,這通常意味著這個聯系的名字僅在一個方向上有意義(如 Branch Has Staff 要比 Staff Has Branch 有意義的多)。所以,一旦確定了聯系的名字后,為了讓讀者能夠理解聯系的名字的意義,要在名字旁邊加上一個箭頭符號來表示聯系的正確方向(如 Branch Has → Staff)。

2.1 聯系類型的度

聯系類型的度:參與聯系的實體類型的個數。

包含在某個聯系類型中的實體被看作該聯系的 參與者 。一個聯系類型的參與者的數目稱為這個聯系的 。所以,聯系的度表明了一個聯系包含的實體類型的個數。度為 2 的聯系稱為 二元聯系

度數為 3 的聯系稱為 三元聯系。度數大于 2 的聯系稱為 “復雜聯系”。

復雜聯系的圖形化表示。

UML 用一個菱形符號表示度大于 2 的聯系。聯系的名字放在菱形內部,在這種情況下,與該名字相關聯的方向箭頭可以省略。三元聯系 Registers 如下圖所示,即本文開始 DreamHome 中的聯系 Registers。

三元聯系 Registers 的示例

2.2 遞歸聯系

遞歸聯系:同一個實體類型以不同的角色多次(大于 1 次)參與了同一個聯系類型,這種聯系類型被稱為遞歸聯系。

考慮遞歸聯系 Supervises, Supervises 表示了員工和某位主管之間的關聯,而這位主管也是公司的一名員工。也就是說,實體類型 Staff 連詞參與了聯系 Supervises:第一次參與的角色是一位主管,第二次參與的角色是一位員工(被管理者)。遞歸聯系有時也叫作一元聯系。

可以添加 角色名稱 來表明每一個參與聯系的實體類型在該聯系中的意義。在遞歸聯系中,角色名稱對于確定每個參與者的作用是非常重要的。下圖表示了如何使用角色名稱來描述 Supervises 聯系,其中 Staff 實體類型第一次參與時的角色名稱是 Supervisor,第二次參與時的角色名稱是 Supervisee。

具有 Supervisor 和 Supervisee 角色的遞歸聯系 Supervises

當兩個實體之間存在多于一種聯系時也可以使用角色名稱。以下圖為例,Staff 和 Branch 兩個實體類型之間存在 Manages 和 Has 兩種聯系,此時添加角色名就能夠標明每種聯系的意義。具體來說,在 “Staff Manages Branch” 的聯系中,Staff 實體中具有角色名稱 “Manager” 的某位員工管理 Branch 實體中具有角色名稱 “Branch Office” 的某一分公司。類似的,對于 “Branch Has Staff” 聯系,角色名稱為 “Branch Office” 的分公司雇傭角色名稱為 “Member of Staff” 的員工。

通過兩種不同的具有角色名稱的聯系——Manages 和 Has 關聯起來的實體示例

當參與聯系的實體在聯系中的功能無二義時,通常不需要定義角色名稱。

3. 屬性

屬性:實體或聯系類型所具有的某一特性。

實體類型具有的特性稱為屬性。例如,實體類型 Staff 的屬性有 staffNo、name、position 和 salary。屬性被賦值以后就可以描述每個實體的實例出現,而屬性值的集合則是數據庫中所存儲數據的主要構成。

關聯實體的聯系類型也可以具有和實體類型類似的屬性,這部分內容在第五小節討論。

屬性域:單個屬性或多個屬性所允許的取值集合。

每個屬性都與一個取值集合相關聯,這個集合稱為 。域定義了一個屬性可能的取值范圍,這與關系模型中的域的概念類似。例如,每一個房屋實體所擁有的可出租房間數量從 1 到 15 不等,所以,實體類型 PropertyForRent 的屬性 rooms(房屋數量)的取值范圍是從 1 到 15 的任意整數。

多個屬性可以共享一個域。例如,實體類型 Branch、PrivateOwner 和 BusinessOwner 都擁有屬性 address,且這些屬性的域也相同,即可以取所有可能的地址。域還可以由其他一些域組合而成。例如,實體 Branch 的 address 屬性域可以由以下子域組成:street、city 和 postcode。

屬性 name 的域更難定義,因為它包含了所有可能的名字:可以是一個字符串,不僅包括字母,還可能包括連字符 “-” 或其他一些特殊的符號。一個完整的數據模型應該包括 ER 模型中每一個屬性的域。

如下所述,屬性可以分為:簡單屬性組合屬性單值屬性多值屬性導出屬性

3.1 簡單屬性和組合屬性

簡單屬性:有獨立存在的單個部分組成的屬性。

簡單屬性不嗯能夠在被劃分為更小的部分,如 Staff 實體的 position 和 salary 屬性就是簡單屬性。簡單屬性有時又稱為 原子屬性

組合屬性:由多個部分組成的屬性,每個部分都可獨立存在。

有些屬性可以劃分為更小的部分,而且這些更小的部分可以獨立存在。例如,若 Branch 實體的 address 屬性的值為(163 Main St,Glasgow, G11 9QX),則這個屬性可以繼續劃分為 street、city 和 postcode 三個屬性,這三個屬性的取值分別為(163 Main St)、(Glasgow)、( G11 9QX)。

建模時,究竟是將 address 屬性當做一個簡單屬性,還是作為組合屬性由三個子屬性 street、city 和 postcode 構成,依賴于在用戶數據視圖中提及屬性 address 時,是將其視為一個整體還是由多個獨立部分組合而成。

3.2 單值屬性和多值屬性

單值屬性:在實體類型的每個實例出現都只取一個單值的屬性。

大多數屬性都是單值屬性。例如,實體類型 Branch 的每個實例出現的分公司編號(branchNo)屬性的取值都只有一個(如 B003),因此屬性 branchNo 被看做單值的。

多值屬性:對于實體類型的某些實例出現可能取多個值的屬性。

對于實體的某些實例出現,某個屬性可以有多個值。例如 Branch 實體類型的某些實例出現,屬性 telNo 都可以有多個值(例如,編號為 B003 的分公司的電話號碼為 0141-339-2178 和 0141-339-4439),所以在這個示例中,屬性 telNo 就是多值得。多值屬性的取值個數可能會有上限和下限的約束。例如,實體類型 Branch 的屬性 telNo 可以取 1 到 3 個值,也就是說,一個分公司可能至少有一個電話號碼,至多有 3 個電話號碼。

3.3 導出屬性

導出屬性:屬性的值是從相關的一個或一組屬性(不一定來自同一個實體類型)的值導出來的屬性。

有些屬性的值是導出來的。例如,實體類型 Lease 的屬性 duration 的值就是根據該試題類型的屬性 rentStart 和 rentFinish 的值計算出來的。因此我們稱屬性 duration 為導出屬性,其值就是從 rentStart 和 rentFinish 導出的。

在有些時候,某些屬性的值是從同一試題類型得實例出現導出的。例如,實體類型 Staff 的總人數(totalStaff)屬性,就是通過計算 Staff 實體類型實例出現的總的個數得到的。

導出屬性可能還與來自不同實體類型的屬性有關。例如,實體類型 Lease 的屬性 deposit 的值就是從實體類型 PropertyForRent 的屬性 rent 導出的。

3.4 關鍵字

候選關鍵字:能夠唯一標識每個實體的實例出現的最小屬性組。

一個候選關鍵字是一個最小屬性組,它的值能夠唯一的標識每個實體的實例出現。例如,屬性分公司編號(branchNo)是實體類型 Branch 的候選關鍵字,對于每個分公司的實體的實例出現,其 branchNo 的值都是不同的。實體類型的每一個實例出現的候選關鍵字的值都是唯一的,這意味著候選關鍵字不能為空。例如,每個分公司都擁有一個唯一的編號(如 B003),而且絕不會有兩個或兩個以上的分公司具有相同的編號。

主關鍵字:被指定用來唯一標識實體類型的每個實例出現的候選關鍵字。

一個實體類型可能有多個候選關鍵字。為了便于說明,假設每位員工都擁有一個唯一的公司指派的員工編號(staffNo)和一個唯一的、一般由政府使用的社會保險號(National Insurance Number, NIN)。那么實體 Staff 就有了兩個候選關鍵字,必須取其一作為主關鍵字。

實體主關鍵字的選擇要考慮屬性的長度(長度最小者優先),以及該屬性在以后是否仍具有唯一性。例如,由企業分配的員工編號最多包含 5 個字符(如 SG14),而 NIN 最多包含 9 個字符(如 WL220658D)。所以我們選擇 staffNo 作為實體類型 Staff 的主關鍵字,而 NIN 則被視為可替換關鍵字。

合成關鍵字:包括兩個或兩個以上的屬性的候選關鍵字。

有些情況下,一個實體類型的候選關鍵字是由幾個屬性組成的,這些屬性組合起來可以唯一標識每個實體的實例出現,但分開來卻不可以。考慮實體 Advert,它由 propertyNo(房產編號)、newspaperName、dateAdvert 和 cost 四個屬性。多家報紙可能在同一天刊登了多處房屋出租的廣告。為了唯一標識每個 Advert 實體類型的實例出現,需要同時確定 propertyNo、newspaperName 和 dateAdvert 三個屬性的值。所以,實體類型 Advert 有一個合成主關鍵字,該合成關鍵字包括 propertyNo、newspaperName 和 dateAdvert 三個屬性。

屬性的圖形化表示

如果要在一個實體類型中顯示它的屬性,可以將表示實體的矩形分成兩個部分。上面寫實體名字,下面列出屬性的名字。實體類型 Staff 和 Branch 及其相關屬性的 ER 圖如下圖所示。

列出的第一個屬性(屬性組)應該是實體類型的主關鍵字(在已知的情況下)。可以用符號 {PK} 來標記主關鍵字屬性(屬性組)。在 UML 里,屬性名字的首字母要小寫,如果屬性的名字中包含了不止一個單詞時,則后面的沒歌詞的首字母都要大寫(例如,address 和 telNo)。當某個屬性屬于某個合成關鍵字時,可以用部分主關鍵字符號 {PPK} 來標記。可替換關鍵字則用符號 {AK} 標記。上圖中實體類型 Staff 的主關鍵字是屬性 staffNo,實體類型 Branch 的主關鍵字是屬性 branchNo。

對于一些簡單的數據庫系統來說,在 ER 圖中把每個實體類型的所有屬性都列出來是可能的。然而對于復雜的數據庫系統來說,我們僅僅列出了每一個實體類型的主關鍵字屬性組。當 ER 圖中只顯示主關鍵字屬性(屬性組)時,可以省略 {PK} 標記。

對于簡單屬性和單值屬性,沒有必要特別標記,所以我們只要在實體名字下面列出這些屬性名即可。對于組合屬性,可以在緊跟著組合屬性名的下面一行開始以右縮進的格式列出紫屬性名。例如,上圖中的實體 Branch 和 address 屬性就是一個組合屬性,跟在 address 下面的是該屬性的子屬性:street、city 和 postcode。對于多值屬性,要為其指明屬性取值的個數范圍。例如,若果將屬性 telNo 的范圍標記為 [1..*],則意味著 telNo 可有 1 個或大于 1 個的取值。如果精確的知道值的最大個數,則可以標記出屬性的確切范圍。例如,如果屬性 telNo 最多有三個值,則可以標記為 [1..3]。

對于導出屬性,在屬性名前加上符號 “/”。例如,在上圖中,實體類型 Staff 的導出屬性被標記為 /totalStaff。

4. 強實體類型與弱實體類型

實體類型可以分為強實體類型和弱實體類型。

強實體類型:該實體類型的存在不依賴于其他的實體類型。

如果一個實體類型的存在不依賴于其它的實體類型,那么稱這個實體類型為強實體類型。DreamHome ER圖中的強實體類型包括:Staff、Branch、PropertyForRent 和 Client 實體。強實體類型的一個特征是可以使用該實體類型的主關鍵字唯一標識每個實體的實例出現。例如,可以使用實體類型 Staff 的主關鍵字 staffNo 屬性唯一標識每個員工。

弱實體類型:該實體類型的存在依賴于其他實體類型的存在。

弱實體類型的存在依賴于其他實體類型的存在。下圖中有一個弱實體類型 Preference。弱實體類型的一個特征是,僅使用該實體類型的屬性無法唯一標識每個實體的實例出現。注意,實體 Preference 并沒有主關鍵字,這意味著僅使用該實體的屬性無法標識每個實體的實例出現。只有通過一個 Preference 的實例出現和某位客戶之間的聯系,才能唯一地標識每個 Preference 實體,而每個客戶是可以用實體類型 Client 的主關鍵字 clientNo 唯一標識的。在這個例子中,Preference 實體的存在依賴于 Client 實體的存在,Client 實體被稱為所有者實體(owner entity)。

強實體類型 Client 和弱實體類型 Preference

弱實體類型有時也稱為子(child)實體、依賴(dependent)實體或從屬(subordinate)實體。強實體類型則稱為父(father)實體、所有者實體或支配(dominant)實體。

5. 聯系的屬性

如第三小節所述,聯系也可以具有屬性。例如,DreamHome ER 圖中的聯系 Advertises,它將實體類型 Newspaper 和 PropertyForRent 關聯起來。為了記錄某處房屋出租廣告的刊登日期以及廣告的費用,可以把這些信息同 Advertises 關聯起來,作為聯系 Advertises 的屬性——dateAdvert 和 cost,而不是把它們看作實體 Newspaper 或者 PropertyForRent。

聯系的屬性的圖形化表示

在表示某個聯系相關聯的屬性時,采用與實體類型相同的符號。但是,為了區分帶有屬性的聯系與實體,將表示屬性的矩形和聯系用虛線連接起來。擁有屬性dateAdvert 和 cost 的聯系 Advertises 如下圖所示。另外一個示例就是 DreamHome ER圖中的擁有屬性 mgrStartDate 和 bonus 的 Manages 聯系。

具有 dateAdvert 和 cost 屬性的 Advertises 聯系

對于擁有一個或多個屬性的聯系,意味著該聯系隱蔽著一個未標識的實體類型。例如,聯系 Advertises 擁有 dateAdvert 和 cost 兩個屬性,這可能意味著實體 Advert 的存在。

6. 結構化約束

下面分析參與聯系的實體類型上可能存在的約束。這些約束應該反映出在現實世界中對這些聯系的限制。這種約束的例子包括:要求可供出租的房產必須有一個業主,每個分公司必須有員工等。聯系上主要的約束稱為 多重性

多重性(multiplicity):指一個參與實體類型通過某一聯系與另一參與實體類型的某個出現發生關聯的出現的數目(或者范圍)。

多重性約束了實體間關聯的方式,它是用戶或企業建立的策略(或商業規則)的一種表示。識別并能夠表示出所有適當的企業約束對于劍魔來說是非常重要的。

如前所述,最常見的聯系的度是二元的。二元聯系通常又可分為一對一(1:1)、一對多(1:*)或多對多(*:*)的。我們使用下面的完整約束來說明這三種聯系:

  • 一個分公司由一名員工管理(1:1)。
  • 一名員工負責管理多出可供出租的房產(1:*)。
  • 可以在多家報紙上刊登多處房屋出租的廣告(*:*)。

注意:并不是所有的完整性約束都可以簡單的用 ER 模型表示。例如,每一名員工每年都會由于在企事業單位工作而得到一天額外的休假,這樣的約束是很難用 ER 模型表示的。

6.1 一對一(1:1)聯系

考慮聯系 Manages,它將實體類型 Staff 和 Branch 關聯起來。下圖用語義網給出了 Manages 聯系類型的兩個實例出現(分別標識為 r1 和 r2)。每個聯系(rn)都表示了一個 Staff 實體的實例出現和一個 Branch 實體的實例出現之間的關聯。我們用實體類型 Staff 和 Branch 主關鍵字 staffNo 和 branchNo 來標識每個 Staff 和 Branch 實體的實例出現。

多重性的確定

多重性的確定通常需要精確分析企業約束里給出的樣本數據之間的聯系。我們可以通過分析已經填好的表單或者報表來獲取樣本數據,如果可能的話,也可以通過和用戶進行討論來獲取。但是,需要強調的是,只有當所分析和討論的樣本數據能夠真實全面的反映建模所涉及的數據時,我們才能得到關于約束的正確結論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 回顧數據庫設計三個階段:概念數據庫設計:生成數據庫的概念表示,包括重要的實體、聯系以及屬性的定義。邏輯數據庫設計:...
    板藍根plank閱讀 3,477評論 0 11
  • 為企業設計數據庫時,主要目標是正確的表示數據、數據之間的聯系以及與企業業務相關的數據約束。為了實現這個目標,我們可...
    板藍根plank閱讀 2,421評論 0 2
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • 今天,群里大伙商量著定一個主題。我們是“每天寫作群”嘛,就先聊聊為什么要寫作。 認識的許多人,都是被李笑來老師“蠱...
    烏卓閱讀 407評論 5 8
  • 冬日的陽光透過窗臺,散落一地,花盆里新長出來的野草綠意盈盈,生命真是好啊,人們總是喜歡充滿生意盎...
    行走一只花閱讀 630評論 2 3