我有一个语言映射表,每个条目都可能与几个不同的表有外键关系。 处理此配置的最佳架构是什么?
表格: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
答案 0 :(得分:2)
还有另一种选择,称为“共享主键”。你可以看一下。如果TableA,TableB,TableC等都将其PK作为PK的副本从一些Master表中“继承”,例如名为“TableMaster”,那么您可以在LanguageMap中将其用作FK。
正确的连接将选择正确的实例。
共享主键通常与名为“类表继承”的设计模式结合使用。在不知道TableA,TableB,TableC等是什么的情况下,我不能说Class Table Inheritance是否与您的案例相关。
无论如何,请查找“共享主键”和“类表继承”以进一步阅读。 这个区域有这些名称的标签。