我正在建立一个让大学生寻找住房的申请表。我的模型包括一个房间尺寸的房间桌子,是否为大厅工作人员预留,以及房间号码等等。但是,有些房间参加2-8间客房的“套房”。我该如何建模?
我正在考虑Room表中的suite_id列,允许NULL占(不是大多数)非套房的房间。不过,似乎应该有一种更优雅的方式来做事。
至于我想要对数据做什么,我希望能够检查房间是否是套件的一部分,并且我希望能够查询所有套件(可选择按大小限制)。
非常感谢任何建议!
答案 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
(这可能在某种程度上反映了它们的甜蜜程度)。