[英]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.