數據表對應關系(一對一、一對多、多對多)


Ø  前言

本文主要介紹數據表的關聯關系,這是數據庫設計的常見問題之一。一個好的表結構設計,可以減少一些不必要的表或字段等。數據表之間的關聯關系分為三種:一對一、一對多、多對多。下面就逐一介紹下:

 

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)   執行結果:

clip_image002


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM