[英]How to check for blocks of availability in a MySQL booking database?
我有一个住宿预订引擎,该引擎遵循以下规则:
这里有些例子:
系统在数据库中有一个简单的表,该表是包含7个房间的每个日期的列表。 每个房间的字段可以为0(不可用)或1(可用)。
该表称为vg_booking_availability
。 这是快照。
我需要一种针对用户搜索选择搜索表的方法。
可能以2、4或天以及1到7个房间之间的任意组合进行搜索。
我不确定解决方案是否是在所有日期和所有房间进行数据库查找,然后创建一个多维数组并通过用户搜索进行交叉检查是前进的方法。 如果这是我要怎么做?
这是在SQL中针对room_1
进行room_1
两天的预订的room_1
:
SELECT
avail1.date start_date,
"room_1" room_name
FROM vg_booking_availability avail1
/* This row is the next day to the first one */
INNER JOIN vg_booking_availability avail2 ON (avail1.date + 1 = avail2.date)
WHERE
avail1.room_1 = 0
AND avail2.room_1 = 0
/* Add in a clause to check future dates only here */
;
您可以将所有房间作为方括号OR
语句添加,但我倾向于将其作为单独的查询运行(否则,您必须在PHP中重新搜索结果以确定可用的房间)
我们这里遇到了麻烦,因为所有房间都被非规范化了-在另一个可以更好地对待它们的桌子中,它们会更好。
可以通过分别为4天和7天搜索添加更多的别名行来扩展此示例。 周四(或其他任何规则)上的房间无法使用与问题没有直接关系,因为您可以创建未来的可用性行(基于未来人们预订的距离),然后根据这些规则来使房间不可用。 那是一个单独的(也是琐碎的)问题。
我也倾向于更改此设置,因此您将NULL
为可用,并将客户表的外键设置为不可用。 然后,这将为您提供有用的信息,说明为什么房间不可用,并且如果特定客户取消预订,您将可以轻松重新使用它。
最后,该解决方案具有大量联接的能力,因此针对数据集进行测试至关重要。 如果要在10K的行表上运行它,那很好,但是如果行数为1M,则可能不是这样(当然,这取决于硬件和负载)。 因此,一旦完成此工作,我建议您创建一个数据生成器(PHP对此非常有用),并确保您可以获得所需的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.