预约系统设计

问题描述:

我正在研究预订系统模式,并且在定义资源可用性时遇到了一些问题。我搜索了这里类似的问题,并在谷歌,但仍然没有清晰的认识预约系统设计

我的应用程序是用于预订出租车。每个出租车司机都在今天工作或休息一天。到目前为止,我想出了以下结构

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)) 

我想治疗可用的每个驱动程序,如果没有预约条目,然后想出不同类型的保留的:

不可用=>司机正在休息一天假期=>司机在开始/结束时间之间由用户预订取消=>取消预订

但是,保持不可用/预订状态听起来有点复杂,比我想。

那么,有什么建议,如何提高数据库架构?

+0

这是非常标准的做法。驾驶员要么不在(具有在预定表中指定的原因 - 假期,预订等),或者他可用(不在表格中)。你可以扩展“保持不可用/预订状态听起来比我想要更复杂一点” - 什么是实际问题。这是一个_good_想法扩展您的预约表包含所有不同类型的,因为你可以添加到他们后,即生病了,没车可用等和你说,你可以包括取消的标志,以确定取消 – 2017-05-03 01:07:38

更简单的方法是避免驱动程序的可用性(因为他是关闭/出租车正在修理)是其中可以开启或从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() 
) 
+1

谢谢你你的答案。但是,如果一位司机下周休假,该怎么办?有了这个设计,我不得不在下个星期一把他的状态设置为“不可用”。并且不要忘记在他的背上放回'可用'。我正在寻找更灵活的解决方案,以便我可以在未来设置资源可用性 – Anton 2014-09-26 00:19:24

+0

如果添加已取消的预留,它应该可以工作。这不是很好的,虽然,但如果你命名不同了一点(如分配,而不是保留其中分配是预约和用户ID的超不适用于分配) – 2014-09-26 00:32:08

+0

什么非可用性跟踪表?当司机休假或休息时,从时间戳和时间戳输入。当他的计程车保留时,请进入。也可以使用原因/状态标志来说明为什么他不可用。当某人取消预订时,您可以从不可用表中删除该记录。 PostgreSQL中有非常有用的时间戳功能。 – Jayadevan 2014-09-26 04:35:22