1. 程式人生 > >數據表對應關系(一對一、一對多、多對多)

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

結果 ng- 垂直切分 包含 varchar 商品 記錄 padding borde

? 前言

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

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

技術分享

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