2010-04-28 90 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(行程,位置)有多个乘客的算法,请阅读活性分析和线性扫描。