预约系统设计
我正在研究预订系统模式,并且在定义资源可用性时遇到了一些问题。我搜索了这里类似的问题,并在谷歌,但仍然没有清晰的认识预约系统设计
我的应用程序是用于预订出租车。每个出租车司机都在今天工作或休息一天。到目前为止,我想出了以下结构
table: Drivers
id INT PRIMARY KEY
name INT
table: Users
id INT PRIMARY KEY
name TEXT
table: Reservations
id INT PRIMARY KEY
start: DATETIME
end: DATETIME
userID: INT (FOREIGN KEY(Users.id))
driverID: INT (FOREIGN KEY(Drivers.id))
我想治疗可用的每个驱动程序,如果没有预约条目,然后想出不同类型的保留的:
不可用=>司机正在休息一天假期=>司机在开始/结束时间之间由用户预订取消=>取消预订
但是,保持不可用/预订状态听起来有点复杂,比我想。
那么,有什么建议,如何提高数据库架构?
更简单的方法是避免驱动程序的可用性(因为他是关闭/出租车正在修理)是其中可以开启或从UI关闭驱动程序表中添加布尔属性。
和预留应该有一个属性作为抵消,使得查询可用的驱动程序时取消预约可以忽略不计。
所以可用的驱动程序会
select *
from drivers d
where d.Available = true
and not exists (
select top(1) r.id
from rerservations r
where r.driverid = d.id
and r.cancelled = false
and r.start < GetDate()
and r.end > GetDate()
)
谢谢你你的答案。但是,如果一位司机下周休假,该怎么办?有了这个设计,我不得不在下个星期一把他的状态设置为“不可用”。并且不要忘记在他的背上放回'可用'。我正在寻找更灵活的解决方案,以便我可以在未来设置资源可用性 – Anton 2014-09-26 00:19:24
如果添加已取消的预留,它应该可以工作。这不是很好的,虽然,但如果你命名不同了一点(如分配,而不是保留其中分配是预约和用户ID的超不适用于分配) – 2014-09-26 00:32:08
什么非可用性跟踪表?当司机休假或休息时,从时间戳和时间戳输入。当他的计程车保留时,请进入。也可以使用原因/状态标志来说明为什么他不可用。当某人取消预订时,您可以从不可用表中删除该记录。 PostgreSQL中有非常有用的时间戳功能。 – Jayadevan 2014-09-26 04:35:22
这是非常标准的做法。驾驶员要么不在(具有在预定表中指定的原因 - 假期,预订等),或者他可用(不在表格中)。你可以扩展“保持不可用/预订状态听起来比我想要更复杂一点” - 什么是实际问题。这是一个_good_想法扩展您的预约表包含所有不同类型的,因为你可以添加到他们后,即生病了,没车可用等和你说,你可以包括取消的标志,以确定取消 – 2017-05-03 01:07:38