与多个表之一的外键关系

时间:2014-09-30 07:54:53

标签: sql-server database-design

我有一个语言映射表,每个条目都可能与几个不同的表有外键关系。 处理此配置的最佳架构是什么?

表格:LanguageMap,TableA,TableB

这是两种可能性:

1。查找列方法 - 无外键约束:

Create Table LanguageMap (
   Id int not null primary key,
   Language nvarchar not null,
   Value nvarchar not null,
   Type nvarchar not null, -- 'TableA', 'TableB', etc.
   ForeignTableId int not null -- Is Foreign key to another table dependent on the type of the row.
)

2。多个外键列

create Table LanguageMap(
   Id int not null primary key,
   Language nvarchar not null,
   Value nvarchar not null,
   Type nvarchar not null, -- 'Activity', 'Verb', etc.
   TableAId int null,
   TableBId int null
)
alter table LanguageMap add constraint FK_LanguageMap_TableA
foreign key (TableAId) references TableA (Id)

alter table LanguageMap add constraint FK_LanguageMap_TableA
foreign key (TableBId) references TableB (Id)

alter table LanguageMap add constraint CK_LanguageMap_OneIsNotNull
check (TableAId is not null or TableBId is not null)
go
alter table LanguageMap add constraint CK_LanguageMap_OneIsNull
check (TableAId is null or TableBId is null)
go

外键约束基于Foreign Key for either-or column?

1 个答案:

答案 0 :(得分:2)

还有另一种选择,称为“共享主键”。你可以看一下。如果TableA,TableB,TableC等都将其PK作为PK的副本从一些Master表中“继承”,例如名为“TableMaster”,那么您可以在LanguageMap中将其用作FK。

正确的连接将选择正确的实例。

共享主键通常与名为“类表继承”的设计模式结合使用。在不知道TableA,TableB,TableC等是什么的情况下,我不能说Class Table Inheritance是否与您的案例相关。

无论如何,请查找“共享主键”和“类表继承”以进一步阅读。 这个区域有这些名称的标签。