日期:2014-05-17  浏览次数:20746 次

如何合理的选择表结构?
我是一个Oracle的初学者,老师把一些常用的知识点讲了以后给我们布置了一道练习题:简单的公交车查询系统。
1.建立表结构:
  包括信息:车号
  首班车时间
  末班车时间
  起点站
  终点站
  车站(不考虑各站的先后顺序)
  起价(比如 空调车2元起价,普通车一元,旅游车1.5元)
  要求能够方便的添加和删除各路车对应的车站
  制作并插入数据(数据可以自己编造)

2.要实现的功能:
  查询某一车次的所有站及其起点终点
  查询从某站到某站能坐的所有车
  查询现在是6:20,在某站能有车到另一站吗?

我想了很久不知道怎么实现这些功能,写了好几条语句总是不能得到理想的结果。后来反思了一下,觉得可能是没有选择一个合理的表结构导致后面的功能没法很好地实现。
  所以,在此希望有经验的高手能够分享一下,当你遇到一个问题时,你是如何去选择表结构的?你如何把你的表结构和你要实现的功能联系在一起?你的思路是怎么样的?

------解决方案--------------------
根据数据流程图构造E-R图
你一定要清楚自己的需求,一定要清楚实体与实体之间的关系

简单的公交车查询系统
公交车是一个实体
车站又是一个实体
公交车与车站是有关系的--多对多的关系
你在根据你的需求构造出E-R图,根据E-R图构造出表,并且表要达到至少2范式

------解决方案--------------------
表结构的创建没有什么固定的创建方式,一般都是根据功能用途,访问量及效率自己优化设计。
比如说对于楼主的课题。

在楼主给定的需求中,我们可以确定一些相对固定的信息和一些变化的信息。
所以我觉得楼主应该设计两张表,
第一张表,公交车表
字段:车号,首班车时间,末。。。起点站,终。。起价
这个表就是一个master表,因为信息一登陆需要更改的很少。

第二张表,车站表
字段:车号,车站
这个表只存变化的信息,减少表空间,同时也可以增加操作性和效率。

实现楼主所要求的功能,我觉得就很简单了
1,
select t1.* t3.车站 
from t1 ,(select t1.车号,wm_concat(t2.车站) 车站 from t2 group by t1.车号)t3
where t1.车号=t3.车号
2,
select t2.车号
from t2 where t2.车站=某站1 and t2.车站=某站2 group by t2.车号
3,
第三个问题你并没有说每一个站的具体时间,所以我就只是想当然的用首班车时间和末班车时间来计算了
select t1.车号
from t1
where t1.首班车 < 6:20 < t1.末班车
以上只是思路,具体sql没有按语法写