2011-01-11 25 views
0

如何存儲自定義值來代替列的數據類型。 我有一個名爲'Orders'的表,其中一個名爲'OrderStatus'的列,其目的是存儲訂單的狀態。例如R =拒絕,S =發送,T =返回。在SQL Server 2005中存儲自定義值

我很新的數據庫設計...

回答

1

在這種情況下,你並不真的需要自定義數據類型,你只需要一個外鍵的表與所有在它的狀態的。

OrderStatus表看起來像:

id   int   PK NOT NULL, IDENTITY 
code   char(1)  NOT NULL 
description varchar(100) NOT NULL 

(編輯:請注意,正如馬丁在另一個答案評論指出,代孕id關鍵不是完全必要的,但它允許靈活輕鬆改變code無需更新引用其中的數據)

Order表,然後將有一個外鍵到這個表:

order_status_id int  FK NOT NULL 
+0

你提到我創造了這個新表並建立關係,以及之間的訂單和OrderStatus。所以如果我想檢索訂單狀態,那麼它將是char(1),它將返回字符的權利?還是我需要設置值或什麼? – 2011-01-11 01:08:42

+0

還有一個Q.是否可以對char數據類型實施限制,以便用戶只能插入允許的值R =拒絕,S =發送,T =返回? – 2011-01-11 01:13:20

+0

是的,你會加入這張桌子,並從中選擇「代碼」。限制可以輸入代碼的最簡單方法就是不允許任何人對該表進行寫入/修改權限。 – 2011-01-11 01:23:34

0

最佳做法是標準化的,這意味着創建一個名爲ORDER_STATUS在那裏的批准值表,最低限度地像一個模式:

ORDER_STATUS(id number auto increment, code character, meaning varchar) 

然後涉及訂單到該表在被稱爲order_status_id列,該列將是一個不會爲空的外鍵。

1

你可以做到這一點。

OrderStatus OrderStatusCode 
----------- --------------- 
Rejected R 
Sent  S 
Returned T 

後來,當你有你的腰帶更「設計」,你去一個查找表。

2

'正確' 的答案是使用標準的SQL-92的CREATE DOMAIN。可悲的是,SQL Server還不支持它。如果你想看到支持,你可以投票支持它here

SQL Server有它自己的CREATE TYPE語法,但是當我上次看我宣佈他們不適合的目的。如果有人不同意,請發表回覆my question :)

這留下了兩個可行的選擇:一個表的外鍵或CHECK約束。經驗法則是,如果域值集合小且穩定(例如ISO 5218 sex codes),則使用CHECK約束,否則優先選擇帶有外鍵的表。