什麼時候會需要這張圖
- 接手一個沒有文件的專案,要先弄清楚有哪些表、哪幾張是核心。
- 要跟不寫後端的人解釋兩張表之間的關聯,講十分鐘不如給一張圖。
- 寫遷移或刪資料之前,先確認有哪些表的外鍵指過來,避免留下孤兒資料。
- 做 code review 時,想快速確認新加的關聯到底是一對一還是一對多。
- 正式環境的 schema 不能貼到來路不明的線上工具,需要一個不上傳的做法。
三個步驟產生 ERD
- 開啟「如何取得 JSON schema」,選擇你的資料庫,複製查詢。
- 在資料庫執行該查詢,複製
erd_json欄位的內容。 - 貼回編輯區,畫布會自動排版。
想先看效果,直接按「載入範例」。現成查詢附了 PostgreSQL、MySQL 與 SQL Server 三種, 其他資料庫只要輸出相同格式也能用。
圖上會畫出哪些資訊
- 每張表是一個節點,節點標題依序是 schema、表名與表備註。
- 每個欄位佔一列,依序是欄名、型別與欄位備註。
- 星號代表該欄位為
NOT NULL。 - 預設值要把滑鼠移到欄位上才顯示,因為它通常很長,常駐會擠掉欄名的寬度。
- 徽章 PK 代表主鍵,FK 代表外鍵,UQ 代表單欄唯一。
- 關聯線接在具體欄位上,線上標示 1:1 或 1:N。
1:1 與 1:N 的判定規則
- 外鍵蓋滿子表的整個主鍵時判定為 1:1。
- 外鍵本身是單欄唯一時判定為 1:1。
- 其餘情況一律判定為 1:N。
- 複合主鍵中的單一欄位不算唯一,所以不會被判成 1:1。
JSON 需要哪些欄位
- 必填的只有
tables[].table與columns[].name。 schema可以省略。- 常見別名都接受,例如
table_name、column_name、data_type與is_nullable: "NO"。
{
"tables": [
{
"schema": "public",
"table": "users",
"comment": null,
"columns": [
{ "name": "id", "type": "bigint", "nullable": false,
"is_primary_key": true, "is_unique": false, "comment": null }
]
}
],
"relations": [
{ "constraint_name": "orders_user_id_fkey",
"from_schema": "public", "from_table": "orders", "from_columns": ["user_id"],
"to_schema": "public", "to_table": "users", "to_columns": ["id"],
"on_delete": "CASCADE" }
]
}查詢會排除哪些物件
- 三份查詢都跳過檢視表、序列、索引與系統 schema,只留 ERD 上有意義的物件。
- PostgreSQL 的查詢會跳過分區子表、保留分區父表,因為一張分區表會展開成幾十個子表。
- PostgreSQL 的查詢也會跳過分區上被複製的外鍵,否則同一條關聯會重複畫 N 次。
- FDW 外部表有納入,但它們不能建主鍵與外鍵,所以只有欄位清單、沒有關聯線。
你貼上的 schema 會不會離開瀏覽器
不會。解析與排版都在你的瀏覽器裡完成,沒有任何請求會把 schema 送出去,存檔也只寫進localStorage。細節見隱私權政策。
常見問題
- 這個工具可以直接連我的資料庫嗎?
- 不行,而且是刻意不做。它吃的是你自己在資料庫執行查詢後匯出的 JSON,站上沒有後端,也沒有任何連線功能,所以連線字串與帳號密碼不需要交給任何人。
- 可以存幾份 schema?
- 最多 50 份,存在這個瀏覽器的本機儲存空間裡。換一台電腦或清掉瀏覽資料就會不見,因為沒有伺服器可以同步。
- 我拖曳調整過的節點位置會被記住嗎?
- 不會。存檔存的是那份 JSON 文字本身,重新載入時會重跑一次自動排版,所以每次打開的版面都是一致的。
- 可以把關聯圖匯出成圖片嗎?
- 目前沒有匯出功能,請用作業系統的截圖工具。畫布可以縮放到 0.4 至 2 倍並自由拖曳,截圖前先把要的範圍調好。
- 為什麼有些表畫出來完全沒有關聯線?
- 通常是因為那些關聯沒有在資料庫層建外鍵,而是靠應用程式自己維護。這張圖只畫得出 JSON 的 relations 裡真的存在的外鍵,FDW 外部表也因為不能建鍵而只會有欄位清單。