數(shù)據(jù)庫(kù)(2)---數(shù)據(jù)庫(kù)關(guān)系建模

【聲明】本文章來(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圖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容