【问题标题】:SQL Table Design - Same FKs in Parent and Child tablesSQL 表设计 - 父表和子表中的相同 FK
【发布时间】:2017-09-27 03:10:57
【问题描述】:

Member 表中的列:

id           (PK)*
client_id    (FK)
location_id  (FK)
address
etc.

Member_Vehicle 表中的列:

id           (PK)*
member_id    (FK)
mileage
etc.

将Member 表中已经存在的FK 复制到Member_Vehicle 表中是否是好的设计?
所以New_Member_Vehicle 表将是

id           (PK)*
member_id    (FK)
client_id    (FK)
location_id  (FK)
mileage
etc.

我们应用程序中的大部分处理都围绕Member_Vehicle 表进行。
我的想法是 - 如果 Member_Vehicle 表很容易拥有我需要的 ID,那么我可以减少 Member 和 Member_Vehicle 表之间的连接数。

你对为什么会这样的想法

  1. 可以接受
    或
  2. 不应该这样做

    非常感谢。谢谢。

【问题讨论】:

    标签: sql-server database-design foreign-keys database-performance sqlperformance


    【解决方案1】:

    您正在考虑的称为非规范化,在事务处理系统中通常是一个坏主意,除非您有充分的理由这样做,例如通过生产性能问题证明。

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

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

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

    【讨论】:

      【解决方案2】:

      一个客户可以在Member 表中出现多次吗?如果不是,则代理键是多余的。事实上,我敢打赌member_id 也是代理键。为什么要生成另一个唯一值来代替已经唯一的值?

      因此,如果您从 Member 表中删除 PK,则将 client_id 设置为 PK 和 FK,并将 Member_Vehicle 的 member_id 更改为引用“client_id”,您的问题就解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多