如何对四列强制执行唯一性

时间:2014-02-16 09:34:32

标签: sql sql-server tags indexing

在SQL Server 2012中,我有一个包含四列的“交叉引用”表。四列的组合必须是唯一的。我最初的想法是简单地创建一个包含所有四列的主键,但是一些研究表明这可能不是一个好主意。

提问的背景...... 我正在尝试在遗留Web应用程序上实现标记服务。一些需要标记的对象使用uniqueidentifier作为主键,而其他对象使用简单的整数id。我采用“双桌”方法来解决这个问题。一个表包含标记,而另一个表提供要标记的对象和标记表之间的引用。这张表我的名字是TagList ......

CREATE TABLE TagList (
    TagId          nvarchar(40)     NOT NULL,
    ReferenceGuid  uniqueidentifier NOT NULL,
    ReferenceId    int              NOT NULL,
    ObjectType     nvarchar(40)     NOT NULL
)

例如,要使用带有'example'一词的uniqueidentifier主键标记对象,TagList记录将如下所示:

TagList (
    TagId          'example',
    ReferenceGuid  '1e93d578-321b-4f86-8b0f-32435d385bd7',
    ReferenceId    0,
    ObjectType     'Customer'
)

要使用带有“example”一词的整数主键标记对象,TagList记录将如下所示:

TagList (
    TagId          'example',
    ReferenceGuid  '00000000-0000-0000-0000-000000000000',
    ReferenceId    5639,
    ObjectType     'Product'
)

实际上,TagId和ReferenceGuid列必须是唯一的,或者,如果定义了int主键对象,则TagId,ReferenceId和ObjectType必须是唯一的。

为了简化(?)事情,使所有四列的组合都是唯一的,也可以起到相同的功能作用。

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:2)

拥有多列主键应该可以实现技巧

CREATE TABLE TagList (
    TagId          nvarchar(40)     NOT NULL,
    ReferenceGuid  uniqueidentifier NOT NULL,
    ReferenceId    int              NOT NULL,
    ObjectType     nvarchar(40)     NOT NULL,
    CONSTRAINT pk_TagList PRIMARY KEY (TagId,ReferenceGuid,ReferenceId,ObjectType)
)

答案 1 :(得分:1)

如果您只需要唯一约束而不是主键,则可以使用:

ALTER TABLE TagList
ADD CONSTRAINT UK_TagList_1 UNIQUE
(
    TagId,
    ReferenceGuid,
    ReferenceId,
    ObjectType
)

答案 2 :(得分:1)

我没有所涉及实体的所有信息,但由于我的可见度有限,我会尝试建议遵循首次剪裁设计:

创建两个单独的表,一个使用TagId和ReferenceGuid,另一个使用TagId和ReferenceId。我不确定ObjectType。如果ObjectType不是隐式的,那么这两个表中也可以维护它。然后可以在这些表的顶部创建视图以拍摄可以包含所有必需列的查询。 通过这种方式,我们可以解决当前设计中的空间浪费问题。 如果此设计无法解决手头的问题,请提供您的意见。