簡體   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