数据库优化/规范化 - 出现在“太多”表中的外键

时间:2011-12-30 00:30:23

标签: mysql database-design optimization normalization telephony

我做了很多研究,我相信我的数据库是第4个NF(被告知没有必要再进一步了)但是仍然感觉不对。

我有一个表TRUNK,两个表通过外键引用:RATECARD作为一个主干可用于许多速率卡(区分是有效时,呼叫计划等);此外,我有一个RATEBUYINGINFO,它基本上是从中继提供商下载的信息,包含不同目的地和类似的费率信息。显然,当价格随时间变化时,RATEBUYINGINFO对象可以与一个主干相关联,但RATEBUYINGINFO和RATECARD没有直接连接,除了它们可能引用单个主干,因此我在这两个表中都有TrunkID作为外键。 / p>

然后我根据某些RATECARD以及目的地信息以及所有在RATEBUYINGINFO表中跟踪的主干信息获得销售价格(RATESELLINGINFO表)的信息(不,我看不到将DESTINATION单独列为单独的表,因为不同提供商的不同中继不提供唯一的目的地名称)所以我在RATESELLINGINFO表中将外键RateCardID和RateBuyingInfoID作为外键。

现在的问题是,通过这两个外键,最后一个表可以访问两个TrunkID值(一个在RATECARD中,另一个在RATEBUYINGINFO中),它们应该始终相同(显然一个销售率指的是一个中继)但是数据库架构不会以任何方式保证。 这个问题有一个优雅的解决方案吗?

1 个答案:

答案 0 :(得分:1)

当您提出类似这样的问题时,请始终将SQL CREATE TABLE语句和一些示例数据包含在SQL INSERT语句中。 SQL比您的评论更可靠,更不明确。 (您可以编辑您的问题并立即添加这些内容,以便稍后阅读此内容的人获得更好的答案。)

表RATECARD和RATEBUYINGINFO中的trunk ID可能应该是主键的一部分,也可能是这两个表中唯一约束的一部分。如果是,则可以使用重叠的外键约束在RATESELLINGINFO中存储一次trunk 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中结束。

其他提示:从表名中删除“info”一词。所有表都包含信息;将其添加到名称只是噪音。