Sql server SQL表设计-父表和子表中的FK相同

Sql server SQL表设计-父表和子表中的FK相同,sql-server,database-design,foreign-keys,database-performance,sqlperformance,Sql Server,Database Design,Foreign Keys,Database Performance,Sqlperformance,成员表中的列: id (PK)* client_id (FK) location_id (FK) address etc. id (PK)* member_id (FK) mileage etc. Member\u Vehicle表中的列: id (PK)* client_id (FK) location_id (FK) address etc. id (PK)* member_id

成员
表中的列:

id           (PK)*
client_id    (FK)
location_id  (FK)
address
etc.
id           (PK)*
member_id    (FK)
mileage
etc.
Member\u Vehicle
表中的列:

id           (PK)*
client_id    (FK)
location_id  (FK)
address
etc.
id           (PK)*
member_id    (FK)
mileage
etc.
成员
表中已经存在的FKs复制到
成员车辆
表中是否是一种良好的设计?
因此,
New\u Member\u Vehicle
表将

id           (PK)*
member_id    (FK)
client_id    (FK)
location_id  (FK)
mileage
etc.
我们应用程序中的大部分处理都是围绕
成员车辆
表进行的。
我的想法是-如果
Member\u-Vehicle
表随时具有我需要的ID,那么我可以减少
Member
Member\u-Vehicle
表之间的连接数

你对为什么会这样的想法

  • 是可接受的
  • 不应这样做

    非常感谢。多谢各位

  • 您正在考虑的被称为“非规范化”,在事务处理系统中通常是一个坏主意,除非您有很好的理由这样做,例如,生产性能问题证明了这一点

    根据经验,您的事务处理系统表应该是第三范式(3NF),并且只有在需要时才应该退出

    反规范化的缺点是,如果代码中存在错误,可能会引入数据异常(不一致)


    不要担心加入表格。这就是关系数据库管理系统的目的。在去规范化之前,我会考虑其他物理数据库的性能技巧,比如建立覆盖索引。

    < P>你所考虑的被称为“强”-非正规化< /强>,在事务处理系统中通常是个坏主意,除非你有很好的理由去证明它是由生产性能问题来解决的。比如说

    根据经验,您的事务处理系统表应该是第三范式(3NF),并且只有在需要时才应该退出

    反规范化的缺点是,如果代码中存在错误,可能会引入数据异常(不一致)


    不要担心加入表格。这就是关系数据库管理系统的目的。在去规范化之前,我会考虑其他物理数据库的性能技巧,比如建立覆盖索引。< /P> < P>客户端是否可以在<代码>成员< /代码>表中出现不止一次?如果没有,那么代理键是多余的。事实上,我敢打赌
    member\u id
    也是一个代理密钥。为什么要生成另一个唯一值来替代已经唯一的值


    因此,如果您从
    Member
    表中删除PK,则将
    client\u id
    同时设置PK和FK,并将
    Member\u Vehicle
    Member\u id
    更改为“client\u id”,您的问题就解决了。

    客户能否在
    Member
    表中出现多次?如果没有,那么代理键是多余的。事实上,我敢打赌
    member\u id
    也是一个代理密钥。为什么要生成另一个唯一值来替代已经唯一的值

    因此,如果您从
    Member
    表中删除PK,则同时生成
    client\u id
    PK和FK,并将
    Member\u Vehicle
    Member\u id
    更改为“client\u id”,您的问题就解决了