另一种方法是创建一个关联表,其中包含每种潜在资源类型的列。在您的示例中,两个现有所有者类型中的每一个都有自己的表(这意味着您要引用一些内容)。如果情况总是如此,则可以执行以下操作:
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Subject varchar(50) NULL
)
CREATE TABLE dbo.Owner
(
ID int NOT NULL,
User_ID int NULL,
Group_ID int NULL,
{{AdditionalEntity_ID}} int NOT NULL
)
使用此解决方案,您将在向数据库中添加新实体时继续添加新列,并删除并重新创建@Nathan Skerl显示的外键约束模式。此解决方案与@Nathan Skerl非常相似,但看起来有所不同(取决于偏好)。
如果您不打算为每个新的所有者类型创建一个新表,那么最好为每个潜在的所有者包括一个owner_type而不是外键列:
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Owner_Type string NOT NULL, -- In our example, this would be "User" or "Group"
Subject varchar(50) NULL
)
使用上述方法,您可以根据需要添加任意数量的所有者类型。Owner_ID没有外键约束,但将用作对其他表的引用。缺点是您必须查看表以查看所有者键入的内容,因为根据架构并不能立即看出所有者的类型。如果您事先不知道所有者类型,并且他们不会链接到其他表,我只会建议您这样做。如果您确实知道所有者类型,那么我会使用@Nathan Skerl之类的解决方案。
抱歉,如果我输入了一些错误的SQL,我会把它们放在一起。