如何存储自定义值来代替列的数据类型。 我有一个名为'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