2017-03-20 96 views
2

我正在設計一個公交車座位預約數據庫。我的問題是如何設計一個映射巴士座位的數據庫?座位預約系統數據庫設計

例如,從SRC到DEST的路線有10輛巴士,每輛巴士有50個座位。每輛巴士都有唯一的巴士號碼。 如何設計可以將50個座位映射到每輛公交車的數據庫,並顯示座位已被預訂或未預訂? 乘客可以根據自己的舒適度選擇任何巴士和任何座位號碼。

一種方法是創建列表bus_id (int), seat_id (int), status (bool)。但是通過這種方法,每個bus_id的行數都會等於公共汽車總座位的數量。請在這個問題上建議我。

+2

MySQL <> SQL Server,請編輯您的問題並刪除不必要/不正確的標記。這也最適合dba.stackexchange.com。 – scsimon

+1

爲每個公共汽車的每個座位創建一個行比爲「總線」表中的每個座位創建一個列更好,因爲您可以在不修改數據庫架構的情況下管理總線佈局。 * best *設計非常主觀,但我認爲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 
    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 
    ) 
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」表。