Sql Server系列:規範化及基本設計

libingql發表於2015-05-04

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沒有辦法在物理上建立直接的多對多關係,因此通過中間表來組織關係,中間表稱為關聯表。

相關文章