Database design 如何引用最初在另一个表中未知的表映射
我有四个表:Database design 如何引用最初在另一个表中未知的表映射,database-design,Database Design,我有四个表:ExternalName,InternalName,ExternalInternalNameMap和TransactionExternalName和InternalName具有多对多关系。ExternalInternalNameMap是ExternalName和InternalName之间的连接表 制约因素包括: 一个事务只能有一个ExternalName和一个与其关联的InternalName ExternalName可以有许多事务 一个InternalName可以有许多事务
ExternalName
,InternalName
,ExternalInternalNameMap
和Transaction
ExternalName和InternalName具有多对多关系。ExternalInternalNameMap是ExternalName和InternalName之间的连接表 制约因素包括:
- 一个事务只能有一个ExternalName和一个与其关联的InternalName
- ExternalName可以有许多事务
- 一个InternalName可以有许多事务
事务可以有一个fk到ExternalInternalNameMap,但InternalNameId(在该表中)最初将为空。在这种情况下,我们无法在该表中强制执行重复的InternalNameId和ExternalNameId组合 选项B:
事务可以包含fk到ExternalName和fk到InternalName(最初为空)。但在这种情况下,数据库不会强制事务包含有效的ExternalName和InternalName映射 有没有其他方法可以解决这些问题
编辑:更正的图表外键不能解决所有问题;暂时忘掉他们吧 当出现新交易时:
请记住,无论何时您需要从事务进入内部,都需要遍历映射——这是两个连接。同样,2连接到另一个方向。因此,确保每个方向都有索引。(FK在一个方向上生成索引。)我建议将A和B选项组合使用。
要在数据库设计级别强制实施完整性约束,您需要在连接表上使用复合主键。
ExternalInternalNameMap
的主键将是{EN\u ID,IN\u ID}
使用可选外键
ExternalInternalNameMap
insideTransaction
table pulse检查约束将导致一致性。Transaction table = {FK_EN_ID, FK_EINM_EN_ID, FK_EINM_IN_ID, ...}
检查事务表上的约束=
{FK_EINM_EN_ID is null OR (FK_EINM_EN_ID = FK_EN_ID)}
一种可能的方法是引入“未知”内部名称的概念。 对于每个外部名称,还可以在
externalnamemap
中引入一条记录,将该外部名称映射到一个特殊的内部名称“Unknown”。因此,对于每个外部名称,(最多)都存在一个这样的“未知”映射
基本上,只需遵循方法A。创建事务时,请参考相应外部名称的“未知”映射。一旦知道内部名称,更新交易;使其引用externalnamemap
中包含“完整”映射的记录
注意,我们在这里没有引入重复映射;您可以对组合(ExternalNameId,InternalNameId)
设置唯一约束
可能的变化:
- 您也可以决定在表
中使用空引用,而不是在表externalnamemap
中使用专用记录“Unknown”(或“TBD”或其他任何内容)。这确实要求列internalnamemap
可以为空InternalNameId
- 您可以预先创建“未知”映射(对于表
中的每个记录,ExternalName
中只有一条记录将该外部名称映射到“未知”),或者您可以在需要时创建“未知”映射(除非它已经存在),即在创建事务时externalnamemap
ExternalInternalNameMap
和InternalName
之间的关系。莫森答案中的图表是正确的。