当不是每个记录都是组成员时,如何表示记录组?

时间:2011-02-07 08:44:10

标签: sql relational-database

我正在建立一个让大学生寻找住房的申请表。我的模型包括一个房间尺寸的房间桌子,是否为大厅工作人员预留,以及房间号码等等。但是,有些房间参加2-8间客房的“套房”。我该如何建模?

我正在考虑Room表中的suite_id列,允许NULL占(不是大多数)非套房的房间。不过,似乎应该有一种更优雅的方式来做事。

至于我想要对数据做什么,我希望能够检查房间是否是套件的一部分,并且我希望能够查询所有套件(可选择按大小限制)。

非常感谢任何建议!

3 个答案:

答案 0 :(得分:1)

该架构运行正常。

要检查房间是否属于套房,请检查应用程序中的列是否为空。

要查询所有套件,请选择行WHERE suite_id IS NOT NULL,并按大小GROUP BY suite_id HAVING COUNT(*) = number_of_rooms_you_want限制。

虽然根据您使用的RDBMS,语法可能略有不同。你没有用任何标记问题。

答案 1 :(得分:1)

suite_id可以为空,没有任何不雅之处。这基本上说,在您的数据模型中,一个房间可以成为套件的一部分。这是对情况的直接表现,因此很优雅。

替代品更糟糕。考虑一下,如果你愿意的话,如果你把房间分成不同的表,那么模型会是什么样子。一套适用于套房,另一套适用于非套房。突然间,您的搜索条件必须超过两个表格。您通过两个表复制信息(实际上,只有一个标识符是差异)。这并不代表问题,只会导致更多的腿部工作,以及两个搜索查询(可能是UNION)的潜在性能损失,以便重新获得结果。哦,如果你添加一个公共属性,你需要在两个地方添加它,并做两次必须做的维护工作来识别新列。

另一种选择是将所有与“套件”相关的字段包含在主表中。但是,这意味着每个不属于套件的房间都有冗余数据。正如你所说,他们很少成为套件的一部分,所以这些记录中的大多数都会有死角。再一次,它也不能代表这种情况。

您所采用的解决方案是正确且强大的。

答案 2 :(得分:0)

如果房间可能是不同套房的一部分,您可以考虑创建一个单独的表SuiteRooms(这可能在某种程度上反映了它们的甜蜜程度)。