我做了很多研究,我相信我的数据库在 4th NF 中(被告知没有必要再进一步),但仍然感觉有些不对劲。
我有一个表 TRUNK,两个表通过外键引用:RATECARD 作为一个中继可以用于许多价目表(区别在于有效时间、调用计划等);此外,我有一个 RATEBUYINGINFO,它基本上是您从中继提供商下载的信息,包含有关到不同目的地和类似目的地的费率信息。显然,随着价格随时间的变化,更多的 RATEBUYINGINFO 对象可以与一条干线相关联,但是 RATEBUYINGINFO 和 RATECARD 没有直接联系,除了它们可能指的是一条干线,所以我在这两个表中都将 TrunkID 作为外键。
然后我有基于特定 RATECARD 的销售价格信息(RATESELLINGINFO 表),还有目的地信息以及中继信息,所有这些都在 RATEBUYINGINFO 表中跟踪(不,我没有看到点将 DESTINATION 作为一个单独的表,因为不同提供商的不同中继不提供唯一的目的地名称)所以我有外键 RateCardID 和 RateBuyingInfoID 作为 RATESELLINGINFO 表中的外键。
现在的问题是,通过这两个外键,最后一个表可以访问两个 TrunkID 值(一个在 RATECARD 中,一个在 RATEBUYINGINFO 中),这两个值应该始终相同(显然一个销售率指的是单个中继线)但是数据库体系结构不会以任何方式保证这一点。 这个问题有没有优雅的解决方案?
最佳答案
当你问这样的问题时,总是包括 SQL CREATE TABLE 语句和一些示例数据作为 SQL INSERT 语句。 SQL 比您的评论更可靠且更明确。 (您现在可以编辑您的问题并添加这些内容,以便从稍后阅读本文的人那里获得更好的答案。)
表 RATECARD 和 RATEBUYINGINFO 中的中继 ID 可能应该是这两个表中主键的一部分或唯一约束的一部分。如果是,那么您可以在具有重叠外键约束的 RATESELLINGINFO 中存储一次中继 ID。有点像
...
foreign key (trunk_id, rate_card_id)
references ratecard (trunk_id, rate_card_id),
foreign key (trunk_id, rate_buying_info_id)
references rate_buying_info (trunk_id, rate_buying_info_id)
...
如果您完成了完整的关系模型,无论如何(可能)Trunk id 都会在 RATESELLINGINFO 中结束。
其他提示:从表名中删除“信息”一词。所有表格都包含信息;将其添加到名称中只是噪音。
关于mysql - 数据库优化/规范化 - 外键出现在 "too many"表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674983/