繁体   English   中英

如何检查MySQL预订数据库中的可用性块?

[英]How to check for blocks of availability in a MySQL booking database?

我有一个住宿预订引擎,该引擎遵循以下规则:

  • 用户可以在任何日期预订多达7间客房。
  • 用户只能预订2天,4天和6天的区块。
  • 用户不能预订星期四(关闭以进行清洁)。
  • 有时由于团体预订,整个星期都无法使用。

这里有些例子:

  • 2天的时间段可能是星期五和星期六,星期日和星期一或星期二和星期三。
  • 4天的封锁可能是星期五至星期一或星期日至星期三。
  • 6天的封锁可能是从星期五到星期三。

系统在数据库中有一个简单的表,该表是包含7个房间的每个日期的列表。 每个房间的字段可以为0(不可用)或1(可用)。

该表称为vg_booking_availability 这是快照。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM