数据库设计心得——高校招生录取系统
前言
在软件工程导论项目课程中,我们负责的项目是高校招生录取系统并对其展开了数据库设计。我们通过PowerDesigner完成了本项目的数据库的概念模型、物理模型的设计。以下是我们团队的数据库设计过程以及一些心得体会。
团队介绍
项目名称:高校招生录取系统
指导老师:李军义
小组名称:这么菜是我不队
小组成员:李悦(pm)、梁佳宜、刘锦乐、梁芷曦、郭冬妮、汤波力
项目简介与背景
目前各省高考录取模式相较以前有所变化:考生录取数据格式不一致,国防生停招、招生类别发生巨大变化,不同门类考生录取标准存在较大差异,学校现有的招生录取信息管理系统没有按照新的高考招生录取政策更新录取功能,缺少添加关注考生信息等功能,原有的招生录取信息管理系统已经无法满足目前新增的招生需求。为了更好地适应国家招生政策的调整(按学校投档和按专业投档并存),提升学校的形象,提高招生工作效率,我们迫切需要在原有C/S架构的系统基础上进行修改,改成B/S架构并以Web系统的形式展示,完善并更新原有功能,减轻工作人员压力。
数据库设计目标
- 用于开展系统的详细设计
- 用于开发人员进行系统开发
- 通过仔细的设计减少后期程序开发过程中存在的隐患和不必要的资源浪费
- 节省数据的存储空间、保证数据完整性、保证系统安全可靠、提高系统性能
数据库设计过程
在本次的项目过程中,数据库设计分为以下几个阶段:
- 需求分析
- 概念模型设计
- 物理模型设计
- 模型检查
- 数据库定义
需求分析
项目开展初期,我们通过和李老师沟通项目需求,撰写了项目前景与范围文档、用例文档、需求规格说明书等文档,以及制作了图形化的原型界面和图解化的系统UML图。我们的数据库设计将围绕这些已有资料作为参考和指南。
概念模型设计
概念模型设计是整个数据库设计的关键,它通过对用户需求进行综合,归纳与抽象,形成一个独立于具体DBMS的概念模型,即概念模型的设计与某一特定的数据库无关,具有通用性和普遍性。
在李老师的建议和指导下,我们对数据库的概念模型进行了四次迭代、修改,得到了如下图的概念模型:
物理模型设计
物理设计是为逻辑数据结构模型选取一个最适合应用环境的物理结构,包括每个模型如何存储、每个字段如何存储、以及每个字段存储的类型大小等。物理模型严格地按照相应的ODBC(数据库对象)进行设计,与DBMS相关联。
通过使用PowerDesigner建立好的概念模型,我们可以直接使用工具将其转换成物理模型,并生成对应的sql脚本代码。
模型检查
通过一次次迭代,与老师沟通,检查当前模型是否符合范式、是否满足项目业务,并对其做出修改调整。
我们在开发的过程中,发现字典表的设计并不合理:只把代码类别作为主键,并不满足数据项的唯一性,且在后期的开发中,对多表查询带来了一定的困难。
于是我们与老师进行沟通,重新设计该表,设置(代码类别、代码)为索引,创建一个自增id作为主键(与系统业务无关)。
数据库定义
因为本项目采用了PowerDesigner设计PDM,PowerDesigner可以通过PDM自动生成相应数据库表的创建sql语句,我们只需要在DBMS中执行即可,大大减少了数据库设计人员的工作量。下图是本项目中所有的数据库表:
数据库设计中出现的问题
-
表和字段的命名
问题描述:我们一开始是用英文翻译来设计各个表和字段,由于系统涉及的是我国的高考相关信息,很多字段翻译过来并不准确,且字段长而复杂。
问题解决:第二次迭代,我们推翻了第一次的设计,根据老师的建议:按照给定的高考考生数据包来设计表和字段,采用中文缩写的方式来命名,标齐规范,方便后续的处理各种exel表格工作。设计的过程,我们对表和字段都添加了注释,使得所有信息一目了然。
-
表的设计不严格满足数据库设计范式
问题描述:我们在第二次迭代的时候,设计了一些冗余的字段,比如考生信息表和专业代码表。比如考生的专业,我们打算存放的是中文字段,而与专业相关的表中,存的是代码。
问题解决:老师建议我们把所有和专业有关的字段全部改成代码,通过连接字典表可以把代码转换成对应的解释字段。
-
实体的创建
问题描述:我们按照以往的经验认为,一个实体即对应一个数据库中的表,导致在建立实体集的时候考虑不够全面,导致设计出来的表不符合范式。
问题解决:经过老师的指导,我们分析了系统的对象,把具有相同属性的一类对象抽象出来。比如,把分散的各个字典表总和成一个。
总结心得
-
选择高效的设计工具
我们使用的是PowerDesigner,该工具是数据库设计的不二选择且其操作简单方便,对于我们这些新手也十分友好。但是后期发生表的改动的时候,要连着pdm、sql语句一起改。我们还暂时没有用到它的逆向工程功能。经往届学长介绍说,还有比PowerDesigner更快构建数据库表的工具,碍于精力不足尚未涉足该不明领域。
-
扩展性的设计
我们的系统设计到许多代码和对应字段,我们一开始打算直接在数据库中存入这些数据字段(中文),经老师建议后,有字典表对应的字段全部存代码。这样在后期扩展的时候,方便增删改查。
-
主键的设计
我们第一次迭代时,所有的表的主键设计都与业务无关,设计成自增id。老师建议我们,例如考生信息表,最好使用考生号作为主键,使得整个设计更加符合业务规则且方便后期的多表查询操作。