我做了很多研究,我相信我的数据库是第4个NF(被告知没有必要再进一步了)但是仍然感觉不对。
我有一个表TRUNK,两个表通过外键引用:RATECARD作为一个主干可用于许多速率卡(区分是有效时,呼叫计划等);此外,我有一个RATEBUYINGINFO,它基本上是从中继提供商下载的信息,包含不同目的地和类似的费率信息。显然,当价格随时间变化时,RATEBUYINGINFO对象可以与一个主干相关联,但RATEBUYINGINFO和RATECARD没有直接连接,除了它们可能引用单个主干,因此我在这两个表中都有TrunkID作为外键。 / p>
然后我根据某些RATECARD以及目的地信息以及所有在RATEBUYINGINFO表中跟踪的主干信息获得销售价格(RATESELLINGINFO表)的信息(不,我看不到将DESTINATION单独列为单独的表,因为不同提供商的不同中继不提供唯一的目的地名称)所以我在RATESELLINGINFO表中将外键RateCardID和RateBuyingInfoID作为外键。
现在的问题是,通过这两个外键,最后一个表可以访问两个TrunkID值(一个在RATECARD中,另一个在RATEBUYINGINFO中),它们应该始终相同(显然一个销售率指的是一个中继)但是数据库架构不会以任何方式保证。 这个问题有一个优雅的解决方案吗?
答案 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”一词。所有表都包含信息;将其添加到名称只是噪音。