iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

後端工程師與圖的修練系列 第 13

實體關聯性模型圖 ER/EER Diagram

ER Diagram (Entity Relationship Model) 是一個非常熱門的資料庫圖形,這篇文章會介紹兩大軟體呈現的 ER 圖形以及非物理資料庫的 ER 圖, EER 圖區別。

區分兩者名詞的不同:
ER 圖: Entity Relationship (實體關聯性模型)
EER 圖: Enhanced Entity Relationship (增強實體關聯性模型)

首先,要先介紹 wiki [1] 上的 ER 圖怎麼看,請見下圖:

https://ithelp.ithome.com.tw/upload/images/20210923/20092753Yv3g2wXE0A.png

上圖對照畫葫蘆的方式,告訴你圖片中有幾種重要的元素: 屬性實體關聯性關聯線

對照資料庫的方式描述什麼是屬性實體,其實就等同於作曲家資料表的屬性:

CREATE TABLE 作曲家 (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, -- 在 PostgreSQL ,型別直接用 SERIAL 代替 AUTO_INCREMENT
    name VARCHAR(255) NOT NULL, 
    age INT NOT NULL,
    nationally VARCHAR(255) NOT NULL
);

關聯性則是在描述一個邏輯,也可以是業務邏輯,比方說作曲家使用【寫作】這個關聯性,產生音樂資料表中的資料。

關聯線則不會那麼簡單的介紹了,上圖中其實是用通用且含糊 (general) 的劃線法帶過了實體關聯性的畫法。

關聯線,表示著透過關聯這個東西的映射帶出的結果,比方說在 Wiki 版圖中,他是這樣表示一個角色有(has) 一個帳號,包含 (contains) 在一個區域中。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753wpUK6gifcf.png

其中: 包含就是一種關聯,而為什麼我會知道是角色有(has) 一個帳號角色包含(contains) 在一個區域,這是因為這條線寫明了:

https://ithelp.ithome.com.tw/upload/images/20210923/200927536MAtOCNSOt.png

https://ithelp.ithome.com.tw/upload/images/20210923/20092753nqypbHtg8o.png

用讀法來了解的話,從左至右讀:
角色 n 個,有包含 1 個區域; 帳號一個,有 n 個角色。

從右至左讀:
1 個區域,包含 n 個角色; 每一個角色 (角色 n 個),有一個所屬帳號。

聽起來合理,但到底有幾種關聯法,其實只有 3 種:

  1. 1 對 1 (1-1)
  2. 多對 1 (1-many, many-1)
  3. 多對多 (many-to-many)

數學的來看,其實這些都是函數的映射關係:

1 對 1

1 對 1 關聯是最常見的關聯方法,舉個例子像是: 1 個公民有 1 個身分證,你不可能有兩個身分,這就是絕對的一對一關聯。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753UhRRq9w7Uf.png

多對 1

多對一是先後順序的差別以外,其實也是資料庫設計的差別,這樣的資料中,舉一個例子就是訂單與訂單分期,一筆訂單可以有很多筆分期,每一筆分期都只有一筆訂單,而且是屬於一筆訂單。 (訂單集合就是 A,分期集合就是 B。)

https://ithelp.ithome.com.tw/upload/images/20210923/20092753EOQdIL1dzh.png

多對多

多對多的映射要怎麼看? 多對多的關聯性,必須要透過再加上一個 C ,來協助映射 A, B 的內容,通常是 A,B 不直接有關係,但可以透過 C 讓他們有關係。

比方說,你有一堆分類和一堆文章,你要透過 Hashtag 來幫每篇文章加上很多個分類,Hashtag 就是 C,他就記錄了一篇文章(A) 有哪些分類 (B),正反的來說都可以,一個分類有多個文章、一個文章有多個分類、多個文章有多個分類。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753e56iLQK6Pt.png

這三個關聯性,Wiki 的範例圖的表達方式,就是在關聯性上用 1, n, m 表示:

https://ithelp.ithome.com.tw/upload/images/20210923/20092753yXjcAfyebA.png

資料庫的關聯性

因為資料庫較制式化,所以資料庫的關聯的種類不多,比方說:

  1. belongs_to (屬於) (資料庫的 foreign key)
  2. Has one (有一個) (不在資料庫畫圖,你可以在軟體定義 ORM Relation)
  3. Has many (有許多個) (不在資料庫畫圖,你可以在軟體定義 ORM Relation)

*多對多需要建立一個新的 Many-to-Many Table,然後使用 has many 就可以做到。 (這需要一張新的 table)

將 Entity 指向到一個關聯性再指出去,這個圖表不會在下方要介紹的兩個資料庫軟體提供的圖表中發生,但你可以把關聯性寫在軟體 ORM (或是像是: 抽象資料庫框架 (Ecto)) 中,這並不像最上方介紹的圖表一樣可以填上各種不同的關聯性,比方說: 提供、包含…etc 等等,若希望定義非制式關聯,應該採用表達概念這個策略來繪製圖表。

簡單來說,在資料庫 Diagram 圖中,關聯性直接被話語: 1對1、多對多、1對多、多對1 涵蓋過去,並不會多解釋事務關聯,而是只會表達資料關聯。

使用 Dbeaver 這個軟體,直接打開任何 Table 上面的 Tab 就可以切換到 ER Diagram 這個視窗:

https://ithelp.ithome.com.tw/upload/images/20210923/200927534rXRlnVqd6.png

基本上,屬性跟 Entity 都沒什麼好提的,不一樣的地方在於資料關聯畫法不一樣,以及 Dbeaver 圖表上是寫 EER Diagram。

官方文件 [8] 寫得很清楚 ,在最後面提到了 Relationship Notation (關係符號) 畫法:

https://ithelp.ithome.com.tw/upload/images/20210923/20092753aIftNvQi8J.png

這個作畫法是根據 IDEF1x 標準製作的 [9],[10]。

使用 MySQL Workbench 這個軟體,可以到 Reverse Engineer 去導出一張 Diagram,然後你可以在上面作畫:

https://ithelp.ithome.com.tw/upload/images/20210923/200927531zlcbv3tWf.png

基本上,屬性跟 Entity 都沒什麼好提的,不一樣的地方在於資料關聯畫法不一樣,以及 MySQL Workbench 圖表上是寫 EER Diagram。

而關聯性的畫法,在 MySQL Workbench 其實可以挑選 [14],挑選方式是使用選單的 Model -> Relationship Notation:

  • Crow's Foot(IE)
  • Classic
  • Connect to Columns
  • UML
  • IDEF1X

預設的畫法 IE 還是可以參考下方的表示方式 [12]:

https://ithelp.ithome.com.tw/upload/images/20210923/20092753jzet51lPvw.png

以及在 [11] 這個文章中有稍微對比了一下 IDEF1X 跟 IE 畫法對照。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753jK4mj9YRA9.png

兩個資料庫提供的 ER Diagram 不同,MySQL Workbench 給的是 EER Diagram,所以下方來描述一下 EER Diagram。

EER Diagram 是 ER Diagram 的升級版,對於 [17][22] 的描述方式,從原本的 ERD 中多了 4 個元素:

  • Aggregation - Attribute or relationship inheritances (聚合 - 屬性/關聯性的繼承)
  • Category or union types (分類或是 UNION 的型別)
  • Specialization and generalization (專一化及泛化)
  • Subtypes and supertypes (Subclasses and superclasses) (子型別、超型別(父型別),有時稱: 子類別、超類別(父類別))

但是這四個元素並非圖形定義,而是對於 ER 概念的增強 (或者稱為 ERD 正規化的方法),要開始設計 EERD 之前,你至少需要一個完整的 ERD 圖表,才開始做這相關的規劃:

  1. 做出子類別/超類別(父類別)

舉例像是,當你的屬性 (Table Column) 資料中有 Shape (形狀),則可以再分離出形狀的子類型,Shape 就是超類型(父類型),Square(方)、Circle(圓)、Triangle(三角)都是子類型。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753GHp4njisRW.jpg

  1. 專一化、泛化

泛化舉例像是把比較詳細的資料,組合形成一個概念的實體,像是老虎、獅子、大象都可以被泛化成實體。

https://ithelp.ithome.com.tw/upload/images/20210923/200927537Bxm0vmAlf.jpg

專一化則是泛化的逆操作,他就是專門拆解一個概念的實體變成詳細的資料,像是員工可以被拆成測試人員、開發人員。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753jDuNhFlfCs.jpg

  1. 分類及 UNION

分類可以用來表示不同的類別之間的關係,可以表達全部或是部分的關聯性,例如像是:

有一車主 Owner 要預訂一台汽車,Owner 可以是公司行號、銀行或是個人的名義訂車。

Owner 是這三個類別 (Person, Bank, Company 三者並集) 的子集。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753oCthuRTxwX.jpg

  1. 聚合 Aggregation

具體的來說,他把兩個實體 (Collage, Course) 直接當作同一個實體來看待,也就是他抽象了這兩個實體,變成一個對象 (可能叫做教育)。

像是,下圖框起來表示你要描述的是學生 (Student) 與 (教育 = (Collage + Course)) 的關係,不過這個概念可能可以再更加抽象化。

https://ithelp.ithome.com.tw/upload/images/20210923/20092753T2n7de5ak6.jpg

以上圖自 [22],而更多 EERD 實作細節可另行參考 [22] 。

References:
[1] https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model
[2] https://www.geeksforgeeks.org/introduction-of-er-model/
[3] https://medium.someone.tw/entity-relationship-diagram-bb2bbd777b6e
[4] https://medium.com/twelvefish/%E4%BA%8C-%E5%80%8B%E9%AB%94%E9%97%9C%E4%BF%82%E6%A8%A1%E5%9E%8B-er-model-35920fb819d9
[5] https://medium.com/pierceshih/%E7%AD%86%E8%A8%98-%E5%AF%A6%E9%AB%94%E9%97%9C%E8%81%AF%E5%9C%96-87c3ecbc5ff0
[6] https://www.mysql.tw/2013/03/entity-relationship-model.html
[7] https://notes.andywu.tw/2018/%E8%B3%87%E6%96%99%E5%BA%AB-%E9%97%9C%E8%81%AF%E4%BB%8B%E7%B4%B9-%E4%B8%80%E5%B0%8D%E4%B8%80%E3%80%81%E4%B8%80%E5%B0%8D%E5%A4%9A%E3%80%81%E5%A4%9A%E5%B0%8D%E5%A4%9A/
[8] https://dbeaver.com/docs/wiki/Database-Structure-Diagrams/
[9] https://github.com/dbeaver/dbeaver/issues/1017
[10] http://www.32geeks.com/classes/resources/IDEF1X_Cheat_Sheet.pdf
[11] https://astah.net/support/astah-pro/user-guide/er-diagram/
[12] https://www.lucidchart.com/pages/ER-diagram-symbols-and-meaning
[13] https://newbedev.com/understanding-arrow-tips-in-mysql-workbench-eer-diagram
[14] https://qiita.com/noborus/items/11438d16f790b1d42ad8
[15] https://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html
[16] https://dev.mysql.com/doc/workbench/en/wb-relationship-editor.html
[17] https://cacoo.com/blog/er-diagrams-vs-eer-diagrams-whats-the-difference/
[18] https://medium.com/nerd-for-tech/drawing-er-and-eer-diagrams-mapping-4965e2b3cc3e
[19] http://faculty.stust.edu.tw/~jehuang/oracle/ch2/2-1.htm
[20] https://www.cherryknow.com/tech/531599.html
[21] https://cloud.tencent.com/developer/ask/94078
[22] https://www.lucidchart.com/pages/enhanced-entity-relationship-diagram
[23] https://www.tutorialride.com/dbms/enhanced-entity-relationship-model-eer-model.htm


上一篇
屬性圖模型 Property Graph Diagram
下一篇
IDEF 構圖方法
系列文
後端工程師與圖的修練31

尚未有邦友留言

立即登入留言