我想在进行数据库设计之前,需要要明白为什么设计数据库,不进行数据库设计可以吗?如果只是随便在院子里搭一个棚子需不需要先画图设计,但是如果要建造一栋大厦又需不需要设计?
思考之后,可以得出结论:面对复杂的数据库时,我们需要进行数据库设计。
在数据库项目开发中,一个良好设计的数据库无疑有很多的好处。有较少的数据冗余、节省存储空间,能够保证数据的完整性。那么如何设计一个数据库,又有哪些流程。
按照软件开发的流程:
各阶段得到的文件:
这里通过设计学生使用的机房收费系统的数据库来演示:
分析用户的业务和数据处理需求,这一阶段,我们得到数据字典和数据流图
数据流图(Data Flow Diagram,DFD):通过数据流图来表达系统内数据处理的过程。
下面以收费系统的用户登录过程为例,来说明数据流图如何描述数据处理过程。
上图描述了用户登录系统的过程。用户在登陆界面输入用户名和密码进行登陆验证。通过查询用户信息文件来核对用户的身份,如果身份验证通过则创建一条登陆记录添加到登陆记录文件中,完成登陆登记。
数据字典和数据流图配合,能更清楚的表达数据处理的要求。用词条的方式定义在数据流图中出现的所有被命名的图形元素,包含数据流、加工、数据文件、数据元素以及数据源和数据谭。
下面是一个简单的示例:
在概要阶段,我们要进行数据建模,即传统的实体-关系方法,它使用了三种互相关联的信息:数据实体、描述实体的属性、描述实体间相互连接的关系,使用E-R图来表述。
数据实体
在E-R图中,实体用矩形来表示,是具有若干属性信息的组合体。数据实体可以是外部实体(如显示器)、事物(如报表)、角色(如学生)、行为(如打电话)或者事件(如单击)、组织单位(如院系)、地点(如教室)、或结构(如文件)。
属性
属性定义数据实体的特征,在E-R图中用椭圆形来表示。
关系
各个实体之间的关系通过菱形来表示,它们之间的关联有三种:一对一(1:1)、一对多(1:m)、多对多(n:m)。
在这里为了避免属性太多而显得太乱,我去掉了实体的属性,仅展示实体和它们之间的联系。
在详细设计中,需要把概要设计得到的E-R图转换为关系模式,并且进行范式检查
原则:
范式检查
最后的关系模式为下面所示:
学生(学号,姓名,性别,年级,系别,班级,备注)
卡(卡号,学号,金额,类型,状态,注册时间、退卡时间)
用户(ID,姓名,性别,口令,权限级别)
系统(会员费率,临时费率,单位时间,至少上机时间,准备时间,最低金额)
充值(卡号、充值金额、充值时间)
上机(卡号、上机时间、下机时间、机器名)
登陆(用户ID、登陆时间、注销时间、机器名)
账单(收入、花费、退还、余额、结账时间)
这里使用了PowerDesigner来实现数据库
SQL文件为:
/*==============================================================*/
/* Database name: JFCharge */
/* DBMS name: Microsoft SQL Server 2005 */
/* Created on: 2016/3/13 20:05:35 */
/*==============================================================*/
drop database JFCharge go /*==============================================================*/ /* Database: JFCharge */ /*==============================================================*/ create database JFCharge go use JFCharge go /*==============================================================*/ /* Table: T_Bill */ /*==============================================================*/ create table T_Bill ( bllCashIn numeric(19,4) null, bllCashout numeric(19,4) null, bllCashBack numeric(19,4) null, bllCashRemain numeric(19,4) null, bllDateTime datetime null ) go /*==============================================================*/ /* Table: T_Card */ /*==============================================================*/ create table T_Card ( cardID int not null, stuID int null, cardCash numeric(10,3) not null, cardType char(10) not null, cardStatus char(10) not null, cardDateTime datetime not null, cardBackDateTime datetime null, constraint PK_T_CARD primary key (cardID) ) go /*==============================================================*/ /* Table: T_OnLine */ /*==============================================================*/ create table T_OnLine ( cardID int not null, onLineDateTime datetime not null, offLineDateTime datetime null, onLineComputer varchar(50) not null ) go /*==============================================================*/ /* Table: T_Recharge */ /*==============================================================*/ create table T_Recharge ( cardID int not null, stuID int null, recCash numeric(19,4) not null, recDateTime datetime not null ) go /*==============================================================*/ /* Table: T_Student */ /*==============================================================*/ create table T_Student ( stuID int not null, stuName char(30) not null, stuSex char(6) not null, stuGrade char(10) not null, stuDepartment char(30) not null, stuClass char(10) not null, stuExplain varchar(50) null, constraint PK_T_STUDENT primary key (stuID) ) go /*==============================================================*/ /* Table: T_System */ /*==============================================================*/ create table T_System ( sysRate numeric(19,4) not null, sysTempRate numeric(19,4) not null, sysUnitTime int not null, sysLeastTime int not null, sysPreprareTime int not null, sysLimitCash numeric(19,4) not null ) go /*==============================================================*/ /* Table: T_User */ /*==============================================================*/ create table T_User ( userID int not null, userName char(30) not null, userSex char(6) not null, userPassword char(16) not null, userLevel char(8) not null, constraint PK_T_USER primary key (userID) ) go /*==============================================================*/ /* Table: T_UserLogin */ /*==============================================================*/ create table T_UserLogin ( userID int not null, loginDateTime datetime not null, logouttDateTime datetime null, loginComputer varchar(50) not null ) go alter table T_Card add constraint FK_T_CARD_REFERENCE_T_STUDEN foreign key (stuID) references T_Student (stuID) go
其实我们在设计数据库时,如果只是按照标准的流程和规则来完成工作,那么很可能感觉无从下手,我们可以先通过自己的一些生活经验来完成初步的数据库设计。
比如说,分析机房收费系统在确定实体的时候,我们平时的生活经验就是这个系统应该要有学生、上机卡(需要注册、充值)、操作员(给我们办理上下机)、系统等实体,先初步确定之后再仔细分析。还有范式检查的时候还有更高的范式,但是我们一般在设计的时候使其满足第三范式就可以了。
以上就是数据库设计的大致流程,以机房收费系统为例子,这当中可能由于博主理解的偏差,会有不合适的地方,希望大家可以指出来,共同进步。