2016-11-30 80 views
4

我想創建一個查找表'orderstatus'。即在下面,爲了說明這一點,將在數據倉庫中使用。如果需要的話,我需要通過OrderStatus來獲取INT(如果我創建一個)以用於其他地方。例如,在事實表中,我會將int存儲在事實表中以鏈接到查找表。查找表上的SQL主鍵或唯一約束?

+------------------------+------------------+ 
| OrderStatus   | ConnectionStatus | 
+------------------------+------------------+ 
| CLOSED     | APPROVE   | 
+------------------------+------------------+ 
| COMPLETED    | APPROVE   | 
+------------------------+------------------+ 
| FULFILLED    | APPROVE   | 
+------------------------+------------------+ 
| CANCELLED    | CLOSED   | 
+------------------------+------------------+ 
| DECLINED    | CLOSED   | 
+------------------------+------------------+ 
| AVS_CHECK_SYSTEM_ERROR | CLOSED   | 
+------------------------+------------------+ 

關於主鍵/唯一鍵的最佳實踐是什麼?我應該創建一個OrderStatusKey INT作爲PrimaryKey與身份?或者在訂單狀態(唯一)上創建唯一約束?謝謝。

+2

如果'OrderStatus'列將在許多表中引用,那麼我將使用帶有主鍵的'Identity'列並將其引用到其他表中。檢查這個問題以及http://stackoverflow.com/questions/3162202/sql-primary-key-integer-vs-varchar –

+0

你應該給這個讀。 http://www.agiledata.org/essays/keys.html。 – JamieSee

回答

1

爲此,我建議您創建一個標識列,並使該集羣主鍵。

表被認爲是表具有某種主鍵的最佳實踐,但對於這樣的表具有聚集索引是允許在多表查詢中使用此表的最快方式(帶連接) 。

下面是一個簡單的如何添加:

ALTER TABLE dbo.orderstatus 
ADD CONSTRAINT PK_orderstatus_OrderStatusID PRIMARY KEY CLUSTERED (OrderStatusID); 
GO 

文章更多的細節MSDN

,這裏是用來說明一個主鍵Primary Key Primer

+0

我不反對,但你能詳細說明爲什麼嗎? – scsimon

+0

@scsimon檢查出來,看看是否更好。 –

+3

不要混合PRIMARY KEY和CLUSTERED INDEX的概念。 – Pred

1

如果OrderStatus是獨一無二的另一種資源和主標識符AND,您將直接在相關表格中重新使用此狀態代碼(而不是指向此狀態代碼的數字指針),然後按原樣保留這些列,並使OrderStatus主聚集索引。

稍加說明:

主鍵在表中是唯一的;聚集索引將所有記錄數據連接回該索引。並不總是需要將主鍵也作爲表上的聚集索引,但通常情況就是這樣。


如果你要使用比狀態代碼以外的東西,然後創建int類型的另一列作爲IDENTITY,使該主聚集鍵被鏈接到訂單狀態。還要添加一個獨特的非聚集索引OrderStatus以確保不會添加重複項。


無論哪種方式,你去每個表應該有一個主鍵,以及一個聚集索引(再次,通常它們是相同的指數)。

1

這裏有一些事情要考慮:

  • PRIMARY KEY確保有在表
  • UNIQUE KEY沒有空值或重複可以包含NULL和(由ANSI標準)的任何數量的NULL秒。 (這種行爲取決於SQL Server設置和可能的索引過濾器r非null約束)
  • CLUSTERED INDEX包含與樹葉上一行有關的所有數據。
    • CLUSTERED INDEX不是唯一的(並且不爲空),在SQL Server將增加一個隱藏GUID到每一行。
    • SQL Server的一個隱藏的GUID列添加到鍵列列表時,鍵列不是唯一的區分單個記錄)
  • 所有的索引使用聚集索引或關鍵列的任意值堆表的rowid。
  • 查詢優化器使用的索引統計信息,找出執行查詢
  • 對於較小的表的最佳方法,該指標忽視平時,因爲這樣做索引掃描,然後對每個值的查找比做得更貴全表掃描(當您有非常小的表格時,它將讀取一頁或兩頁)
  • 狀態查找表通常非常小,可以存儲在一個頁面上。

引用表將在其結構中存儲PK值(或唯一值)(這也是您將用於執行連接的值)。如果您有一個整數鍵用作參考(又名SQL Server中的IDENTITY),則可以獲得輕微的性能優勢。

如果您通常不想列出ConnectionStatus,那麼使用實際顯示值(OrderStatus)可能會有好處,因爲您不必加入查找表。

您可以將兩個值都存儲在引用表中,但維護這兩列有一些開銷和更多空間用於出錯。

羣集/非羣集問題取決於此表的使用情況。如果您通常使用OrderStatus進行過濾(使用文本格式),OrderStatu上的NON CLUSTERED IDENTITY PKCLUESTERED UNIQUE可能是有益的。然而(正如你可以在上面看到的那樣),在小表中,效果/性能增益通常可以忽略不計。

如果您不熟悉上面的東西,你覺得它更安全,然後創建一個身份聚集PK(OrderKeyOrderID),並在OrderStatus一個獨特的非聚集鍵。

在外鍵中使用PK作爲引用/引用列。

還有一件事:如果該列僅由一個表引用,則可能需要考慮創建一個包含表數據的索引視圖。

此外,我會建議添加一個虛擬值,如果沒有設置狀態(並將其用作所有引用列的默認值),您可以使用該值。因爲沒有設置仍然是一個地位,不是嗎?