Sql server 表关系-最佳做法

Sql server 表关系-最佳做法,sql-server,database,relational-database,Sql Server,Database,Relational Database,如果我有三张桌子 表A Id Name 表B Id Fk_A_Id Name 表C Id Fk_A_Id Fk_B_Id Name 问题:既然我们已经在表C中有了表AId,那么在表C中有表B和表B中有表AId,我认为在表C中同时有A和B的Id是最好的做法,因为所有Id都是在查询中连接在一起时显示。我认为这还取决于数据在不同表格中的组织方式以及它们之间的关系。如果表A是客户,B是地址,而C是电话号码(为了便于说明),我只会在B和C中使用A ID来关联回客户表 也就是说,我遇到的大多数软件,比

如果我有三张桌子

表A

Id
Name
表B

Id
Fk_A_Id
Name
表C

Id
Fk_A_Id
Fk_B_Id
Name

问题:既然我们已经在
表C
中有了
表A
Id,那么在
表C
中有
表B
表B
中有
表A
Id,
我认为在表C中同时有A和B的Id是最好的做法,因为所有Id都是在查询中连接在一起时显示。我认为这还取决于数据在不同表格中的组织方式以及它们之间的关系。如果表A是客户,B是地址,而C是电话号码(为了便于说明),我只会在B和C中使用A ID来关联回客户表


也就是说,我遇到的大多数软件,比如Magento,都会涉及到A->B,然后是B->C,然后是C->D。。。以此类推,永远不会有以前表中的任何ID。

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


也就是说,我遇到的大多数软件,比如Magento,都会涉及到A->B,然后是B->C,然后是C->D。。。这取决于表C中的关联
(Fk_B_Id,Fk_A_Id)
是否冗余(即与表B中的
(Id,Fk_A_Id)
相同或是其子集),以及数据库中如何保持一致性。如果它们相同,那么表C中的
Fk\u A\u Id
可以在逻辑上删除

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

但是,考虑一个团队使用设备的情况,一个团队有一个管理者,但是每个设备都有自己的管理者,而不一定和团队经理一样。在这种情况下,我们有需要单独记录的独立事实

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


我建议首先使用规范化的非冗余模型,仅当性能存在问题且简单的优化方法无效时才添加冗余。

这取决于表C中的关联
(Fk_B_Id,Fk_a_Id)
是否冗余(即与
(Id,Fk_a_Id)相同或是其子集)
在表B中),以及如何在数据库中保持一致性。如果它们相同,那么表C中的
Fk\u A\u Id
可以在逻辑上删除

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

但是,考虑一个团队使用设备的情况,一个团队有一个管理者,但是每个设备都有自己的管理者,而不一定和团队经理一样。在这种情况下,我们有需要单独记录的独立事实

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


我建议首先使用规范化的非冗余模型,仅当性能存在问题且简单的优化方法无效时才添加冗余。

如果这三个表是国家、州和城市,该怎么办?如果这三个表都是表,那么执行a->B,B->C引用,因为在每个关系中从1到多。但我仍然不会把国家ID放在城市表中,因为城市与国家有关。即使有重复的城市名称,它们也只会引用父州,然后再引用父国家。如果这三个表是国家、州和城市呢?如果这三个表是表,那么进行A->B、B->C引用会更有意义,因为在每个关系中,从1到多。但我仍然不会把国家ID放在城市表中,因为城市与国家有关。即使您有重复的城市名称,它们也只会引用父州,然后再引用父国家。