我为汽车租赁公司创建了一个预订系统,我在设置汽车可用性时遇到了问题。
它的工作原理的一个简短示例是,单个汽车在预订时在数据库中名为yes
bookedout
的值
好的,所以说例如,有10辆汽车(这是不切实际的小但是证明了这一点)
其中一辆是奥迪R8。今天的日期是2012年3月6日。
用户从3月26日到3月31日预订车辆。但他们今天通过网站预订。我无法立即将bookedout
值设置为yes
,或者网站实际上会认为从3月6日到3月31日该车无法使用。
这种情况会导致公司资金减少。
所以我正在寻找类似于服务器上的脚本,检查当前日期,然后每天检查数据库。例如,如果在今天的日期开始预订,则会更改数据库中的值,以便从当天开始无法预订汽车。
反过来,我也可以调整它,以便在汽车返回的日期更改价值。
我并不是专门寻找代码(虽然我不会对例子说不),只是一个起点来解决这个问题,因为我之前从未这样做过。
基本上,我需要一种在特定日期触发查询而无需任何用户互动的方法。
任何帮助都会受到重视。 :)
答案 0 :(得分:5)
我会以答案的形式为你详细说明这一点,但我不会发布任何代码,因为我认为没有必要回答这个问题。
你的数据库结构看起来应该是这样的(汽车租赁公司想要的许多领域 - 例如里程,损坏等 - 都是为了简洁而遗漏的):
<强>汽车强>
<强>客户强>
<强>保留强>
我们的想法是,您永远不会使用car
存储预订状态。相反,您创建reservation
start_date
并将end_date
设置为预订日期。
检查指定日期范围内可用汽车的查询将是:
SELECT
c.car_id
FROM
cars c
LEFT JOIN reservations r ON (
c.car_id = r.car_id
AND r.start_date <= $reservationEndDate
AND r.end_date >= $reservationStartDate
)
WHERE
r.reservation_id IS NULL
使用此模型,您无需担心运行基于时间的作业来更新汽车保留状态。虽然为了优化您的应用程序,您可以运行更新汽车状态的日常工作,这样您就可以快速找到今天可用的汽车数量。
附加说明
作为N.B.在评论中指出 - 您需要确保您的应用程序不允许在预订表中冲突的日期范围。没有可以解决此问题的唯一索引,因此您需要在应用程序逻辑中处理此问题 - 请注意竞争条件。可能的解决方案是在有人在特定日期范围内查看汽车时立即创建临时预订。
另一个附加说明
N.B。还有一个很好的建议,以避免上述问题:使用数据库触发器来验证服务器端。如果创建了另一个冲突的预订,数据库可以拒绝触发器中的INSERT。这个解决方案可能是最好的,因为它使验证尽可能接近数据(因此您不能在应用程序中“忘记”它。)
答案 1 :(得分:1)
您问题的字面答案是cron(假设您在* nix系统上运行)。
然而,你真的不想这样做 - 它非常脆弱,因为你每次运行cron作业时仍然需要查询表中的预订;这意味着现在有3个地方知道汽车预订的工作方式(cron工作,预订表和你的申请)。
通过将汽车加入预订表,可以轻松地预订汽车。如果在给定日期有效预订,则可以认为该车无法使用。
对您的架构做一些假设,它可能类似于
select 'booked'
from cars c,
bookings b
where c.car_id = b.car_id
and b.start_date < ?required_date
and b.end_date > ?required_date
union
select 'free'
from cars c,
bookings b
where c.car_id = b.car_id
and b.start_date >= ?required_date
or b.end_date <= ?required_date