2015-05-04 34 views
0

我需要設計一個數據庫來管理系統中有多個體育中心的安裝預定。這些中心有不同的裝置,如游泳池,網球場,籃球場等。在一箇中心可能有多個游泳池或網球場等。他們可以有不同的可用性。例如「中心1」中的「游泳池1」和「游泳池2」可在星期一,星期三和星期五的9:00至10:00和12:00至13:00使用。星期二和星期四08:00至09:00和09:00至10:00提供「游泳池2」。我還可以添加排除日期(如假期),例如2015年12月25日星期五和2016年1月1日星期五。然後成員可以預訂和安裝,如果仍然可用。體育中心數據庫設計 - 管理預訂

現在我有如下表:

CENTER 
Id | Name 
----|----------- 
1 | Center 1 
2 | Center 2 
3 | Center 3 

INSTALLATION TYPE 
Id | Description 
----|---------------- 
1 | Swimming 
2 | Tennis 
3 | Basketball 

INSTALLATION 
Id_center | Id_installation | Name   | Id_type 
------------|-------------------|-------------------|----------- 
1   | 1    | Swimming pool 1 | 1 
1   | 2    | Swimming pool 2 | 1 
2   | 1    | Tennis court 1 | 2 

MEMBER 
Id_center | Id_member | Name 
------------|---------------|------------- 
1   | 1   | John Doe 
2   | 1   | Sarah Bole 

而且我想對以下物質:

SCHEDULE 
Id_center | Id_installation | Day_week | Time_begin | Time_end 
------------|-------------------|---------------|---------------|------------ 
1   | 1    | 1   | 09:00  | 10:00 
1   | 1    | 1   | 12:00  | 13:00 
1   | 2    | 1   | 09:00  | 10:00 
1   | 2    | 1   | 12:00  | 13:00 
1   | 2    | 2   | 08:00  | 09:00 
1   | 2    | 2   | 09:00  | 10:00 

EXCLUDING DAYS 
Id_center | Id_installation | Date 
------------|-------------------|------------- 
1   | 1    | 06/10/2015 
1   | 1    | 12/25/2015 
1   | 2    | 12/25/2015 

RESERVATION 
Id_center | Id_installation | Id_member | Date  | Time_begin | Time_end 
------------|-------------------|---------------|---------------|---------------|------------ 
1   | 2    | 2   | 05/28/2015 | 08:00  | 09:00 
1   | 2    | 2   | 05/28/2015 | 09:00  | 10:00 
1   | 1    | 1   | 05/25/2015 | 09:00  | 10:00 

你會怎樣添加或修改?

謝謝。

回答

1

匆匆一瞥,你似乎會在一個小時內發佈預訂。如果是這樣,請考慮取消Time_End列。

這裏有一個想法:

create table Reservations(
    CenterID..., 
    InstallationID..., 
    MemberID ..., 
    Date ..., 
    Time_Begin ... 
); 

如果,例如,你預約了提前半年,你可以爲每個可用日期一個條目它穿過該6個月門檻。它具有日期,該日期的最早時間(來自Schedule表)和MemberID的nullnull意味着它是可用的。由於沒有其他條目,它可以在一整天內使用。當會員進行預訂時,插入當時的記錄或更新null記錄,並在預訂結束時插入另一個null記錄 - 如果此時還沒有另一個預訂。

像這樣。這是每個新的一天如何開始:

Center Install Member StartTime 
====== ======= ====== ================ 
    1  1 null 05/28/2015 08:00 

會員14從上午8點開始一個小時的預訂。

Center Install Member StartTime 
====== ======= ====== ================ 
    1  1  14 05/28/2015 08:00 
    1  1 null 05/28/2015 09:00 

會員27使得一小時預約中午:

Center Install Member StartTime 
====== ======= ====== ================ 
    1  1  14 05/28/2015 08:00 
    1  1 null 05/28/2015 09:00 
    1  1  27 05/28/2015 12:00 
    1  1 null 05/28/2015 13:00 

這是說件1有從08-09保留,它可以從09-12,構件27具有12預約-13,從13開始可用。

當成員42想要保留11am插槽時,由於該插槽的末尾中午只有一個插入,因此已經有一條記錄。

Center Install Member StartTime 
====== ======= ====== ================ 
    1  1  14 05/28/2015 08:00 
    1  1 null 05/28/2015 09:00 
    1  1  42 05/28/2015 11:00 
    1  1  27 05/28/2015 12:00 
    1  1 null 05/28/2015 13:00 

這可正是如此讀取:

select r.*, r1.StartTime as EndTime 
from Reservations r 
left join Reservations r1 
    on r1.Center = r.Center 
    and r1.Install = r.Install 
    and r1.StartTime =(
     select Min(StartTime) 
     from Installation 
     where Center = r.Center 
      and Install = r.Install 
      and trunc(StartTime) = trunc(r.StartTime) 
      and StartTime > r1.StartTime) 
where r.Center = :Center 
    and r.Install = :Install 
    and r.StartTime between :DayOfInterest and :DayOfInterest + 1; 

這顯示了某一天的所有條目。當Member爲空時,時間可用。如果EndTime爲空,那麼該預定或可用性將進入預定日期的末尾。因此,只需添加到過濾器:

and r.Member is [not] null 

只顯示有效性或僅保留。

該查詢乍一看可能看起來有點可怕,但它遵循一致的模式,用於讀取版本爲的表格。