如何存儲自定義值來代替列的數據類型。 我有一個名爲'Orders'的表,其中一個名爲'OrderStatus'的列,其目的是存儲訂單的狀態。例如R =拒絕,S =發送,T =返回。在SQL Server 2005中存儲自定義值
我很新的數據庫設計...
如何存儲自定義值來代替列的數據類型。 我有一個名爲'Orders'的表,其中一個名爲'OrderStatus'的列,其目的是存儲訂單的狀態。例如R =拒絕,S =發送,T =返回。在SQL Server 2005中存儲自定義值
我很新的數據庫設計...
在這種情況下,你並不真的需要自定義數據類型,你只需要一個外鍵的表與所有在它的狀態的。
你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
最佳做法是標準化的,這意味着創建一個名爲ORDER_STATUS在那裏的批准值表,最低限度地像一個模式:
ORDER_STATUS(id number auto increment, code character, meaning varchar)
然後涉及訂單到該表在被稱爲order_status_id列,該列將是一個不會爲空的外鍵。
你可以做到這一點。
OrderStatus OrderStatusCode
----------- ---------------
Rejected R
Sent S
Returned T
後來,當你有你的腰帶更「設計」,你去一個查找表。
'正確' 的答案是使用標準的SQL-92的CREATE DOMAIN
。可悲的是,SQL Server還不支持它。如果你想看到支持,你可以投票支持它here。
SQL Server有它自己的CREATE TYPE
語法,但是當我上次看我宣佈他們不適合的目的。如果有人不同意,請發表回覆my question :)
這留下了兩個可行的選擇:一個表的外鍵或CHECK
約束。經驗法則是,如果域值集合小且穩定(例如ISO 5218 sex codes),則使用CHECK
約束,否則優先選擇帶有外鍵的表。
你提到我創造了這個新表並建立關係,以及之間的訂單和OrderStatus。所以如果我想檢索訂單狀態,那麼它將是char(1),它將返回字符的權利?還是我需要設置值或什麼? – 2011-01-11 01:08:42
還有一個Q.是否可以對char數據類型實施限制,以便用戶只能插入允許的值R =拒絕,S =發送,T =返回? – 2011-01-11 01:13:20
是的,你會加入這張桌子,並從中選擇「代碼」。限制可以輸入代碼的最簡單方法就是不允許任何人對該表進行寫入/修改權限。 – 2011-01-11 01:23:34