本帖最后由 Anders_Zhuo 于 2013-12-31 08:29:49 编辑

解决方案 »

  1.   

    成绩表
    学生id   课程id   考试id   班级   年级   分数这样的表由  学生id  课程id 考试id 这三个作为联合主键,
    当扩展考试科目的时候,只需要在课程表添加一个课程就可以了问题在于查询:
    1 查询某个学生某次考试的成绩,查询还算方便
    select * from 成绩表 where 学生id=@X and 考试id=@Y;2 查询某个班级的某次考试成绩  很不方便
    select * from 成绩表 where 班级=@A
    2 年级更不用说了
    select * from 成绩表 where 年级=@B
    4 按成绩排名就更加麻烦
    select * from 成绩表 order by 分数 desc
      

  2.   

    你的第一种设计明显不行,除了你说的扩展问题,冗余度很大。
    第二种设计好了一点,但还是不满足设计的规范。学生id   课程id   考试id   班级   年级   分数这样这张表,会出现很多 重复的【班级】【年级】记录,因为这两个字段只依赖于 【学生】这个字段,不完全依赖于 【学生 + 课程】所以,你应该设计多一张【学生年级班级】表(参考),保存【班级】和【年级】。然后在 【学生】表加入这个id。*加多一张小表可以很大降低冗余度,至于 sql 怎么写,总可以写出来的,麻烦一点点,但速度快很多。
    建议学习一下数据库设计三(五)范式。
      

  3.   


    按照第三范式的确应该再多加一张表,
    但是,按照我的设计话,会方便书写sql但是现在又有一个新问题:
    在显示班级成绩单或者年纪成绩单的时候要显示成绩排名,以及这次排名与上次考试排名的比较(如进步了则显示+n,退步了则显示-n),这样写sql就很麻烦
      

  4.   


    按照第三范式的确应该再多加一张表,
    但是,按照我的设计话,会方便书写sql但是现在又有一个新问题:
    在显示班级成绩单或者年纪成绩单的时候要显示成绩排名,以及这次排名与上次考试排名的比较(如进步了则显示+n,退步了则显示-n),这样写sql就很麻烦
    方便写 sql ? 在写 sql 的时候,考虑的应该是【效率】。
    表设计的时候,没人会去考虑 到时候怎么 写 sql 语句,考虑的是如何设计更合理,冗余度更低。
      

  5.   


    按照第三范式的确应该再多加一张表,
    但是,按照我的设计话,会方便书写sql但是现在又有一个新问题:
    在显示班级成绩单或者年纪成绩单的时候要显示成绩排名,以及这次排名与上次考试排名的比较(如进步了则显示+n,退步了则显示-n),这样写sql就很麻烦
    方便写 sql ? 在写 sql 的时候,考虑的应该是【效率】。
    表设计的时候,没人会去考虑 到时候怎么 写 sql 语句,考虑的是如何设计更合理,冗余度更低。就我刚才说的显示:
    这次排名与上次考试排名的比较(如进步了则显示+n,退步了则显示-n单纯这个功能效率就不会很好
      

  6.   


    按照第三范式的确应该再多加一张表,
    但是,按照我的设计话,会方便书写sql但是现在又有一个新问题:
    在显示班级成绩单或者年纪成绩单的时候要显示成绩排名,以及这次排名与上次考试排名的比较(如进步了则显示+n,退步了则显示-n),这样写sql就很麻烦
    方便写 sql ? 在写 sql 的时候,考虑的应该是【效率】。
    表设计的时候,没人会去考虑 到时候怎么 写 sql 语句,考虑的是如何设计更合理,冗余度更低。就我刚才说的显示:
    这次排名与上次考试排名的比较(如进步了则显示+n,退步了则显示-n单纯这个功能效率就不会很好如果你是自己做小练习,只是为了一个句子的查询,可以向你说的。
    如果是项目,数据量很大,在设计表的时候,不会先去考虑后面要怎么写 sql 。【这次排名与上次考试排名的比较(如进步了则显示+n,退步了则显示-n】
    如果你要保存 每一次考试的成绩,你可以再建立一张成绩表。要与上次比较,连接两次就行。