これは単なる例であり、その簡潔さは質問に提示された単純さと一致しようとします。実際の実装の詳細に応じて複雑になると確信しています。
しばしば少数の予約がある場合は、そのような予約がある場合にのみ行を持つように選ぶことができる:
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
bsr.bus_id
, bsr.seat_id
, bsr.route_id
, passenger_id
from bus_seat_reservations bsr
はを使用して空席を参照してください:
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 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
)
MySQL <> SQL Serverでは、質問を編集し、不要/間違っているタグを削除してください。これはdba.stackexchange.comにも最適です。 – scsimon
dbスキーマを変更せずにバスレイアウトを管理できるので、すべてのバスの各座席の行を作成することは、 "Bus"テーブルの各座席の列を作成するよりも優れています。 *ベスト*デザインは非常に主観的ですが、dbは予約されていない座席(status = false/NULL)を気にする必要はないと主張します。これはアプリケーションレベルの責任でなければなりません。 – Filburt