【问题标题】:Foreign Key Relationship with one of Multiple Tables与多个表之一的外键关系
【发布时间】:2014-10-01 18:17:33
【问题描述】:

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

表格: 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?

【问题讨论】:

  • 您能显示一些示例数据以澄清tablea和tableb中存储的内容吗?它们是否具有彼此相同的架构。此外,您链接到的是否只有 2 个不同的表,或者出于此问题的目的,它是否仅限于 2 个?
  • 我仍在写架构,所以我不确定会有多少桌子。但是假设架构会完全不同,并且至少会有四个:即 TableA、TableB、TableC、TableD。也许更多。为什么样本数据相关?
  • 我试图解决表格中的模式/数据是否相似。

标签: sql-server database-design


【解决方案1】:

还有另一种选择,称为“共享主键”。你可以查一下这个。如果 TableA、TableB、TableC 等都“继承”它们的 PK 作为某个主表的 PK 副本,例如称为“TableMaster”,那么您可以将其用作 LanguageMap 中的 FK。

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 2023-04-03
  • 2018-06-13
  • 2013-07-27
  • 2022-01-19
  • 2020-01-08
  • 1970-01-01
相关资源
最近更新 更多