2017-03-20 179 views
2

私はバスの座席予約データベースを設計しています。私の問題は、どのようにしてバスの座席をマッピングするデータベースを設計できるかということです。座席予約システムデータベースデザイン

たとえば、ルートSRCからDESTまでは10のバスがあり、すべてのバスは50の座席を持ちます。すべてのバスには一意のバス番号があります。 50の座席をすべてのバスに割り当てることができるデータベースを設計し、座席が既に予約されているかどうかを表示するにはどうしたらいいですか? 乗客は快適な通りにバスと座席番号を選択できます。

1つの方法は、列がbus_id (int), seat_id (int), status (bool)のテーブルを作成することです。しかし、このアプローチでは、すべてのbus_idは、バス内で使用可能な総シート数に等しい行を持ちます。この問題について私に示唆してください。

+2

MySQL <> SQL Serverでは、質問を編集し、不要/間違っているタグを削除してください。これはdba.stackexchange.comにも最適です。 – scsimon

+1

dbスキーマを変更せずにバスレイアウトを管理できるので、すべてのバスの各座席の行を作成することは、 "Bus"テーブルの各座席の列を作成するよりも優れています。 *ベスト*デザインは非常に主観的ですが、dbは予約されていない座席(status = false/NULL)を気にする必要はないと主張します。これはアプリケーションレベルの責任でなければなりません。 – Filburt

答えて

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 
    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 
    ) 
2

それはセミフォーマルな言語での事業ドメインを表現するのに役立ちます。

私はあなたのような何かを言っていると思う:

システムは、多くの場所があります。

システムには多くのルートがあります。

ルートは2.nの宛先を結合します。

ルートには1.nスケジュールがあります。

スケジュールに1..n出発があります。

出発は1バスです。

バスは50席あります。

システムには、0..n人の乗客がいます。

乗客には0..nの予約があります。

予約は1発1席です。

これはあなたの線に沿ってスキーマ与えるだろう:あなたが席についての追加データを格納する必要がある場合(すなわち、それらは1から50までちょうどシーケンスではありません

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 

を、あなた場所を保存する必要があるかどうか、または障害者がアクセスできるかどうか、あるいはウィンドウまたはイリーシートであるかどうか)を確認するには、@ sqlzimの提案と同様の追加の "bus_seat"テーブルを導入する必要があります。