我有一个' MasterDetail'包含列Id,key,ItemName的表。我将我的应用程序中使用的所有枚举值保留在此单个表中。例如
我有另一张桌子说“订购”#39;其中一列为状态,为StatusEnum值引用此表。我想要这张桌子' Order'仅参考MasterDetail'中的值1,2,4。表,但不是值3,因为这是ScreenEnum值。
我正在使用SQL Server 2016.请有任何想法。
答案 0 :(得分:2)
如果我理解正确,您可以使用生成的列来保存项目类型信息:
create table MasterDetail (
Id int identity(1, 1) primary key,
Key varchar(255) unique,
ItemName varchar(255),
constraint unq_masterdetail_key_ItemName unique (key, ItemName)
);
create table orders (
OrderId int identity(1, 1) primary key,
Key varchar(255),
. . .
StatusEnum as ('StatusEnum') persisted,
constraint foreign key fk_orders_key_statusenum (key, statusenum) references masterdetail(key, itemname)
);
请注意MasterDetail
中的唯一约束是多余的。但是,它允许外键关系引用key
/ itemname
对。这就是获得类型1,2,4而不是3的需要。
答案 1 :(得分:0)
使用此设计,您需要以下内容来强制执行参照完整性:
或者,可以使用列级检查约束来限制允许值,该约束是MasterDetail值的子集。
如果要强制引用完整性,我通常会为每个“枚举”建议单独的表。虽然这需要更多的表,但设计更清晰,恕我直言。