gpt4 book ai didi

database-design - 如何引用最初在另一个表中未知的表映射

转载 作者:行者123 更新时间:2023-12-04 07:14:56 25 4
gpt4 key购买 nike

我有四个表:ExternalNameInternalNameExternalInternalNameMapTransaction
ExternalName 和InternalName 具有多对多关系。 ExternalInternalNameMap 是 ExternalName 和 InternalName 之间的联结表。

约束是:

  • 一笔交易只能有一个 ExternalName 和一个与之关联的 InternalName。
  • 一个 ExternalName 可以有很多事务。
  • 一个 InternalName 可以有很多事务。

因此一个ExternalInternalNameMap可以有多个事务,一个事务只能对应一个ExternalInternalNameMap。

enter image description here

Transaction 表必须连接到其他表,以便 ExternalName 和 InternalName 可以与 Transaction 相关联。

将 ExternalInternalNameMap.Id 作为 Transaction 表中的外键似乎是一个自然的选择,但是当一行最初添加到 Transaction 表时,只有 ExternalName 是已知的。后来,用户将 ExternalName 映射到 InternalName。只有这样我们在 ExternalInternalNameMap 中才有一行。用户需要查看交易数据才能知道如何将 ExternalName 映射到 InternalName。

选项 A:
事务可以有一个 fk 到 ExternalInternalNameMap,但 InternalNameId(在该表中)最初将为 NULL。在那种情况下,我们不能在该表中强制执行重复的 InternalNameId 和 ExternalNameId 组合。

选项 B:
事务可以包含到 ExternalName 的 fk 和到 InternalName 的 fk(最初为 NULL)。但在那种情况下,数据库不会强制事务包含有效的 ExternalName 和 InternalName 映射。

是否有其他方法可以解决这些问题?

编辑:更正图表

最佳答案

我建议结合使用 A 和 B 选项。

enter image description here

要在数据库设计级别强制实现完整性约束,您需要在联结表上使用复合主键。
ExternalInternalNameMap 的 PK 将为 {EN_ID, IN_ID}
Transaction 表中有一个可选的外键 ExternalInternalNameMap 脉冲检查约束将导致一致性。

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)}

关于database-design - 如何引用最初在另一个表中未知的表映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com