日期:2014-05-16  浏览次数:20504 次

初次体验数据库设计

??? ?今天初次了解了数据库的设计,体会到了数据库的设计的重要性。这是在工作中遇到的。

就是把学校里教师、年级、班级还有学科映射到数据库中。

???? 首先先说下这几个表的关系,很简单,教师对年级还有班级是多对多关系,教师对学科是多对一关系。

???? 先说我的最初的想法,很简单就是按照上面描述的关系,分别建立teacher,grade,class,subject四张表。

grade,class,subject表字段就是包括各自的信息。teacher表呢,有个teachername和subject_id,然后还有2个中间表grade_join_teacher和class_join_teacher分别来存放grade和teacher以及class和teacher的信息。这样的关系很直接,估计像我这样的新手都会这样想。可能是我对数据库理解不深,我觉得这样的多对多关系用hibernate来管理时,会遇到点麻烦的问题,比如说要删除teacher时,不能删除grade吧。或者只是把他们之间的关系删掉也就是只是删除中间表的信息等(这些也是之后要研究的一个问题)。在做这些操作的时候会比较麻烦。

?? 好现在来看看另外的设计,和上面的一样,grade,class,subject没有变,唯一变的是teacher表的字段,teacher表有teacherName,grade_id,class_id,subject_id。也许你一看这个可能差异,这样不是多对一吗。呵呵~其实那是理解错了,这个teacher表不是我们传统上的teacher~这个teacher表可以理解为教某班某年级某课程的教师。注意这里的teacher表的teachername是会有重复的,也就是说同一个教师的姓名可能会出现多次(假如这名教师是交多个班级的话)而第一种设计的teacher就是单是所有的老师,不允许同一个教师的姓名出现二次。这样第二种设计就不存在多对多的关系存在,teacher表和其他的三表都是多对一的关系。比第一种维护起来会好点。

??? 其实就是看问题的角度不同了,第一种呢是先将现实的每一个对象都在数据库建立一个对应的表。然后在更加现实的关系建立表与表之间的关系。而第二种呢是先考虑现实的每一个对象的关系,像本文中说的teacher,grade,class,subject。应为通过grade,class,subject的一个组合就可以确定一个teacher,这样将所有的grade,class,subject组合一边就可以得到所有的teacher。而且也无形中建立了teacher,grade,class,subject他们的关系

有点反过来的感觉。所以以后要多反过来想想。也不知道这样的设计叫什么名字。