ErdDocs

ER 圖符號

ER 圖的符號大致分三種流派:資料庫工具畫的鴉爪表示法(Crow’s Foot,也稱 IE 表示法)、課堂上教的 Chen 表示法,以及用在資料上的 UML。三種都用方框表示資料表(實體),用方框之間的線表示關聯。不同的是基數(cardinality)的寫法,也就是一邊的一列對應另一邊的幾列。鴉爪表示法把符號畫在線的兩端,一條線要朝兩張資料表各讀一次。下面每個符號都附上讀法,由 ErdDocs 繪製,用的正是它畫在下方工具裡你自己的結構上的同一套表示法。

鴉爪表示法的線端代表什麼

在鴉爪表示法裡,一切都由線端決定。每一端最多疊兩個符號:靠近資料表的是最大值,外側的是最小值。

符號名稱讀法例子
恰好一個恰好一個直線 + 直線:至少一個,至多一個一筆訂單恰好屬於一位顧客
零或一個零或一個圓圈 + 直線:可有可無,至多一個一位顧客至多有一張集點卡
一或多個一或多個直線 + 鴉爪:至少一個一筆訂單至少有一筆明細
零或多個零或多個圓圈 + 鴉爪:任意數量,也可以沒有一位顧客有零或多筆訂單
鴉爪表示法速查卡,四種線端符號:恰好一個(直線與直線)、零或一個(圓圈與直線)、一或多個(直線與鴉爪)、零或多個(圓圈與鴉爪)鴉爪表示法速查卡,四種線端符號:恰好一個(直線與直線)、零或一個(圓圈與直線)、一或多個(直線與鴉爪)、零或多個(圓圈與鴉爪)
同樣的四種線端,整理成一張卡片。可以直接存下,或下載 SVG 的淺色版或深色版。

一條線的讀法

關聯線要朝兩張資料表各讀一次。經典的商店例子:

朝 orders:一位顧客有零或多筆訂單。朝 customers:一筆訂單恰好屬於一位顧客。customersorders
朝 orders:一位顧客有零或多筆訂單。朝 customers:一筆訂單恰好屬於一位顧客。

完整的讀法規則,包括結構只知道一半時這些符號代表什麼,都在鴉爪表示法頁面。至於該選哪種組合,是基數的問題。

Chen、鴉爪與 UML 比較

概念Chen鴉爪UML
實體 / 資料表長方形內含欄位清單的方框類別方框
屬性連到實體的橢圓資料表方框中的一列類別方框中的欄位
關聯實體之間的菱形兩端有基數符號的線關聯線
基數菱形旁的 1、N、M線端的直線、圓圈與鴉爪多重性 1、0..1、1..*、*
主鍵加底線的屬性名稱欄位列上的鍵標記刻板印象或屬性

原則:還在構想時用 Chen,和應用程式碼放在一起時用 UML,已經是資料庫時用鴉爪。ErdDocs 直接從貼上的結構畫出的,就是最後這種。

教科書裡沒有的符號:虛線

真實的 dump 常常沒有外鍵。Rails、Django、Laravel 的應用程式在程式碼裡維護關聯,資料庫什麼也不宣告。ErdDocs 為這種情況多加了一個符號。實線是資料庫宣告的關聯,虛線是從欄位名稱(user_id → users)推斷的關聯。前者是約束,後者是有根據的推測。

虛線:dump 裡沒有 FOREIGN KEY,這條線來自命名慣例。usersposts
虛線:dump 裡沒有 FOREIGN KEY,這條線來自命名慣例。

在真正的結構上看符號

把你的 SQL 貼進下方工具。它會依據找到的外鍵與唯一約束,在每條線的「多」端畫上鴉爪。

你的結構

常見問題

鴉爪符號代表什麼?

每個線端最多兩個符號。靠近資料表的是最大值:直線表示「至多一個」,三叉的鴉爪表示「多個」。外側的是最小值:直線表示「至少一個」,圓圈表示「可以是零」。所以圓圈 + 鴉爪讀作「零或多個」,直線 + 直線讀作「恰好一個」。

該用 Chen 還是鴉爪表示法?

教學與概念設計用 Chen。菱形讓關聯成為獨立的元素,正符合課堂需要。真實資料庫用鴉爪。每張資料表一個方框、欄位寫在裡面,這就是結構真正的樣子。

多對多關聯怎麼表示?

兩端都畫鴉爪。在實體結構中,多對多是用中介資料表實作的(orders 與 products 之間的 order_items)。所以畫真實資料庫的工具,會顯示兩條一對多的線匯集在這張中介資料表上。

為什麼資料庫工具不畫 Chen 的菱形與橢圓?

因為在實體資料庫裡,Chen 分開畫的那些東西會合併成資料表與欄位。屬性的橢圓,就是資料表方框裡的一列。關聯的菱形,要嘛是一個外鍵欄位,要嘛是一張中介資料表。把它們畫成獨立的圖形,圖會大上一倍,卻看不出任何新東西。

相關頁面

  • ER 圖:實體、關聯,以及概念模型在哪裡變成資料表。
  • 鴉爪表示法:讀法規則與實際範例。
  • ER 圖的基數:真實的資料庫如何決定一條線該有哪些符號。
  • ER 圖範例:十四份完整的結構,每份都有 ER 圖與資料字典。