Ø 前言
本文主要介紹數據表的關聯關系,這是數據庫設計的常見問題之一。一個好的表結構設計,可以減少一些不必要的表或字段等。數據表之間的關聯關系分為三種:一對一、一對多、多對多。下面就逐一介紹下:
1. 一對一
Ø 一對一是將數據表“垂直切分”,其實是不常見,或不常用的。也就是 A 表的一條記錄對應 B 表的一條記錄,為什么要這樣的設計呢,不是增加了程度的復雜性嗎,然而並不一定,舉例說明:
1) 一個系統必然有 Employee(員工表)(包含字段:EmployeeId、姓名、性別、年齡、電話、地址等),每個員工都為一個用戶,所以還有張 User 表(包含字段:UserId(關聯 EmployeeId)、用戶名、密碼、角色等),這樣你會發現,整合為一張表是否不太妥當?因為,User 的記錄只會在登錄時用到,感覺有點違背三大范式中的“確保每列都和主鍵列直接關聯,而不是間接關聯”。
2) 還有種情況,這就要根據具體的業務來決定了。如果,當一張表的字段過於太多,而很多字段可能只有在某些情況下,才會使用到,這時也可以考慮使用一對一設計。
Ø 優點
1. 便於管理、可提高一定的查詢速度
2. 減輕 CPU 的 IO 讀寫,提高存取效率。
3. 符合數據庫設計的三大范式。
4. 符合關系性數據庫的特性。
Ø 缺點
1. 增加一定的復雜程度,程序中的讀寫難度加大。
2. 一對多
Ø 一對多,是最常見的一種設計。就是 A 表的一條記錄,對應 B 表的多條記錄,且 A 的主鍵作為 B 表的外鍵。這主要看以哪張表為中心,以上示例以 A 表為中心,就是一對多,如果以 B 表為中心,則是多對一。舉幾個例子:
1. 班級表 與 學生表,一個班級對應多個學生,或者多個學生對應一個班級。
2. 角色表 與 用戶表,一個角色對應多個用戶,或者多個用戶對應一個角色。
3. 商品表 與 圖片表,一個商品對應多張圖片,或者多張圖片對應一個商品。
3. 多對多
Ø 多對多,在數據庫中也比較常見,可以理解為是一對多和多對一的組合。要實現多對多,一般都需要有一張中間表(也叫關聯表),將兩張表進行關聯,形成多對多的形式。例如:
1. 老師表、班級表、科目表,中間表為:課程表
1) SQL:
--教師表
CREATE TABLE #Teacher(TeacherId int, Name nvarchar(20));
INSERT INTO #Teacher VALUES(1, '張老師'), (2, '王老師');
--班級表
CREATE TABLE #Class(ClassId int, Name nvarchar(20));
INSERT INTO #Class VALUES(1, '一班'), (2, '二班');
--課程表(關聯表)
CREATE TABLE #Courses(CoursesId int IDENTITY(1, 1), TeacherId int, ClassId int, Name nvarchar(20));
INSERT INTO #Courses VALUES(1, 1, '語文'), (1, 2, '語文');
INSERT INTO #Courses VALUES(2, 1, '數學'), (2, 2, '英語');
SELECT T1.TeacherId, T2.Name, T1.ClassId, T3.Name, T1.Name FROM #Courses AS T1, #Teacher AS T2, #Class AS T3
WHERE T1.TeacherId=T2.TeacherId AND T1.ClassId=T3.ClassId
DROP TABLE #Teacher, #Class, #Courses;
2) 執行結果: