【问题标题】:Database design: I need an entity in my database to be related to itself but also to be stand-alone数据库设计:我需要我的数据库中的实体与其自身相关,但也需要独立
【发布时间】:2017-03-21 17:20:19
【问题描述】:

如果问题的标题不清楚,我很抱歉。我将尝试在下面解释:

所以我正在尝试为 Campus Housing 应用程序设计一个数据库。房间可以是单人间或公寓。公寓基本上是 2 个独立的单人间,有序号。这意味着编号为 2135 和 2137 的房间是组成公寓的两个单人房间。而2149房间只是一个单人房。

我的房间实体表有以下字段:

我应该添加一个布尔字段IsApartment吗?但是,我怎样才能跟踪哪个房间与组成公寓的另一个房间相连呢?

【问题讨论】:

  • 只考虑它们都是公寓。你有一个房间和两个房间的公寓。

标签: sql database database-design relational-database


【解决方案1】:

您可以有 2 张不同的桌子 - 一张用于单人间,另一张用于公寓。公寓需要 2 列(用于 2 个单人房间),它们将充当唯一标识公寓的复合主键。您还可以定义从公寓到single_room的外键,以确保公寓房间绝对是单人间。

【讨论】:

  • 这不意味着有重复的数据。我需要在单人间和公寓中添加房间。然后在查询公寓时,我需要检查单人间是否也在公寓表中。总的来说,我不会失去正常的形式吗?某种继承(重叠)关系不是更好的解决方案吗?
  • 好吧,我的意思不是将 room_id 存储在公寓表中,而您的公寓表将 room_id_1、room_id_2 作为复合主键。您只需将数据插入单人房间表中。如果您希望将两个房间组合成一个公寓,那么您将获取每个单人房间的 room_id 并填充到公寓表中。如果有特定于公寓的特征,则会在公寓表中捕获。此设计遵循规范化,不会有任何重复
  • 是的,现在对我来说很有意义。谢谢,你帮了大忙!
  • @Rocky 我同意这种方法,但会使room_id_1 PK 和room_id_2 成为单独的唯一键。复合 PK 将允许相同的房间号出现在多行中。此外,这听起来像是一个对称关系(例如(2135, 2137)(2137, 2135) 相同),因此确保room_id_1 + 2 = room_id_2 的检查约束可能有助于确保只记录有效的公寓,并且每个关联只记录一次。
【解决方案2】:

为什么不添加另一个表“linkedroom”,其中包含字段 roomID(已加入您的房间 ID)和 linkedroomID

这样,如果第一个房间是公寓,您将获得有关第二个房间的信息,如果不是,则为 null。

【讨论】:

  • 这意味着将两列作为外键指向同一个主键,这很好。但这也会阻止这些列之一为 NULL。
  • 我的想法是只在第二个表中放入有父房间的房间(两条记录:a,b 和 b,a 用于每个这样的对),然后在查询中进行简单的 LEFT JOIN会给出我正在谈论的结果。当然,有多种方法可以构建它,具体取决于查询中要完成多少工作以及调用它的代码有多少。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多