http://edu.sina.com.cn/gaokao/
这是新浪的高考查询·现在想弄一个类似于这样的功能·但对于数据库建模毫无头绪,理不清各个实体的关系,难点有3:
1、高校与专业是一对多,但专业本身又有最低分与最高分的属性,注意,这里的最低分与最高分由院校决定。
2、高校在各个地区的录取分数线、录取人数问题,如何设置高校表与地区表的联系
3、各个省份的批次分数线划分问题,此处要求批次是可变的,并且由年份不同而不同,这里要如何建表

还请各位高手支招,小弟现在已是精疲力竭了·可还是理不清楚··恳求高人!

解决方案 »

  1.   


    先贴代码:package com.java.exam;/**
     * 学院
     * for Url: http://topic.csdn.net/u/20110821/01/e51f111e-95ba-4c89-9cec-b1cfb0e7d2bf.html?2062
     */
    public class College { private Integer id;
    private String name;
    /**学院隶属的批次*/
    @ManyToOne()
    private Grade grade;
    /**专业,一个学校有多个专业,一个专业多个学院都有*/
    @ManyToMany()
    private Specialty specialty;
    @OneToOne()
    private GradeScroeLevel scoreLevel;


    }
    package com.java.exam;/**
     * 专业
     */
    public class Specialty { private Integer id;
    private String name;}
    package com.java.exam;/**
     * 地区,省份
     */
    public class Area { private Integer id;
    private String name;

    }package com.java.exam;/**
     * 批次:一本,二本,三本,专一,专二.....
     */
    public class Grade {
    private Integer id;
    private String name;

    }package com.java.exam;
    /**
     * 分数线,地区分数线,和学院学数线,共用一张表,用不同的列进行标识
     */
    @Entity  
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
    @Table(name="SCORE_LEVEL")  
    @DiscriminatorColumn(name="Discriminator",  
                                             discriminatorType = DiscriminatorType.STRING,  
                                             length=30)  
    @DiscriminatorValue("ScoreLevel")  
    public class ScoreLevel { private Integer id;
    /**地区*/
    @OneToOne()
    private Area area;
    /**年份*/
    private Integer year;
    /**分数*/
    private Double score;
    private String re;

    }
    /**
     * 各地区,各批次的分数线
     */
    @Entity  
    @DiscriminatorValue("GradeScroeLevel") 
    public class GradeScroeLevel extends ScoreLevel{ @ManyToOne()
    private Grade grade;}
    /**
     * 学校各批次分数线的问题
     */
    @Entity  
    @DiscriminatorValue("CollegeScoreLevel") 
    public class CollegeScoreLevel extends ScoreLevel { @OneToOne
    private College college;
    /**录取人数*/
    private Integer studentCount;
    }代码不是完整代码,因为我这边环境问题,所以 注解部分只写了主要的,有些没写全下来对设计进行说明
      

  2.   

    1。我觉得专业和学院之间应该是:多对多
    2。我的设计是自顶向下的,也就是说我是站在OO的角度来设计对象,再生成数据库的。
    其它的部分我相信,楼主都能理解到。只是关于分数线那块的设计,可能不太明白,我解释一下:  1>,一个基类:ScoreLevel  包含了基本上的所有的信息,二个子数,分别是,批次分数线、学院录取分数线 
        我们通过JPA 的继承机制,让他们三个对象生成一张表。    也就是说,我们生成以后的表应该是这样:    id    
        地区
        年限
        分数
        批次id
        学院id
        录取人数  2> 这样设计以后你怎么用列?  
      
       1)。查询的时候,你如果是查某地区、某年、某批次的录取分数线,你只要无视:    学院id
        录取人数就行,因为他们是null的,而查学院的录取人数列,则相反
     
       2)。插入的时候,你用SQL插的话,则类似于上面,直接用hibernate的,你只用直接save()相关的类就好了
          比如你要插入一个学院的分数线信息:
           CollegeScoreLevel  csl = new CollegeScoreLevel();
            .....
            session.save(csl);
           这样对应的列就插入进去了,  批次的id 就是NULL的3.在学院对象里面放了一个批次对象。。这样做的好处是什么列?     在插入学院的录取分数线的时候,你可以,获取学院的批次,比查询在那个地区,那一年,那个批次的分数线。。  学院的分数线应该是 >= 这个分数线的
    4。但专业本身又有最低分与最高分的属性,关于这个问题
        你就把最高分、最低分加在:专业对象中,也可以,不过不推荐这么做
        最好可以再多加一个对象,来保存这个信息。   不过我认为: 学院,有学生,学生肯定有专业信息、以及高考分数属性。。完全可以通过程序来获取
    所以在我设计的时候,所以我没有通过上面两种途径来满足需求。。楼主可以根据自己的需要来自行决定 就是我的想法。欢迎拍砖
      

  3.   

    不知道是不是想的过于简单了,感觉一个录取表,一个批次表就可以了录取表
    字段: (录取)id,高校ID,专业ID,省ID,年度,总批次,总录取人数,年度录取最高分,年度录取最低分批次表
    字段:(批次)id,录取id,批次序号,录取人数,分数线,最高分,最低分录取表->批次表 (一对多)
      

  4.   

    <img src="C:\Users\Administrator\Desktop\未命名.jpg" />
      

  5.   


    1)学院id不为NULL,可以当各省各校的分数查询
    2)学院开设专业id不为NULL,就是各校专业与各省之间的分数查询
    3)两者都为NUll,就当各省各批次分数线查询
    亲!帮你附上图
      

  6.   

    你这样设计从范式上来说,是对的。非常正确。但是表不一定越细越好,适当的冗余是必要的,为了减少连接次数。不信的话,你可以去SQL版块问一下。