实体关联性模型图 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


<<:  [Day 9] - 『转职工作的Lessons learned』 - GraphQL (Hasura) - Webhook身份验证

>>:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day8

使用 Quick Reply 改善 Line Bot 互动

昨天了解各种 Line 的 Message Type 後,今天就运用其中的格式来优化验证码小帮手的互...

Day29:翻译蒟蒻

当我们的程序可能会有其他语言使用者时,就得开始考虑国际化的问题了,专业术语叫i18n: i n t ...

[鼠年全马] W40 - 用GithubPages写下完美句点

这篇是今年的最後一篇~ 最近有个需求是要架个对外的站台,内容是作品集展示之类的东东 上网估狗了一下有...

企划实现(8)

立案流程 第五步: 完成以上步骤後就会有以下8份文件公司名称预查核定书、公司章程、董事愿任核定书、股...

进击的软件工程师之路-软件战斗营 第二周

学习进度 第一周的练习小考与检讨 课後练习与习题检讨 继承、多型与介面 继承(extends)原则与...