表格关系-最佳做法

时间:2018-07-29 06:12:32

标签: sql-server database relational-database

如果我有3张桌子

Table_A

Id
Name

Table_B

Id
Fk_A_Id
Name

Table_C

Id
Fk_A_Id
Fk_B_Id
Name

问题:Table_A中有Id Table_C是最好的做法,因为我们在Table_B中已经有Table_C并且Table_B有{ {1}} Table_A

2 个答案:

答案 0 :(得分:2)

这取决于Table_C中的关联(Fk_B_Id, Fk_A_Id)是否冗余(即与Table_B中的(Id, Fk_A_Id)相同还是该子集的子集),以及如何在数据库中保持一致性。如果它们相同,则逻辑上可以删除Table_C中的Fk_A_Id

例如,如果我们要建模一个严格的收容层次结构,例如每个城市都属于一个州,每个州都属于一个国家,那么直接记录一个城市的国家在逻辑上是多余的。

但是请考虑以下情况:团队使用设备,并且团队有一个经理,但是每个设备可以有自己的经理,不一定与团队经理相同。在这种情况下,我们有独立的事实,需要分别记录。

冗余属性通常用于性能优化。两次记录相同事实的问题在于,同一事物的多个实例可能会变得不一致。如果以某种方式保持了一致性,那么冗余就不会有逻辑问题。

我建议首先使用规范化和非冗余的模型,并且仅在性能出现问题并且更简单的优化方法无效的情况下才添加冗余。

答案 1 :(得分:0)

我认为最好不要在表C中同时包含A和B的ID,因为所有ID在查询中一起出现时都会出现。我认为这还取决于不同表中数据的组织方式以及它们之间的关系。如果表A是客户,而B是地址,而表C是电话号码(为方便起见),那么我只能在B和C中使用A ID来关联到客户表。

话虽如此,我遇到的大多数软件(例如Magento)都将关联A-> B,B-> C,C-> D ...等,并且永远不会包含先前表中的任何ID