目錄
E-R模型和關系模型都是現實世界抽象的邏輯表示
- E-R模型並不被 DBMS直接支持,更適合對現實世界建模
- 關系模型是 DBMS直接支持的數據模型
基本 E-R圖中的元素包括實體集、聯系集、屬性
橢圓框表示屬性,矩形框表示實體集,菱形框表示聯系
屬性處理
關系模型要求關系的所有屬性都是原子的。然而 E-R模型中的復合屬性和多值屬性不是原子的,E-R模型還允許出現派生屬性,這三種屬性需要特殊處理
(1)派生屬性
派生屬性的值可以通過計算得到,它的值不在數據庫中存儲,轉換時直接忽略
(2)復合屬性
采用"展平"技術:忽略復合屬性本身,直接考慮它的成分屬性。如果某個成分屬性仍然是復合的,用相同方法處理
例如,考慮實體集職工復合屬性"家庭住址",它包含成分屬性省、城市、街道、郵政編碼。在將該實體集轉換成關系模式時,忽略復合屬性"家庭住址",而直接使用成分屬性省、城市、街道、郵政編碼作為關系模式的屬性
(3)多值屬性
需要為每個多值屬性 M創建一個關系
- 如果多值屬性 M是實體集 E的屬性,K是 E的主碼,則關系
的屬性由 M和 K組成
- 如果多值屬性 M是聯系集 R的屬性,並且 R涉及實體集 E1,…,En,它們的主碼分別是 K1,…,Kn,則關系
的屬性由 M和 K1,…,Kn組成
注意:如果 M還是復合屬性,則需要按復合屬性的處理方法對 M做"展平"處理。關系 的碼需要根據實際問題的語義確定。此外一旦為多值屬性創建了關系,后續處理就不再考慮多值屬性
例1、多值屬性轉換
如總圖,Phones 是實體集 Departments 的多值屬性,為其創建一個關系。由於 Phones還是復合屬性,需要對它做"展平"處理:直接使用其成分屬性 Office 和 Phone#。實體集 Departments 的碼是 Dno。由此得到多值屬性 Phones 的關系模式為:Phones(Phone#, Dno, Office)
假定每部電話都在一個院系的辦公室,因此 Phone# 可以作為 Phones 的碼
注意,這里把為多值屬性 Phones 創建的關系用 Phones 命名。原則上如何命名沒有規定,但是采用容易記憶的名字有助於理解,並且當多值屬性是復合屬性時,直接使用多值屬性名作為關系名是方便的
實體集處理
強 / 弱實體集
一般地,如果一個實體集的任何屬性集都不足以形成該實體集的碼,則稱該實體集為弱實體集。與此相對,存在碼的實體集稱為強實體集
弱實體集中的任何實體(簡稱弱實體)都不能獨立地存在於系統中,即每個弱實體必須依賴於一個強實體。例如每個家屬必須存在依賴於一個特定的職工(只有這樣他才被公司視為家屬),當一位職工離開公司,他的配偶和子女都不再被公司視為家屬
- 弱實體集必須與另一個稱為標識實體集或屬主實體集的強實體集相關聯才有意義
- 稱標識實體集擁有它所標識的弱實體集,將弱實體集與其標識實體集相關聯的的聯系稱為標識性聯系
- 標識性聯系是從弱實體集到標識實體集的多對一聯系,並且弱實體集對該聯系的參與是全部參與
在弱實體集中,如果它的一個屬性集可以唯一確定 存在依賴於同一個強實體的弱實體,則稱該屬性集為弱實體集的分辨符。弱實體集的標識實體集的碼和該弱實體集的分辨符共同形成弱實體集的碼,弱實體集的分辨符又稱弱實體集的部分碼
每個強實體集用一個關系表示。實體集名可以作為關系名,實體集的全部屬性構成關系的屬性(復合屬性按照前面的方法"展平"),實體集的碼作為關系的碼
每個弱實體集用一個關系表示。弱實體集名可以作為關系名,弱實體集存在依賴的標識實體集的主碼和弱實體集的全部屬性構成關系的屬性(復合屬性按照前面的方法"展平"),標識實體集的碼和弱實體集的分辨符組合成關系的碼。下圖給出了強實體集職工和弱實體集家屬轉換后的關系模式
聯系集處理
每個聯系集用一個關系表示,但弱實體集與其標識實體集之間的存在依賴關系忽略
聯系集名可以作為關系名,參與聯系的諸實體集的主碼和聯系集的屬性(復合屬性按照前面的方法"展平")形成關系的屬性
關系的碼根據聯系的類型按如下方法確定
聯系集轉關系時,先找到一個聯系集,然后順着連線找到關聯的多個實體集。觀察實體集間的連線:
- 連線的兩端都有箭頭,說明是一對一的聯系,新的主碼是兩關系的候選碼中的一個(兩個候選碼都畫有下划線,但下划線不相連,具體哪個是主碼,自定)
- 連線的一端有箭頭,說明是一對多的聯系,箭頭一端是"單端",新的主碼由"多端"實體集的碼組成
- 連線兩端都沒箭頭,說明是多對多的聯系,新的主碼由所有實體集的碼組成
將基本 E-R圖轉換成關系模式
為了將聯系轉換成關系模式,要求參與同一聯系的任何兩個不同的實體集的主碼都不包含相同的屬性(這一點容易做到,屬性是局部於實體集的,必要時可以對某些屬性重命名)
假定復合屬性已經"展平",多值屬性創建了對應的關系。將 E-R模型轉換成關系模式的方法如下
- 每個強實體集用一個關系表示
- 每個弱實體集用一個關系表示
- 將聯系集用相應的方法轉換成關系表示
- 如果兩個關系具有相同的碼,可以合並它們(這一步並非必須,但可以減少碼重復存放空間開銷,使查詢可以更有效的求值)
例2、將總圖轉換成關系模式
總圖的多值復合屬性 Phones 得到關系模式:Phones(Phone#, Dno, Office)
總圖沒有弱實體集,由強實體集得到如下關系模式:
Departments(Dno, Dname)
Teachers(Tno, Tname, Sex, Birthday, Title)
Students(Sno, Sname, Sex, Birthday, Enrollyear, Speciality)
Courses(Cno, Cname, Perid, Credit)
其中每個關系模式都源於同名實體集,碼用下划線標記。多值屬性 Phones 不包含在關系模式 Departments 中,已經將它轉換成關系模式
由聯系集得到如下關系模式:
Manades(Dno, Tno)
Works_in(Tno, Dno)
Studies_in(Sno, Dno)
Teaches(Tno, Cno)
SC(Sno, Cno, Grade)
Evalues(Sno, Tno, Cno, Escore)
其中每個關系模式都源於同名聯系集,碼用下划線標記。Manages 和 Works_in 包含相同的屬性,但它們含義不同,前者 Tno 表示作為系主任的教師對特定的"系"(用 Tno 表示)的管理,后者表示每位教師在一個特定的系工作
最后一步,合並具有相同碼的關系模式(合並時可根據實際情況,也可根據題設要求)
Manages 可以和 Departments 合並,也可以與 Teachers 合並,前者有利於回答 "某系的主任是誰" 之類的問題,后者有利於回答 "某教師的系主任是誰" 之類的問題。前一類問題更常出現,采用前一種方法,得到關系模式 Departments(Dno, Dname, Dheadno)(把表示系主任的職工號的屬性名 Tno 改為 Dheadno,使得屬性的語義更清楚)
還有兩對關系具有相同的碼,Teachers 和 Works_in,Students 和 Studies_in,都可以直接合並。最終得到關系模式: