2011-01-11 42 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约束,否则优先选择带有外键的表。