日期:2014-05-18  浏览次数:20438 次

今天面试,出了一个数据库结构问题的面试题
有三个表:
学生表(学生ID,姓名,)
科目表(科目ID,科目名称)
成绩表(学生ID,科目ID,成绩)

面试的软件经理问我,以上的表结构存在不合理,需要怎么修改,谢谢大家了


------解决方案--------------------
留下来学习
我没看出来哪里不合理
------解决方案--------------------
学习,不知道,觉得很合理
------解决方案--------------------
面试的软件经理是不是觉得这样的表考虑的太少了,很多字段都没加上去
------解决方案--------------------
学生表(学生ID,姓名,)
科目表(科目ID,科目名称)
成绩表(成绩ID, 学生ID,科目ID,成绩)--(第一个字段为主键)
------解决方案--------------------
最好在成绩表加个考试日期字段
------解决方案--------------------
符合基本的范式规范,不知道他说的不合理指的是不能完成特定的需求,还是什么意思

设置每个表的关键字,创建外键关系
------解决方案--------------------
学生表(学生ID,姓名)
科目表(科目ID,科目名称)
成绩表(学生ID,科目ID,成绩)

例如语文,如果是小学到高中都叫语文。如果这样设计,就不知道成绩具体是哪个年度的语文成绩。
应该在成绩表加年份字段!
------解决方案--------------------

学生表(学生ID,姓名)
科目表(科目ID,科目名称)
成绩表(学生ID,科目ID,成绩,年份)
------解决方案--------------------
成绩表中的 ‘科目ID’貌似不合理。在 表中 好像不能一一对应

------解决方案--------------------
这样解释有点儿牵强。

设计表结构,最主要的是满足业务需求,没有业务需求的支撑,凭空设计表是没有意义的。


成绩表(学生ID,科目ID,成绩)

这样设计最灵活,但实现起来代码可能麻烦些。



------解决方案--------------------
这样设计没有什么问题。
他的解释很不充分,至少我不能认可。

即使涉及实际业务需求,学生表单独存在是不存疑议的。
而科目表因为还与排课,任课教师等相关,也必然要单独维护。
成绩与两基本信息对应也没有问题。



------解决方案--------------------
很显然不必考虑其他字段。
否则,年级、班级、学期、考试类型、考试日期等等很多字段都是要考虑的
------解决方案--------------------
没啥问题。偶觉得。满足3NF.
------解决方案--------------------
个人觉得想要的是第三个表,每个学生一条记录,
学生ID 科目ID 成绩 科目ID 成绩 科目ID 成绩
想要这样的表吧

------解决方案--------------------
学生表(学生ID,姓名,以及学生基本资料。。。。。)
科目表(科目ID,科目名称)
成绩表(学生ID,科目ID,成绩,创建时间,成绩的id,录入人员名称。。。)
------解决方案--------------------
学生表(学生ID,姓名,学生的一些基本信息)
科目表(科目ID,科目名称,科目相关的信息)
成绩表(Id identity,学生ID,科目ID,成绩,时间之类的一些属性)
------解决方案--------------------
没什么问题...
最多就关系表差个主键...


但要说问题... 结合实际的话... 那多的是
什么学生基本信息啊.
科目信息.任课老师
成绩表什么考试时间啊,成绩啊,学期啊...
一大堆...
但是抽象出来
基本上这3个表没什么问题...
------解决方案--------------------
成绩表(学生ID,科目ID,成绩)
对,这样设置在实现代码的方面比较复杂一点

ojuju10(longdchuanren)
成绩表(Id identity,学生ID,科目ID,成绩,时间之类的一些属性)
是个方法。但不能保持表的一致性。
------解决方案--------------------
方案一:
成绩表(学生ID,科目ID,成绩) => 成绩表(成绩ID,成绩)
然後再添加一張關係表 => (学生ID,科目ID,成绩ID)
理由:
對於同樣一門科目,如果考了兩次試,按照 成绩表(学生ID,科目ID,成绩)的設計,各次考試之間先後順序無法確立,故利用成績ID,同一學生的同一科目中成績ID最大的為最新考試成績記錄

方案二:
在成績表中添加一個字段:考試時間,然後把(考試時間,学生ID,科目ID)共同做主鍵,這樣就能區分每次的同科目考試的成績了

根本原因就是(學生ID,科目ID)兩個字段不能明確的區分各次考試成績

------解决方案--------------------