[英]SQL primary key on lookup table or unique constraint?
我想創建一個查詢表“ orderstatus”。 即下面,只是為了澄清這一點將在數據倉庫中使用。 如果需要,我將需要通過OrderStatus加入以檢索INT(如果我創建一個)以在其他地方使用。 例如,在事實表中,我會將int存儲在事實表中以鏈接到查找表。
+------------------------+------------------+
| OrderStatus | ConnectionStatus |
+------------------------+------------------+
| CLOSED | APPROVE |
+------------------------+------------------+
| COMPLETED | APPROVE |
+------------------------+------------------+
| FULFILLED | APPROVE |
+------------------------+------------------+
| CANCELLED | CLOSED |
+------------------------+------------------+
| DECLINED | CLOSED |
+------------------------+------------------+
| AVS_CHECK_SYSTEM_ERROR | CLOSED |
+------------------------+------------------+
關於主鍵/唯一鍵的最佳實踐是什么? 我應該只創建一個具有身份的OrderStatusKey INT作為PrimaryKey嗎? 還是對訂單狀態創建唯一約束(唯一)? 謝謝。
如果OrderStatus
是唯一的並且是主要標識符AND,那么您將直接在相關表中重用此狀態代碼(而不是指向此狀態代碼的數字指針),則將這些列保持原樣,並使OrderStatus
成為主要的聚集索引。
一點解釋:
主鍵在整個表中是唯一的; 聚集索引將所有記錄數據綁定回該索引。 主鍵也不一定總是表上的聚簇索引,但通常是這種情況。
如果要使用狀態代碼以外的其他內容鏈接到訂單狀態,請創建另一個類型為int
列作為IDENTITY
並使其成為主集群鍵。 還要向OrderStatus
添加唯一的非聚集索引,以確保不會添加任何重復項。
無論采用哪種方式,每個表都應具有主鍵以及聚集索引(同樣,通常它們是相同的索引)。
這里有一些要考慮的事情:
PRIMARY KEY
確保表中沒有NULL值或重復項 UNIQUE KEY
可以包含NULL
並且(按ANSI標准)可以包含任意數量的NULL
。 (此行為取決於SQL Server設置和可能的索引篩選器-不是空約束) CLUSTERED INDEX
包含與葉子上的一行相關的所有數據。
CLUSTERED INDEX
不唯一(並且不為null)時,SQL Server將向每行添加一個隱藏的GUID
。 引用表將在其結構中存儲PK值(或唯一)(這也是您用來進行聯接的內容)。 如果您有一個整數鍵用作參考(SQL Server中又稱為IDENTITY),則對性能會有一點好處。
如果您通常不想列出ConnectionStatus
,那么使用實際的顯示值( OrderStatus
)可能會有所幫助,因為您不必加入查找表。
您可以將兩個值都存儲在引用表中,但是維護這兩個列都會有一些開銷,並且會出現更多錯誤空間。
群集/非群集問題取決於此表的用例。 如果通常使用OrderStatus
進行過濾(使用文本形式),則OrderStatu
上的NON CLUSTERED IDENTITY PK
CLUESTERED UNIQUE
NON CLUSTERED IDENTITY PK
和CLUESTERED UNIQUE
可能會有所幫助。 但是(如您在上面閱讀的),在小表中效果/性能增益通常可以忽略不計。
如果您不熟悉上述情況,並且覺得比較安全,請在OrderStatus
上創建一個標識聚類的PK( OrderKey
或OrderID
)和一個唯一的非聚類的密鑰。
使用PK作為外鍵中的引用/引用列。
還有一件事:如果僅一個表將引用此列,則您可能要考慮創建一個包含兩個表的數據的索引視圖。
另外,我建議添加一個虛擬值,如果未設置狀態,則可以使用該值(並將其用作所有引用列的默認值)。 因為未設置仍然是狀態,不是嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.