【问题标题】:Should I have a primary key for an associative table if it were to be referenced from another table如果要从另一个表中引用关联表,我是否应该有一个主键
【发布时间】:2018-12-10 01:10:58
【问题描述】:

我正在为物业和住宅数据库创建一个数据库。

这是要求。

  1. 一个所有者可以拥有许多财产。

  2. 一处房产可以有多个所有者(与配偶、亲属等共同拥有)

所以我有一个关联表,因为 Owner-Property 是多对多关系。

Owner_Property

  • 第一个属性:所有者 ID(FK 到所有者表)

  • 第二个属性:属性批次 id(FK 到属性表)

确定了这一点后,我还需要存储有关特定所有者在相关物业中停留的月份的信息。

所以我想创建另一个关联实体Duration_of_stay_at_Property,其中第一个属性是month_id,另一个属性将链接回Owner_property 表,通过 Fk 到复合键或必须的主键在Owner_property 表中创建。

您对 PK/复合决策有何建议? 您有什么改进建议吗?

【问题讨论】:

    标签: sql database mariadb erd


    【解决方案1】:

    ...需要存储有关特定所有者在相关物业停留个月的信息...

    这句话公开表明您需要一个具有三列复合键的新实体。有点像:

    dwelling (month, owner_id (FK), property_id (FK))
    

    有时,当您有与dwelling 相关的额外实体时,您可能会在其中添加额外的单列 PK,请记住,您还需要保留主要的唯一约束。比如:

    dwelling (dwelling_id, month, owner_id (FK), property_id (FK))
      + constraint unique (month, owner_id, property_id)
    

    【讨论】:

    • 啊...我的意思是我已经拥有描述配对的 Owner_Property 表,我可以使用它,不是吗?为什么我在住宅中有 ower_id 和 property_id 属性?还是您建议我应该坚持使用组合键 owner_id 和 property_id?
    • 那将是一个糟糕的设计。 Owner_Property 实体代表不同的东西;可能是“所有权合同”,而不是一个人在该物业中居住的几个月。对于购买,您有 一个 所有权行,但可以有 许多 个居住月...或零。在最后一种情况下......你不会有任何行?
    【解决方案2】:

    我会选择以下解决方案:

    • 在表Owner_Property中添加主键

    • Duration_of_stay_at_Property链接到Owner_Property的主键(连同其他信息,如停留月份)

    这背后的理由:

    • 在大多数表中都有一个主键通常是一个好习惯

    • 主键将消除对Duration_of_stay_at_Property 的复合外键的需要(没有主键,您需要两列与Owner_Property 中的一行相关联)

    【讨论】:

      【解决方案3】:

      您似乎想要一种“所有者留下”的关系。我将假设这种关系始终与所有者拥有的财产(而不是任何旧财产)有关。也就是说,这可能不包括所有时间范围,因为业主也可能出租房产。

      因此,这建议使用类似staying 的表,其中包含以下属性:

      • 所有者/财产主键
      • 开始日期
      • 结束日期
      • 任何其他相关信息

      这表明您希望owner/property 关系上的单列主键。

      【讨论】:

      • 其实DB里没有出租部分,我不这么认为。房产不会出租给其他任何人。一个人拥有财产,他/她可能会或可能不会留在其中的任何一个或部分。对于他/她入住的那些物业,将存储入住月份。有时一个人可能会连续停留几个月或跳过几个月。是的,你是对的。但是我没有在 Owner_property 表中存储入住月份信息,这似乎是一团糟。我希望 Owner_Property 表只是所有者和财产之间的配对。
      【解决方案4】:

      我建议所有权(所有者和属性之间的多:多映射)独立于谁在那里,什么时候。制作两张桌子。

      owner_property 表应该有两列(没有 auto_increment); PK 应该有两列,并且您可能需要一个索引,其中列的顺序相反。 More discussion and tips

      另一个表将具有相同的两列,加上与占用时间(或时间范围)有关的内容。 PK 和二级索引将取决于您希望执行的查询。如果没有人在某个特定属性中,则该属性将没有行。一个繁忙的属性可能有数千行——与 Ownership 表没有关系。

      (好吧,我几乎是在说其他答案所说的。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        相关资源
        最近更新 更多