1 理解表
表是具有相同常規屬性(attribute)的資料例項的集合。這些資料例項組成資料行和列。
2 資料表設計正規化
2.1 第一正規化
第一正規化(1NF)是關於消除重複資料組和保證原子性的規範化。理解為建立主鍵,將任何重複的資料組移動到新的表中,為這些表建立新鍵,如此進行下去。
2.2 第二正規化
第二正規化(2NF)的兩個規則:
◊ 表必須符合第一正規化
◊ 每列必須依賴於整個鍵
2.3 第三正規化
第三正規化的3個原則:
◊ 表必須符合2NF
◊ 任何列都不能依賴於非鍵列
◊ 不可以有派生的資料
示例:
在OrderDetails表中,Subtotal列通過Quantity與UnitPrice相乘得到,這是不符合第三正規化的。但這樣設計是為了速度,WHERE Subtotal > 100的查詢比讀入 WHERE Quantity * UnitPrice > 100 的查詢快得多,尤其是在Subtotal進行索引時。
3 理解關係
3.1 一對一關係
一對一關係指如果在一個表中有一個記錄,那麼在另一個表中也會有一個與之匹配的記錄。
3.2 零或一對一關係
零或一對一關係在本質上與一對一關係相同,不同的是關係的一方可以選擇有一個記錄或者沒有記錄。
在SQL Server中,強制實施零或一對一關係的方式:
◊ 唯一鍵約束或者主鍵約束和外來鍵約束的組合。外來鍵約束可以實現在“一”表中必須至少存在一個記錄,但是不能確保只存在一個記錄(可能有多個記錄)。使用主鍵約束和唯一鍵約束能確保只有一個記錄。
◊ 觸發器。
3.3 一對一或一對多關係
這是一種常見的外來鍵關係,通常以主表/從表關係形式出現。
3.4 一對零、一對一或一對多關係
這是另外一個更常見的外來鍵關係,在實現方面的區別在於引用欄位(在有外來鍵約束的表中)允許為空;即實際上在“一”表中有一個記錄,而在這個引用表(外來鍵約束的從表)中未必有任何匹配的記錄。
在SQL server中,實現這種關係的方式:
◊ 外來鍵約束:只需要在作為關係中“多”方的表上宣告外來鍵約束,引用作為關係中“一”方的表和列(可以確保在被引用表中只有一方,被外來鍵引用的列必須要有主鍵約束或者唯一約束)
◊ 觸發器:在作為關係中“多”方的表中新增觸發器,用於檢查在該表中插入或修改任何行在被依賴表(關係中的“一”方)中有一個匹配的行。
3.5 多對多關係
在這種關係中,關係的雙方都可以有多個記錄匹配。相關的示例是產品和訂單的關係。一個特定的訂單可能有多個不同的產品,一個特定的產品可以訂購多次。
SQL Server沒有辦法在物理上建立直接的多對多關係,因此通過中間表來組織關係,中間表稱為關聯表。