ER 圖符號
ER 圖的符號大致分三種流派:資料庫工具畫的鴉爪表示法(Crow’s Foot,也稱 IE 表示法)、課堂上教的 Chen 表示法,以及用在資料上的 UML。三種都用方框表示資料表(實體),用方框之間的線表示關聯。不同的是基數(cardinality)的寫法,也就是一邊的一列對應另一邊的幾列。鴉爪表示法把符號畫在線的兩端,一條線要朝兩張資料表各讀一次。下面每個符號都附上讀法,由 ErdDocs 繪製,用的正是它畫在下方工具裡你自己的結構上的同一套表示法。
鴉爪表示法的線端代表什麼
在鴉爪表示法裡,一切都由線端決定。每一端最多疊兩個符號:靠近資料表的是最大值,外側的是最小值。
| 符號 | 名稱 | 讀法 | 例子 |
|---|---|---|---|
| 恰好一個 | 直線 + 直線:至少一個,至多一個 | 一筆訂單恰好屬於一位顧客 | |
| 零或一個 | 圓圈 + 直線:可有可無,至多一個 | 一位顧客至多有一張集點卡 | |
| 一或多個 | 直線 + 鴉爪:至少一個 | 一筆訂單至少有一筆明細 | |
| 零或多個 | 圓圈 + 鴉爪:任意數量,也可以沒有 | 一位顧客有零或多筆訂單 |
一條線的讀法
關聯線要朝兩張資料表各讀一次。經典的商店例子:
Chen、鴉爪與 UML 比較
| 概念 | Chen | 鴉爪 | UML |
|---|---|---|---|
| 實體 / 資料表 | 長方形 | 內含欄位清單的方框 | 類別方框 |
| 屬性 | 連到實體的橢圓 | 資料表方框中的一列 | 類別方框中的欄位 |
| 關聯 | 實體之間的菱形 | 兩端有基數符號的線 | 關聯線 |
| 基數 | 菱形旁的 1、N、M | 線端的直線、圓圈與鴉爪 | 多重性 1、0..1、1..*、* |
| 主鍵 | 加底線的屬性名稱 | 欄位列上的鍵標記 | 刻板印象或屬性 |
原則:還在構想時用 Chen,和應用程式碼放在一起時用 UML,已經是資料庫時用鴉爪。ErdDocs 直接從貼上的結構畫出的,就是最後這種。
教科書裡沒有的符號:虛線
真實的 dump 常常沒有外鍵。Rails、Django、Laravel 的應用程式在程式碼裡維護關聯,資料庫什麼也不宣告。ErdDocs 為這種情況多加了一個符號。實線是資料庫宣告的關聯,虛線是從欄位名稱(user_id → users)推斷的關聯。前者是約束,後者是有根據的推測。
在真正的結構上看符號
把你的 SQL 貼進下方工具。它會依據找到的外鍵與唯一約束,在每條線的「多」端畫上鴉爪。
常見問題
鴉爪符號代表什麼?
每個線端最多兩個符號。靠近資料表的是最大值:直線表示「至多一個」,三叉的鴉爪表示「多個」。外側的是最小值:直線表示「至少一個」,圓圈表示「可以是零」。所以圓圈 + 鴉爪讀作「零或多個」,直線 + 直線讀作「恰好一個」。
該用 Chen 還是鴉爪表示法?
教學與概念設計用 Chen。菱形讓關聯成為獨立的元素,正符合課堂需要。真實資料庫用鴉爪。每張資料表一個方框、欄位寫在裡面,這就是結構真正的樣子。
多對多關聯怎麼表示?
兩端都畫鴉爪。在實體結構中,多對多是用中介資料表實作的(orders 與 products 之間的 order_items)。所以畫真實資料庫的工具,會顯示兩條一對多的線匯集在這張中介資料表上。
為什麼資料庫工具不畫 Chen 的菱形與橢圓?
因為在實體資料庫裡,Chen 分開畫的那些東西會合併成資料表與欄位。屬性的橢圓,就是資料表方框裡的一列。關聯的菱形,要嘛是一個外鍵欄位,要嘛是一張中介資料表。把它們畫成獨立的圖形,圖會大上一倍,卻看不出任何新東西。