mysql - 数据库优化/规范化 - 外键出现在 "too many"表中

标签 mysql database-design optimization normalization telephony

我做了很多研究,我相信我的数据库在 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/

相关文章:

java - JPA:外键注释

mysql - 将归档的 SQL 记录转换为规范化结构的长期影响是什么?

jQuery 优化

php - 在 Laravel 中将旧表迁移到新表

php - MYSQL子查询和正则表达式

php - 从查询数组中获取第一个元素

mysql - 如何唯一标识MySql中的数据库?

MySQL,无法创建外键

mysql - 如何根据公共(public)参数使用另一个表中的值更新一个表的行

mysql - 在记事本上创建脚本并在cmd上测试它以附加或分离mysql中的数据库?