系統說明關聯式資料庫中表與表之間的三種基本關聯關係,附實例資料與實務應用場景。
定義: 表 A 的每一行對應表 B 的至多一行,反之亦然。
實例: 員工基本資料表 + 員工敏感資料表 (薪資、身分證)
-- 員工基本表
emp_id | name | dept
-------|--------|-----
1001 | 王大錘 | IT
1002 | 吉澤明步 | HR
-- 員工敏感表 (一對一)
emp_id | salary | id_card
-------|--------|---------
1001 | 50000 | A123456789
1002 | 60000 | B987654321
應用場景:
定義: 表 A 的一行對應表 B 的多行,但表 B 的每行只對應表 A 的一行。
實例: 客戶表 → 訂單表 (一客戶多訂單)
-- 客戶表
cust_id | name
--------|-----
1001 | 王大錘
1002 | 吉澤明步
-- 訂單表 (外鍵 cust_id 關聯客戶)
order_id | cust_id | amount | order_date
---------|---------|--------|-----------
10001 | 1001 | 500 | 2023-01-01
10002 | 1001 | 300 | 2023-01-15
10003 | 1002 | 800 | 2023-02-01
定義: 表 A 的一行對應表 B 的多行,表 B 的一行也對應表 A 的多行。
實作: 必須引入中間關聯表 (Junction Table),將多對多拆解為兩個一對多。
實例: 學生表 ↔ 課程表 (透過 選課表 關聯)
-- 學生表
stu_id | name
-------|-----
1001 | 王大錘
1002 | 吉澤明步
-- 課程表
course_id | name
----------|-----
C001 | 數學
C002 | 英文
-- 選課表 (中間表,雙主鍵/複合主鍵)
stu_id | course_id | score
-------|-----------|------
1001 | C001 | 90
1001 | C002 | 85
1002 | C001 | 78
| 關係 | 外鍵位置 | 中間表 | 典型範例 |
|---|---|---|---|
| 1:1 | 任一表 (通常放從表) | 不需要 | 用戶-用戶詳情 |
| 1:N | N 端 (多的一方) | 不需要 | 部門-員工、客戶-訂單 |
| M:N | 雙方都不放 | 需要 | 學生-課程、用戶-角色、商品-標籤 |