Mysql 公交车预订系统的座位管理

Mysql 公交车预订系统的座位管理,mysql,database-design,Mysql,Database Design,我正在为公交车预订系统设计一个数据库,在某些情况下,我不知道如何限制座位。 假设我有公共汽车站A-B-C-D-E,它形成了从A到E再到C和D的路线。公共汽车有10个座位。现在,如果A-B和D-E分别预订了10个和10个座位,那么系统应该允许预订B-C、B-D和C-D。我不知道如何设计一个能够满足所有场景的方案,以避免预订已经满座的路线 我计划使用PHP开发MySQL。下面是数据库设计的相关部分(数据库本身太大,我试着做一个简单的演示) 如果我正确理解场景,我会这样做: ID|busStop|ro

我正在为公交车预订系统设计一个数据库,在某些情况下,我不知道如何限制座位。 假设我有公共汽车站A-B-C-D-E,它形成了从A到E再到C和D的路线。公共汽车有10个座位。现在,如果A-B和D-E分别预订了10个和10个座位,那么系统应该允许预订B-C、B-D和C-D。我不知道如何设计一个能够满足所有场景的方案,以避免预订已经满座的路线

我计划使用PHP开发MySQL。下面是数据库设计的相关部分(数据库本身太大,我试着做一个简单的演示)


如果我正确理解场景,我会这样做:

ID|busStop|routeTime
1 | A | 01:00
SeatId  ---- Source ----- Destination
 32A          A            B
 32A          B            C
 32A          C            D
 32A          D            E
在这张表中,您的所有预订都将进行,因此每次预订都会有一行。 因此,现在您可以计算每条路线上每个站点的预订量以及剩余座位数

这回答了你的问题吗

编辑:当然,您也应该为进行预订的帐户的ID添加一列

EDIT2:您可以使用不存储总线停止a、B的总线驱动器(或类似的)列,而不是使用总线停止列。。。但是存储路线A-B,B-C

假设一位顾客预订了a-B路,这一行加上a-B值。我们可以计算出a-B路还有9个座位。所以现在如果数据库中有10条A-B的记录,我们知道A-B路线已经没有座位了

当然,您可以在它旁边创建一个表,其中包含公交车站本身

这是你想要的吗

编辑3:

用户表:

ID|username ...
公共汽车停靠台:

ID|busstop|userID ...
总线驱动台

ID|busdrive|userID ...
userID是指用户表中的ID列


编辑4:所以现在当有人从A-D预订时,你在busdrive中用值A-B、B-C和C-D创建三条记录,我认为你必须从一个表开始,该表包含每个端点及其关联的父项

因此,表1定义了每个路由点

RouteId : "A"
RouteName "My A Route"

RouteId : "B"
RouteName "My B Route"
表2(路径)将定义路由的连接方式:

PathId :"P1"
RouteId : "B"
ParentRouteId : "A"
现在,您可以使用第三个表来跟踪谁在乘坐哪条路线,以及它的父母在累积乘客总数


我知道这有点含糊不清,但它应该会让您走上正确的轨道。

来存储座椅跟踪信息。您可以提出表格(座位映射)。 假设公共汽车的起点和终点是A->E。 因此,我们有以下有效路径为您预订机票: A->B,B->C,C->D,D-E

比如说,U1想预订一个座位,比如32A的a-E。 座椅映射表如下所示:

ID|busStop|routeTime
1 | A | 01:00
SeatId  ---- Source ----- Destination
 32A          A            B
 32A          B            C
 32A          C            D
 32A          D            E
所以,如果任何用户想要预订一条路线的票,可以说C-E 您只需查询下表中的座位可用性即可

选择seatId where source!='C'和目的地!='E′

另外,假设另一个用户U2想要预订A和C之间的座位32B 现在条目看起来像

 SeatId  ---- Source ----- Destination
 32A          A            B
 32A          B            C
 32A          C            D
 32A          D            E
 32B          A            B
 32B          B            C
如果另一个用户说U3,想预订a到D之间的座位 根据以上查询,这将不会返回任何座位。 选择seatId where source!='A'和目的地!='D′


希望这能回答你的问题。

如果能说出为什么要投反对票就好了。这将使问题变得更好,因为我相信它是有效的问题(经过广泛的SO搜索)路线由两个站点组成,我需要涵盖问题中所述的场景。不要担心其他领域,它们正在生产中。我只是把它剥离到最小值来说明我的观点当A-C满的时候问题就来了,A-B和B-C自动满了,因为那个家伙确实占据了A到CSo(edit4)的座位,我需要插入一整套数学组合,对不对,即AC=AB,BC,AC和AD=AB,BC,BD,AD?你能编辑和扩展edit4吗,这就是我问题的答案。你能解释一下第三张桌子的位置吗。它在正确的轨道上