座位预订系统数据库设计

时间:2017-03-20 16:38:54

标签: database database-design

我正在设计一个公共汽车座位预订数据库。我的问题是如何设计一个映射公交车座位的数据库?

例如,从SRC到DEST,有10辆公共汽车,每辆公共汽车有50个座位。每辆巴士都有独特的巴士号码。 如何设计可以将50个座位映射到每辆公交车的数据库,并显示座位是否已经预留? 乘客可以根据自己的舒适度选择任何公共汽车和任何座位号码。

一种方法是使用列bus_id (int), seat_id (int), status (bool)创建表。但是通过这种方法,每个bus_id的行数将等于总线中可用的总座位数。请就此问题向我提出建议。

2 个答案:

答案 0 :(得分:3)

这只是一个例子,它的简单性试图与问题中提出的简单性相匹配。我相信根据实际的实施细节会有并发症。

如果通常只有少数预订,您可以选择只在有预订时才有行:

create table bus_seats (
    bus_id int
  , seat_id int
  /*
  , additional_columns
  , handicap reservation only
  , which row
  , which side
  , is a window seat
  , seat reclines
  , extra_wide
  , distance from the restroom for calculating diffusion of odors over time
  , etc
  */
  );
create table bus_seat_reservations (
    reservation_id int
  , bus_id int
  , seat_id int
  , route_id int
  , passenger_id int
  );

查看所有巴士座位,以及路线预留的座位:

select 
    bs.bus_id
  , bs.seat_id
  , r.route_id
  , bsr.passenger_id as reserved_by
from bus_seats bs
  inner join routes r
    on bs.bus_id = r.bus_id
  left join bus_seat_reservations bsr
    on bsr.bus_id   = bs.bus_id
   and bsr.seat_id  = bs.seat_id
   and bsr.route_id =  r.route_id

见预留座位:

select 
    bsr.bus_id
  , bsr.seat_id
  , bsr.route_id
  , passenger_id
from bus_seat_reservations bsr

使用left join查看可用座位:

select bs.bus_id
  , bs.seat_id
  , r.route_id
  , bsr.passenger_id as reserved_by
from bus_seats bs
  inner join routes r
    on bs.bus_id = r.bus_id
  left join bus_seat_reservations bsr
    on bsr.bus_id   = bs.bus_id
   and bsr.seat_id  = bs.seat_id
   and bsr.route_id =  r.route_id
where bsr.reservation_id is null

使用not exists()查看可用座位:

select bs.bus_id
  , bs.seat_id
  , r.route_id
from bus_seats bs
  inner join routes r
    on bs.bus_id = r.bus_id
where not exists (
  select 1
  from bus_seat_reservations bsr
  where bsr.bus_id   = bs.bus_id
    and bsr.seat_id  = bs.seat_id
    and bsr.route_id =  r.route_id
    )

答案 1 :(得分:2)

有助于用半正式语言表达业务领域。

我认为你说的是​​:

  

系统有很多位置。

     

系统有很多路线。

     

路线结合了2..n个目的地。

     

路线有1个时间表。

     

时间表有1..n离开。

     

出发有1辆公共汽车。

     

公共汽车有50个座位。

     

该系统有0..n名乘客。

     

乘客有0..n预订。

     

预订有1个出发和1个座位。

这将为您提供以下行的架构:

Destination
---------
Destination_id

Route
-------
Route_id

Route_destination
-------------
Route_destination_id
Route_id
from_destination
to_destination
sequence

Departure
--------
Departure_id
Route_destination_id
Departure_time
Arrival_time

Bus
---
Bus_id
(seats if this could vary per bus)

Customer
------
Customer_id

Reservation
---------
Reservation_id
Departure_id
Customer_id
Date
Seat_no

如果您需要存储有关座位的其他数据(例如,它们不仅仅是1到50之间的序列,而是您需要存储位置,或者它们是否可供残障人士使用,或者是否为窗口或isle seat)你需要引入一个类似于@sqlzim建议的额外“bus_seat”表。