首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

關聯式資料庫三大表關聯關係:一對一、一對多、多對多圖解

     編輯:MySQL 綜合教學

關聯式資料庫三大表關聯關係:一對一、一對多、多對多圖解

系統說明關聯式資料庫中表與表之間的三種基本關聯關係,附實例資料與實務應用場景。

一、一對一 (One-to-One)

定義: 表 A 的每一行對應表 B 的至多一行,反之亦然。

實例: 員工基本資料表 + 員工敏感資料表 (薪資、身分證)

-- 員工基本表
emp_id | name   | dept
-------|--------|-----
1001   | 王大錘 | IT
1002   | 吉澤明步 | HR

-- 員工敏感表 (一對一)
emp_id | salary | id_card
-------|--------|---------
1001   | 50000  | A123456789
1002   | 60000  | B987654321

應用場景:

  • 表欄位過多,拆分熱/冷資料提升查詢效能
  • 敏感欄位隔離,設定不同存取權限
  • 擴充欄位不想修改主表結構

二、一對多 (One-to-Many) - 最常見

定義: 表 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

三、多對多 (Many-to-Many)

定義: 表 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:NN 端 (多的一方)不需要部門-員工、客戶-訂單
M:N雙方都不放需要學生-課程、用戶-角色、商品-標籤

實務建議

  • 一對一罕見,優先考慮合併表或垂直分表
  • 一對多是主流,外鍵加索引、考慮級聯刪除/置空
  • 多對多中間表通常加上建立時間、狀態等屬性欄位
  • ER 圖設計階段即明確關係,避免後期重構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved