2010-04-28 203 views
3

我有一個有趣的數據庫設計問題,我在乘坐公共汽車旅行時從家裏回來時制定了一個有趣的數據庫設計問題。數據庫設計問題

爲公交票務系統(非預訂系統)設計規範化的數據庫。在每次旅行中,公共汽車售票員將在收取車費後向其乘客發放車票。乘客從不同的來源地旅行到各個目的地。

該系統必須能夠給出的地方報告爲乘客的數目是2個以上。

假設用於總線的站都L1,L2,L3和L4 假設乘客P1行進從L1到L4。 P2從L2行進到L4。 P3從L3行進到L4。

該報告應只列出(L3-L4),其中它有超過2個旅客。

能否請你幫我解決以下問題

1)設計一個規範化的數據庫

2)寫出報告

3的查詢)是否存在,讓這些種類的任何站點有趣的數據庫設計問題和答案?

+0

> 3)是否有任何網站給出了這些有趣的數據庫設計問題... 我猜這個答案是「你的班級」。 – tpdi 2010-04-28 05:49:02

+1

這看起來像是作業或面試任務。 「設計一個規範化的數據庫」,「編寫一個查詢」,「報告應該列出」都是這種性質的標準,而不是我通常會寫出來的,如果我是在尋求我的設計想法頭爲樂趣。 – 2010-04-28 05:49:50

+0

聽起來像是給我的任務,不是那麼難,我會建議有一個去和張貼你的東西,如果你需要特定點的幫助;-) – 2010-04-28 05:52:47

回答

1

數據庫設計:

Location Table 

- LocationID (p) 
- LocationName 

TravelTable 

- TravelID (p) 
- PassengerID 
- LocationFrom (F) - (Location - LocationID) 
- LocationTo (F) - (Location - LocationID) 

PassengerTable 

- PassengerID (p) 
- PassengerName 

會盡快回復您查詢還

網站的形式,你在哪裏得到正確的答案

http://blog.sqlauthority.com/

http://www.sqlservercentral.com/

+0

謝謝。一個關鍵點。你如何決定地點的順序;像L3在L2之後? – Lijo 2010-04-28 06:03:58

+0

因爲公共汽車直線行駛,而l3在l2之後。除非你回到l2之前。或者你正在傳送,在這種情況下,l3在l3之後,l2在l4之前。 – 2010-04-28 06:16:52

+0

我的觀點是,我們不應該使用位置表中記錄的順序作爲實際位置的順序。 – Lijo 2010-04-28 06:26:55

0

的關鍵表w烏爾德是:

之旅(trip_id,passenger_id,start_location_id,end_location_id)

你可能有一個位置表與有關站的信息。

然後查詢,簡直是

select start_location_id, end_location_id, count(*) 
from trip 
group by start_location_id, end_location_id 
having count(*)>=2 

編輯

每下面的評論,也許我誤解了要求。您是否試圖找到超過2名乘客的TRIPS,或者超過2名乘客的地點,或者是什麼?也就是說,如果我們有跳閘(A1,L1,L2),(Betty,L1,L2),(Carl,L1,L3),(Donna,L2,L4),輸出應爲:

L1, L2, 2 

(這就是全部)?

還是應

L1, 3 
L2, 3 

我相信我上面的查詢將給出的第一個結果。如果你正在尋找的第二個結果,這將是:

select location, sum(visits) 
from 
(
select start_location_id as location, count(*) as visits 
from trip 
union 
select end_location_id as location, count(*) as visits 
from trip 
) 
group by location 
having sum(visits)>=2 
order by location 

當你相加計算爲兩個不同的專欄中,我看不出有什麼辦法避免使用工會和內部查詢。

可以說,不同的模式將使這個查詢輕鬆許多,即代替行程有trip_stop:

trip_stop(passenger_id,LOCATION_ID,stop_number)

其中stop_number是,比方說,1開始位置和2結束位置。

現在我想到了,這真的好多了,因爲它消除了代表相同想法的兩個字段,並且可以很容易地擴展爲具有多個停靠點的行程。

然後查詢簡直變成

select location_id, count(*) 
from trip_stop 
group by location_id 
having count(*)>=2 
order by location_id 
+0

中再添加一列LocationOrder,我認爲這不符合要求。當您使用開始位置和結束位置進行分組時,它們中的每一個都將分開組。沒有記錄將被選中。 (TripID PassID StartLoc EndLoc)(1 P1 L1 L4)(1 P2 L2 L4)(1 P3 L3 L4) – Lijo 2010-04-28 06:45:16

0

這從編譯器類讓我想起了活躍度分析。其目標是找出哪些變量正在同時使用,因此寄存器分配效率更高。其他答案很好地覆蓋了數據庫部分。對於查找哪個x(行程,位置)有多個乘客的算法,請閱讀活性分析和線性掃描。