Mysql_3 ER 和 EER 模型
本文思路主要來源于駱昊jackfrued 老師的網課
僅供本人學習參考,未做其他用途!
在此也建議讀者通過老師的課程學習。
介紹
為什么要有 ER 圖和 EER 圖的存在?
**真正做項目、設計數據庫時,**實際并沒有這么簡單,比如還有很多用戶看不到、但為了方便 DBA 使用而創建的字段。如 id,一般還會有兩條 Date 字段(一表示這條記錄被創建的時間,二表示這條記錄最后更新的時間),以及預留一個 VARCHAR / json 字段;還有一些其他注意事項(比如 auto-increment 約束其實開發中不常用,更多使用算法比如分布式 ID 生成算法(如 SnowFlake……)當然對課程來說這并不重要)是不可能一上來就寫 SQL 語句的,需要先設計表的結構和表之間的關系。
ER 模型
ER 圖(Entity Relationship, 實體關系)因此出現。下圖是一個 ER 圖的示例,其中矩形框代表:表(也就是實體),橢圓框代表:表中的字段(實體的屬性),菱形框代表:關系,在連接線上表明了關系的重數。
相較于大段的 SQL 建表語句,只要能看懂 ER 圖,表的結構、關系一目了然。
EER 模型
以下部分內容有參考自文章:為了徹底搞清楚數據庫 E-R 模型設計,我肝了這篇萬字長文 - 知乎 (zhihu.com)
關于兩者的具體區分我還有去問b站up主 駱昊jackfrued 老師,老師表示:不用太糾結這個問題,ER圖更抽象,可以理解為概念模型圖(PowerDesigner)。
相較 ER 模型多了泛化層次、匯集層次、弱實體等概念。
泛化層次
包括 generalization 和 specialization (泛化和特化)、父類(superclass)和子類(subclass)的概念。
子類父類就是類似 Java 的繼承,如動物是父類,貓、狗是其子類。子類父類是一對一的關系!
泛化又叫歸納,就是將幾個類的共同屬性提取出來作為父類;
特化又叫演繹,就是在父類的基礎上添加各自特殊的屬性作為子類。
其中,子類和超類又有兩個關系屬性:mandatory 和 optional、disjoint 和 overlapping。
mandatory / optional:父類中的所有屬性都必須包含在每一個子類中 / 不用全部繼承,選擇部分繼承即可(完全性限制)
disjoint / overlapping:繼承同一個父類的幾個子類之間是否可以有相交的屬性(相交性限制)
圖中 運輸工具是父類,飛機、火車、汽車是子類。圓圈中寫 D / O,表示 disjoint / overlapping。父類和圓圈之間是雙實線,表示是 mandatory 完全性繼承。
匯集層次
Aggregation, 匯集層次不再有父類子類的區別,而是由……組成的區別。
如圖,房間、門窗、電腦、投影儀等是教室的組成部分,不是繼承關系。
弱實體
一種實體只有另一種實體存在的時候才有意義。如父母和子女,少了一方另一方就沒有意義了。
Workbench 等工具支持畫 ER 圖,甚至畫好后可以自動生成 SQL 語句建表。 Workbench 中的圖是 EER 圖(擴展的ER 圖)
在 EER 圖下,點擊 DATABASE - FORWARD ENGINEER 正向工程,可以選擇要生成的表、字段,生成 SQL 語句建立表。
自動生成的 SQL 語句中,外鍵下方有兩句話ON DELETE NO ACTION ON UPDATE NO ACTION,意為:當外鍵參考的主鍵修改/刪除時,外鍵所在的表會受到什么樣的影響?——不采取任何行動。建議去掉這兩句話。如果去掉,就不能隨便修改/刪除外鍵在使用的主鍵。
同樣地,在 SQL 語句頁面,點擊DATABASE - REVERSE ENGINEER 反向工程,可以根據表的結構生成 EER 圖。
Power Designer 建模工具,也支持正 / 反向工程,可以生成 SQL 方言。完整版付費。
總結
以上是生活随笔為你收集整理的Mysql_3 ER 和 EER 模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数模板与类模板
- 下一篇: Mysql深度讲解 – 子查询优化