Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库优化/规范化-外键出现在;“太多”;桌子_Mysql_Database Design_Optimization_Normalization_Telephony - Fatal编程技术网

Mysql 数据库优化/规范化-外键出现在;“太多”;桌子

Mysql 数据库优化/规范化-外键出现在;“太多”;桌子,mysql,database-design,optimization,normalization,telephony,Mysql,Database Design,Optimization,Normalization,Telephony,我已经做了很多研究,我相信我的数据库在第四个NF中(被告知没有必要再进一步),但仍然感觉有些不对劲 我有一个表中继,其中两个表通过外键引用:RATECARD作为一个中继可用于多个RATECARD(区分有效时间、callplans等);此外,我有一个RATEBUYINGINFO,它基本上是您从中继提供商下载的信息,包含不同目的地和类似目的地的费率信息。显然,随着时间的推移,随着价格的变化,更多的RATEBUYINGINFO对象可以与一个主干相关联,但是RATEBUYINGINFO和RATECARD

我已经做了很多研究,我相信我的数据库在第四个NF中(被告知没有必要再进一步),但仍然感觉有些不对劲

我有一个表中继,其中两个表通过外键引用:RATECARD作为一个中继可用于多个RATECARD(区分有效时间、callplans等);此外,我有一个RATEBUYINGINFO,它基本上是您从中继提供商下载的信息,包含不同目的地和类似目的地的费率信息。显然,随着时间的推移,随着价格的变化,更多的RATEBUYINGINFO对象可以与一个主干相关联,但是RATEBUYINGINFO和RATECARD没有直接连接,只是它们可能引用一个主干,因此我在这两个表中都将TrunkID作为外键

然后,我有基于特定费率卡的销售费率信息(RATESELLINGINFO表),还有目的地信息以及中继信息,所有这些信息都记录在RATEBUYINGINFO表中(不,我不认为将目的地单独列为一个单独的表有什么意义,因为不同提供商提供的不同中继不提供唯一的目的地名称)因此我在RATESELLINGINFO表中使用外键RateCardID和RateBuyingFoId作为外键

现在的问题是,通过这两个外键,最后一个表可以访问两个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)
...
如果您使用了完整的关系模型,那么无论如何(可能)主干id都会出现在RATESELLINGINFO中

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