我在MS SQL Server数据库中建模时遇到异常情况:表的主键是由5个外键(固定大小)组成的多段“自然”键。
我希望能够定义用户定义的数据类型,以便基于CHAR(8)原语实现数据结构,使元素可以作为单独的字段进行寻址。
例如(在错误的伪代码中):
UDT seggy
(
seg1 char(2),
seg2 char(1),
seg3 char(1),
seg4 char(2),
seg5 char(2)
)
create table yotable
(
pkfield seggy NOT NULL,
etc varchar(14), --whatever etc.
)
with pkfield as the primary key,
and also with seg1 as a foreign key to tableseg1,
and also with seg2 as a foreign key to tableseg2,
and so on
然后能够做到这样的事情:
insert into yotable (pkfield, etc) values ('abcdefgh','whatever')
select * from yotable where seg2 = 'c'
insert into yotable (seg1,seg2,seg3,seg4,seg5,etc)
values ('ab','c','d','ef','gh', 'whatever')
到目前为止,我发现所有这些CodeProject article都不够远,或者提供了更多信息的链接,以及这个基本的MSDN link。
显然我的google-fu今晚很弱,任何链接/提示都非常赞赏!
备用标题:如何在SQL SERVER中模拟“覆盖”字段?
MS SQL SERVER 2005或更高版本假设/首选。
答案 0 :(得分:1)
您可以定义具有所需结构的CLR UDT,但(1)您将无法保留外键(外键必须位于列级别,而不是UDT中的字段) ())实现CLR UDT并不是一件容易的事(至少与你的伪代码相比)。另外,根据您的描述,听起来它们在语义上确实是单独的列,而您正在寻找的只是方便的捷径;无论如何,IMO UDT可能不是最佳方法。
我建议保留单独的列,但是要创建一个视图,该视图具有将字段连接在一起的列,或者创建表中执行相同操作的计算列。这将允许使用组合或单独的表示法进行搜索。然后,您可以使用INSTEAD OF触发器将组合列上的插入/更新分解为组件部分。