我正在设计一个公共汽车座位预订数据库。我的问题是如何设计一个映射公交车座位的数据库?
例如,从SRC到DEST,有10辆公共汽车,每辆公共汽车有50个座位。每辆巴士都有独特的巴士号码。 如何设计可以将50个座位映射到每辆公交车的数据库,并显示座位是否已经预留? 乘客可以根据自己的舒适度选择任何公共汽车和任何座位号码。
一种方法是使用列bus_id (int), seat_id (int), status (bool)
创建表。但是通过这种方法,每个bus_id的行数将等于总线中可用的总座位数。请就此问题向我提出建议。
答案 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”表。