我正在为 properties 和住宅数据库创建一个数据库 .
这是要求 .
-
所有者可以拥有许多房产 .
-
property 可以拥有许多所有者(与配偶,亲属等共同拥有)
所以我有一个关联表,因为Owner-Property是一个多对多的关系 .
Owner_Property
-
第一个属性:所有者ID(FK到所有者表)
-
第二个属性:属性批次ID(FK到属性表)
确定后,我还需要存储特定所有者在相关 property 中停留的月份的信息 .
所以我考虑创建另一个关联实体 Duration_of_stay_at_Property
,其中第一个属性是 month_id
,另一个属性将链接回 Owner_property
表,通过Fk链接到复合键或者必须在 Owner_property
表中创建的主键 .
您对PK /复合决策有何建议?你想建议设计有什么改进吗?
4 回答
你似乎想要一个“所有者保持”的关系 . 我将假设这种关系总是属于所有者拥有的 property (而不是任何旧 property ) . 也就是说,这可能不包括所有时间范围,因为所有者也可能会撕毁属性 .
所以,这表明像
staying
这样的表具有以下属性:所有者/属性主键
开始日期
结束日期
任何其他相关信息
这表明您需要
owner/
property`关系上的单列主键 .这句话公开表明你需要一个具有三列复合键的新实体 . 像:
有时,当您有与
dwelling
相关的额外实体时,您可以在其中添加额外的单列PK,请记住您还需要保留主要的唯一约束 . 就像是:我会寻求以下解决方案:
在表
Owner_Property
中添加主键将
Duration_of_stay_at_Property
链接到Owner_Property
的主键(以及其他信息,例如逗留月份)这背后的理由:
在大多数表中使用主键通常是一种好习惯
主键将消除
Duration_of_stay_at_Property
上对复合foregin键的需要(没有主键,您需要两列与Owner_Property
中的行相关)我建议所有权(许多:业主和 property 之间的许多映射)独立于谁,何时 . 制作两张桌子 .
owner_property表应该有两列(没有auto_increment); PK应该有两列,你可能需要一个索引,列的顺序相反 . More discussion and tips
另一个表将具有相同的两列,以及与占用时间(或时间范围)有关的内容 . PK和二级索引将取决于您希望执行的查询 . 如果没有人在某个特定属性中,那么该属性就没有行 . 繁忙的 property 可能有数千行 - 与所有权表没有任何关系 .
(好吧,我几乎都在说其他答案说的话 . )