这只是一个例子,其简单性试图与问题中提出的简单性相匹配。我相信根据实际的实施细节会有复杂的情况。
如果有往往只有一些保留,你可以选择只排在有像这样的保留:
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
请参阅使用可用座位:使用not exists()
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
查看可用座位:
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
)
MySQL <> SQL Server,请编辑您的问题并删除不必要/不正确的标记。这也最适合dba.stackexchange.com。 – scsimon
为每个公共汽车的每个座位创建一个行比为“总线”表中的每个座位创建一个列更好,因为您可以在不修改数据库架构的情况下管理总线布局。 * best *设计非常主观,但我认为db不应该关心非预订的席位(status = false/NULL) - 这应该是应用程序级别的责任。 – Filburt