ER Diagram (Entity Relationship Model) 是一個非常熱門的資料庫圖形,這篇文章會介紹兩大軟體呈現的 ER 圖形以及非物理資料庫的 ER 圖, EER 圖區別。
區分兩者名詞的不同:
ER 圖: Entity Relationship (實體關聯性模型)
EER 圖: Enhanced Entity Relationship (增強實體關聯性模型)
首先,要先介紹 wiki [1] 上的 ER 圖怎麼看,請見下圖:
上圖對照畫葫蘆的方式,告訴你圖片中有幾種重要的元素: 屬性、實體、關聯性、關聯線。
對照資料庫的方式描述什麼是屬性、實體,其實就等同於作曲家資料表的屬性:
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) 在一個區域中。
其中: 有、包含就是一種關聯,而為什麼我會知道是角色有(has) 一個帳號、角色包含(contains) 在一個區域,這是因為這條線寫明了:
用讀法來了解的話,從左至右讀:
角色 n 個,有包含 1 個區域; 帳號一個,有 n 個角色。
從右至左讀:
1 個區域,包含 n 個角色; 每一個角色 (角色 n 個),有一個所屬帳號。
聽起來合理,但到底有幾種關聯法,其實只有 3 種:
數學的來看,其實這些都是函數的映射關係:
1 對 1 關聯是最常見的關聯方法,舉個例子像是: 1 個公民有 1 個身分證,你不可能有兩個身分,這就是絕對的一對一關聯。
多對一是先後順序的差別以外,其實也是資料庫設計的差別,這樣的資料中,舉一個例子就是訂單與訂單分期,一筆訂單可以有很多筆分期,每一筆分期都只有一筆訂單,而且是屬於一筆訂單。 (訂單集合就是 A,分期集合就是 B。)
多對多的映射要怎麼看? 多對多的關聯性,必須要透過再加上一個 C ,來協助映射 A, B 的內容,通常是 A,B 不直接有關係,但可以透過 C 讓他們有關係。
比方說,你有一堆分類和一堆文章,你要透過 Hashtag 來幫每篇文章加上很多個分類,Hashtag 就是 C,他就記錄了一篇文章(A) 有哪些分類 (B),正反的來說都可以,一個分類有多個文章、一個文章有多個分類、多個文章有多個分類。
這三個關聯性,Wiki 的範例圖的表達方式,就是在關聯性上用 1, n, m 表示:
因為資料庫較制式化,所以資料庫的關聯的種類不多,比方說:
*多對多需要建立一個新的 Many-to-Many Table,然後使用 has many 就可以做到。 (這需要一張新的 table)
將 Entity 指向到一個關聯性再指出去,這個圖表不會在下方要介紹的兩個資料庫軟體提供的圖表中發生,但你可以把關聯性寫在軟體 ORM (或是像是: 抽象資料庫框架 (Ecto)) 中,這並不像最上方介紹的圖表一樣可以填上各種不同的關聯性,比方說: 提供、包含…etc 等等,若希望定義非制式關聯,應該採用表達概念這個策略來繪製圖表。
簡單來說,在資料庫 Diagram 圖中,關聯性直接被話語: 1對1、多對多、1對多、多對1 涵蓋過去,並不會多解釋事務關聯,而是只會表達資料關聯。
使用 Dbeaver 這個軟體,直接打開任何 Table 上面的 Tab 就可以切換到 ER Diagram 這個視窗:
基本上,屬性跟 Entity 都沒什麼好提的,不一樣的地方在於資料關聯畫法不一樣,以及 Dbeaver 圖表上是寫 EER Diagram。
官方文件 [8] 寫得很清楚 ,在最後面提到了 Relationship Notation (關係符號) 畫法:
這個作畫法是根據 IDEF1x 標準製作的 [9],[10]。
使用 MySQL Workbench 這個軟體,可以到 Reverse Engineer 去導出一張 Diagram,然後你可以在上面作畫:
基本上,屬性跟 Entity 都沒什麼好提的,不一樣的地方在於資料關聯畫法不一樣,以及 MySQL Workbench 圖表上是寫 EER Diagram。
而關聯性的畫法,在 MySQL Workbench 其實可以挑選 [14],挑選方式是使用選單的 Model -> Relationship Notation:
預設的畫法 IE 還是可以參考下方的表示方式 [12]:
以及在 [11] 這個文章中有稍微對比了一下 IDEF1X 跟 IE 畫法對照。
兩個資料庫提供的 ER Diagram 不同,MySQL Workbench 給的是 EER Diagram,所以下方來描述一下 EER Diagram。
EER Diagram 是 ER Diagram 的升級版,對於 [17][22] 的描述方式,從原本的 ERD 中多了 4 個元素:
但是這四個元素並非圖形定義,而是對於 ER 概念的增強 (或者稱為 ERD 正規化的方法),要開始設計 EERD 之前,你至少需要一個完整的 ERD 圖表,才開始做這相關的規劃:
舉例像是,當你的屬性 (Table Column) 資料中有 Shape (形狀),則可以再分離出形狀的子類型,Shape 就是超類型(父類型),Square(方)、Circle(圓)、Triangle(三角)都是子類型。
泛化舉例像是把比較詳細的資料,組合形成一個概念的實體,像是老虎、獅子、大象都可以被泛化成實體。
專一化則是泛化的逆操作,他就是專門拆解一個概念的實體變成詳細的資料,像是員工可以被拆成測試人員、開發人員。
分類可以用來表示不同的類別之間的關係,可以表達全部或是部分的關聯性,例如像是:
有一車主 Owner 要預訂一台汽車,Owner 可以是公司行號、銀行或是個人的名義訂車。
Owner 是這三個類別 (Person, Bank, Company 三者並集) 的子集。
具體的來說,他把兩個實體 (Collage, Course) 直接當作同一個實體來看待,也就是他抽象了這兩個實體,變成一個對象 (可能叫做教育)。
像是,下圖框起來表示你要描述的是學生 (Student) 與 (教育 = (Collage + Course)) 的關係,不過這個概念可能可以再更加抽象化。
以上圖自 [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