【聲明】本文章來(lái)自穆晨 - 博客園,記錄于此方便后期的學(xué)習(xí)和查閱
一、前言
ER建模環(huán)節(jié)完成后,需求就被描述成了ER圖。之后,便可根據(jù)這個(gè)ER圖設(shè)計(jì)相應(yīng)的關(guān)系表了。
從ER圖到具體關(guān)系表的建立,需要經(jīng)過(guò)兩個(gè)步驟:邏輯模型設(shè)計(jì)和物理模型設(shè)計(jì)。其中前者將ER圖映射為邏輯意義上的關(guān)系表,后者則映射為物理意義上的關(guān)系表。
邏輯意義上的關(guān)系表,可以理解為單純意義上的關(guān)系表,它不涉及到表中字段數(shù)據(jù)類(lèi)型,索引信息,觸發(fā)器等細(xì)節(jié)信息。本文將詳細(xì)介紹ER模型到邏輯關(guān)系表的映射是如何完成的。
二、基本概念
1. 關(guān)系(relation)
關(guān)系就是在數(shù)據(jù)庫(kù)中存在的,包含行和列的一張表。也常被稱(chēng)為關(guān)系表,或者表。注意只有在確保不會(huì)引起混亂的時(shí)候使用最后一種稱(chēng)呼,因?yàn)殛P(guān)系表和一般意義上的表有很大區(qū)別(下文會(huì)分析)。
2. 列(column)
列就是字面意義上表的列,有時(shí)也被稱(chēng)作屬性,或者域。
3. 行(row)
行就是字面意義上表的行,有時(shí)也被稱(chēng)作元祖,或者記錄。
4. 關(guān)系表的基本約束(關(guān)系表 VS 一般的表)
- 一個(gè)列只能有一個(gè)名稱(chēng)
- 不能出現(xiàn)完全一樣的行
- 表中每個(gè)值都必須為單值
- 同一列中的所有值都必須屬于同一個(gè)域
- 行/列順序無(wú)關(guān)
5. 主碼(primary key)
每個(gè)關(guān)系表必須要有一個(gè)主碼(可含多列),用來(lái)唯一標(biāo)識(shí)表中各行記錄。
6. 實(shí)體完整性約束(entity integrity constraint)
所有主碼必須非空。
7. 外碼(foreign key)
外碼是關(guān)系表中的某一列,而這一列恰恰又是另一個(gè)關(guān)系表的主碼。
8. 參照完整性約束(reference integrity constraints)
外碼取值要么為空,要么為其參照關(guān)系表中的主碼取值。
二、ER模型到關(guān)系表的映射
1. 常規(guī)實(shí)體映射為關(guān)系表
對(duì)常規(guī)實(shí)體來(lái)說(shuō),其每個(gè)屬性對(duì)應(yīng)到關(guān)系表中的某一列,而某單值且唯一的列則映射為主碼,標(biāo)記下劃線(xiàn)。
-
如下實(shí)體:
-
映射為關(guān)系表:
2. 含復(fù)合屬性的實(shí)體映射為關(guān)系表
在這類(lèi)映射中,復(fù)合屬性的各子屬性會(huì)映射到新的關(guān)系中,且不會(huì)出現(xiàn)復(fù)合屬性名。但數(shù)據(jù)庫(kù)上層的前端應(yīng)用,可能會(huì)用到復(fù)合屬性名,也就是ER圖在各個(gè)階段都有可能用到,不是說(shuō)映射為關(guān)系后就沒(méi)啥事了。
-
如下實(shí)體:
-
映射為關(guān)系表:
3. 含唯一復(fù)合屬性的實(shí)體映射為關(guān)系表
在這類(lèi)映射中,會(huì)形成一個(gè)復(fù)合主碼,其成員為復(fù)合屬性的各子屬性。
-
如下實(shí)體:
-
映射為關(guān)系表:
4. 含可選屬性的實(shí)體映射為關(guān)系表
在這類(lèi)映射中,需要將可選屬性對(duì)應(yīng)的列標(biāo)記一個(gè)(O)。
-
如下實(shí)體:
-
映射為關(guān)系表:
5. 一對(duì)多(1 : M)聯(lián)系的映射
在這類(lèi)映射中,為M側(cè)的實(shí)體所映射得到的關(guān)系中,設(shè)置一個(gè)外碼,這個(gè)外碼對(duì)應(yīng)于由1側(cè)的實(shí)體映射得到的關(guān)系中的主碼。注意,外碼命名不一定要和它對(duì)應(yīng)的主碼一致,可根據(jù)實(shí)際情況決定。
-
如下實(shí)體:
-
映射為關(guān)系表:
6. 多對(duì)多(M : N)聯(lián)系映射
在這類(lèi)映射中,除了具有多對(duì)多聯(lián)系的兩個(gè)實(shí)體之外,聯(lián)系本身也需要映射為關(guān)系。聯(lián)系對(duì)應(yīng)的關(guān)系中將有兩個(gè)外碼,分別對(duì)應(yīng)兩個(gè)實(shí)體的主碼,同時(shí)這兩個(gè)外碼構(gòu)成新關(guān)系的主碼。
-
如下實(shí)體:
-
映射為關(guān)系表:
7. 一對(duì)一(1 : 1)聯(lián)系的映射
這類(lèi)映射和 (1 : M) 很相似。原則上外鍵設(shè)在任何一個(gè)實(shí)體的關(guān)系中都OK,但如果一對(duì)一聯(lián)系中的基數(shù)約束是強(qiáng)制單個(gè)和可選單個(gè)這種類(lèi)型,則最好將外鍵設(shè)置在可選多的一側(cè)。因?yàn)檫@樣可以保證關(guān)系中不會(huì)出現(xiàn)太多空值。
-
如下實(shí)體:
-
映射為關(guān)表:
8. 含若干候選碼的實(shí)體映射為關(guān)系表
在這類(lèi)映射中,主碼依然標(biāo)記劃線(xiàn),而非主碼唯一屬性則標(biāo)記(U)。
-
如下實(shí)體:
-
映射為關(guān)系表:
9. 含多值屬性的實(shí)體映射為關(guān)系表
在這類(lèi)映射中,需要為多值屬性創(chuàng)建一個(gè)新的關(guān)系,新關(guān)系中包含一個(gè)外碼,對(duì)應(yīng)到主實(shí)體的主碼。同時(shí)屬性值和外碼構(gòu)成了新關(guān)系的復(fù)合主碼。
-
如下實(shí)體:
-
映射為關(guān)系表:
10. 含派生屬性的實(shí)體映射為關(guān)系表
派生屬性不需要做什么特別處理,那是前端的事情,哈哈。
11. 一對(duì)多 (1 : M) 一元聯(lián)系的映射
在這類(lèi)映射中,實(shí)體映射得到的關(guān)系中包含一個(gè)外碼,對(duì)應(yīng)到關(guān)系自身的主碼。需要注意的是,該映射中的外碼名和主碼名是不同的,事實(shí)上關(guān)系中也不允許出現(xiàn)名稱(chēng)相同的兩列。
-
如下實(shí)體:
-
映射為關(guān)系表:
12. 多對(duì)多 (M : N) 一元聯(lián)系的映射
在這類(lèi)映射中,除了實(shí)體本身需要映射為關(guān)系之外,多對(duì)多聯(lián)系也需要映射為另一個(gè)關(guān)系。新的關(guān)系中將有兩個(gè)外碼,它們均對(duì)應(yīng)到實(shí)體主碼。這兩個(gè)外碼又組合為新關(guān)系的復(fù)合主碼,這里同樣要注意外碼名要避免和主碼名重復(fù)。
-
如下實(shí)體:
-
映射為關(guān)系表:
13. 一對(duì)一 (1 : 1) 一元聯(lián)系的映射
和上面第11條講的一對(duì)多(1 : M)一元聯(lián)系映射規(guī)則完全相同,此處不再舉例說(shuō)明。
14. 弱實(shí)體映射為關(guān)系
弱實(shí)體映射和常規(guī)一對(duì)多聯(lián)系映射一樣,需要在弱實(shí)體(M側(cè)實(shí)體)中建立一個(gè)對(duì)應(yīng)到屬主實(shí)體(1側(cè)實(shí)體)的外碼。然而區(qū)別是弱實(shí)體中的主碼是弱實(shí)體自身的部分碼 + 外碼構(gòu)成的復(fù)合主碼,而后者的主碼僅是M側(cè)實(shí)體自己的主碼。
-
如下實(shí)體:
-
映射為關(guān)系表:
如果聯(lián)系是一對(duì)一,則弱實(shí)體的主碼就是那個(gè)對(duì)應(yīng)到其屬主實(shí)體的外碼,而沒(méi)有部分碼了。
-
如下實(shí)體:
-
映射為關(guān)系表:
15. 將關(guān)聯(lián)實(shí)體映射為關(guān)系
關(guān)聯(lián)實(shí)體本身就是聯(lián)系,因此它的映射規(guī)則和聯(lián)系是一樣的。
16. 三元聯(lián)系的映射
在這類(lèi)映射中,與多對(duì)多聯(lián)系的映射比較相似。另外,三元聯(lián)系肯定是多對(duì)多對(duì)多的。因?yàn)槿绻杏幸粋€(gè)為一,那么該三元聯(lián)系,就應(yīng)該轉(zhuǎn)成兩個(gè)二元的一對(duì)多聯(lián)系。
-
如下實(shí)體:
-
映射為關(guān)系表:
三、概念模型 VS 邏輯模型
數(shù)據(jù)開(kāi)發(fā)人員繪制ER圖,并和項(xiàng)目各方人員協(xié)同需求,達(dá)成一致的過(guò)程,叫做概念模型建模、或ER建模、或需求可視化。
概念模型建模過(guò)程中,涉及到的人員,開(kāi)發(fā)能力比較薄弱,甚至不懂開(kāi)發(fā),因此ER圖必須清晰明了,不能涉及到過(guò)多的技術(shù)細(xì)節(jié)。
在ER圖繪制完畢之后,開(kāi)始將它映射為數(shù)據(jù)庫(kù)的各種關(guān)系表的過(guò)程,叫做邏輯模型建模,或者關(guān)系建模。
可能您會(huì)有疑問(wèn),ER圖不是可以直接映射到關(guān)系嗎,而且已經(jīng)有了相應(yīng)的映射工具了,為什么還要繪制ER圖多此一舉呢?ER圖是拿出去和別人談需求的,要求各方人員都能看得懂。而關(guān)系表涉及到了過(guò)多實(shí)現(xiàn)細(xì)節(jié),比如:要給多對(duì)多聯(lián)系/多值屬性等多建一張表、要設(shè)置外碼、各種復(fù)合主碼等。這些東西不應(yīng)該在談需求的時(shí)候出現(xiàn),它們應(yīng)當(dāng)對(duì)非開(kāi)發(fā)人員透明。而且ER圖中每個(gè)屬性只會(huì)出現(xiàn)一次,減少了蘊(yùn)含的信息量,是更好的交流和文檔化工具。
其實(shí),ER模型所蘊(yùn)含的信息,也沒(méi)有全部被邏輯模型包含。比如:聯(lián)系的自定義基數(shù)約束、實(shí)體的復(fù)合屬性和派生屬性、用戶(hù)的自定義約束等。因此ER模型,在整個(gè)開(kāi)發(fā)流程(如物理模型建模,甚至前端開(kāi)發(fā))中是都會(huì)用到的,不能認(rèn)為ER模型轉(zhuǎn)換到邏輯模型后,就沒(méi)有任何作用了。
邏輯模型設(shè)計(jì)好后,就可以開(kāi)始著手?jǐn)?shù)據(jù)庫(kù)的物理實(shí)現(xiàn)了。數(shù)據(jù)庫(kù)的物理實(shí)現(xiàn)也被稱(chēng)為物理模型建模,這個(gè)階段不但需要參照邏輯模型,還應(yīng)當(dāng)參照ER圖。



























