如果要从另一个表引用该关联表,我是否应该有一个主键

时间:2018-12-10 01:10:59

标签: sql database mariadb erd

我正在为房地产和住宅数据库创建数据库。

这是要求。

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

  2. 一个财产可以有很多所有者(与配偶,亲戚等共同拥有所有权)

所以我有一个关联表,因为所有者-财产是多对多关系。

Owner_Property

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

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

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

因此,我想到了创建另一个关联实体Duration_of_stay_at_Property,其中第一个属性为month_id,另一个属性将链接回Owner_property表,通过Fk到组合键或一个主键,必须在Owner_property表中创建。

您对PK /综合决定有何建议? 您想对设计提出任何建议吗?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我将寻求以下解决方案:

  • 在表Owner_Property

  • 中添加主键
  • Duration_of_stay_at_Property链接到Owner_Property的主键(以及其他信息,例如住宿月份)

背后的原理:

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

  • 主键将消除对Duration_of_stay_at_Property上的复合foregin键的需要(没有主键,您需要两列才能关联到Owner_Property中的一行)

答案 2 :(得分:1)

您似乎想要“主人留下”的关系。我将假定关系始终与所有者拥有的财产(而不是任何旧财产)有关。也就是说,这可能不包括所有时间范围,因为所有者还可能撕裂属性。

因此,这建议使用类似staying的表,并具有以下属性:

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

这表明您希望在owner/ property`关系上使用单列主键。

答案 3 :(得分:1)

我建议所有权(许多:所有者与财产之间的许多映射)与谁在何时何地无关。制作两个表。

owner_property表应具有两列(没有auto_increment); PK应该同时具有两列,并且您可能需要索引以相反的顺序排列。 More discussion and tips

另一个表将具有相同的两列,并与占用时间(或时间范围)有关。 PK和辅助索引将取决于您希望执行的查询。如果没有人住在某个特定的属性中,则该属性将没有行。繁忙的媒体资源可能有数千行-与所有权表没有关系。

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

相关问题