特定时期内可用的房间数量?

时间:2013-01-05 20:07:14

标签: php mysql sql database-design

我需要能够检查用户提供的日期范围是否可用。我的数据库中有一个名为booked的表,其中包含开始日期,结束日期以及在此期间预订的房间数量。

假设我的booked表格如下:

room_id | start      | end        | amount_of_rooms_booked
1       | 2012-12-12 | 2012-12-15 | 2
1       | 2012-12-13 | 2012-12-16 | 3
1       | 2012-12-18 | 2012-12-19 | 1

如果room_id 1共有8个可用空间,并且用户在2012-12-102012-12-20之间要求此房间,是否可以执行查询是否可以检查每天预订的SUM个房间不超过8个。

我可以这样做的另一种方法是单独存储每一天,并改为使用booked这样的表:

room_id | start      | amount_of_rooms_booked
1       | 2012-12-12 | 2
1       | 2012-12-13 | 5
1       | 2012-12-14 | 5
1       | 2012-12-15 | 3
1       | 2012-12-18 | 1

这种方式会在数据库中占用更多空间,但可能会更容易。我该怎么办?如果第一个想法我将如何进行查询?还有其他更好的方法来实现我想要做的事情吗?

3 个答案:

答案 0 :(得分:0)

要回答原来的问题,你可以这样做:

SELECT SUM(amount_of_rooms_booked) FROM booked
WHERE (start BETWEEN '2012-12-10' AND '2012-12-20' OR
       end BETWEEN '2012-12-10' AND '2012-12-20')
AND room_id = 1

我认为你如何存储它很好,虽然我可能每个房间预订存储一行,而不是一行带有'amount_of_rooms_booked'列。然后上面的查询将是COUNT查询而不是SUM。

答案 1 :(得分:0)

对于您的第一个选项,您始终可以使用this之类的功能。

然后你有一个这样的查询(我正在使用SQL Server),它返回在给定日期内预订少于8个的房间:

SELECT D.theDate, SUM(amount_of_rooms_booked) AS [amount_of_rooms_booked]
FROM
          booked
INNER JOIN
          dbo.ExplodeDates('20121210','20121220') D ON D.thedate BETWEEN booked.start AND booked.end
WHERE
          booked.room_id = @room
GROUP BY
          booked.room_id, D.thedate
HAVING
          SUM(amount_of_rooms_booked) < @bookingLimit

然而,如果这种做法是最好的,我不知道。我宁愿使用你的第二个选项,因为解释起来不那么复杂,我也不知道我是否需要另外一种查询。

答案 2 :(得分:0)

我建议每个房间的每个预订日都有一排。

使用该结构,每个可能的计算都更容易。是的,您将在表格中拥有更多数据的缺点,但它不会像您想象的那样影响您的数据库。我认为大多数查询都会更快,因为你会避免使用日期进行复杂的计算。

所以这是第二种方法的专业人士:

  • 它匹配用户思维模型(主要是)
  • SQL更简单!更快(大部分)
  • 更容易维护
  • 更容易保持数据清洁(可能)