[置顶] 数据库设计不求人(机房收费系统)

前言

我想在进行数据库设计之前,需要要明白为什么设计数据库,不进行数据库设计可以吗?如果只是随便在院子里搭一个棚子需不需要先画图设计,但是如果要建造一栋大厦又需不需要设计?
思考之后,可以得出结论:面对复杂的数据库时,我们需要进行数据库设计。

概念

在数据库项目开发中,一个良好设计的数据库无疑有很多的好处。有较少的数据冗余、节省存储空间,能够保证数据的完整性。那么如何设计一个数据库,又有哪些流程。

按照软件开发的流程:

[置顶] 数据库设计不求人(机房收费系统)_第1张图片

各阶段得到的文件:

这里写图片描述

实现

这里通过设计学生使用的机房收费系统的数据库来演示:

需求分析

分析用户的业务和数据处理需求,这一阶段,我们得到数据字典和数据流图

数据流图(Data Flow Diagram,DFD):通过数据流图来表达系统内数据处理的过程。
下面以收费系统的用户登录过程为例,来说明数据流图如何描述数据处理过程。

[置顶] 数据库设计不求人(机房收费系统)_第2张图片

上图描述了用户登录系统的过程。用户在登陆界面输入用户名和密码进行登陆验证。通过查询用户信息文件来核对用户的身份,如果身份验证通过则创建一条登陆记录添加到登陆记录文件中,完成登陆登记。

数据字典和数据流图配合,能更清楚的表达数据处理的要求。用词条的方式定义在数据流图中出现的所有被命名的图形元素,包含数据流、加工、数据文件、数据元素以及数据源和数据谭。

下面是一个简单的示例:

  • 数据元素条目(数据处理中最小、不可分割的单位)

[置顶] 数据库设计不求人(机房收费系统)_第3张图片

  • 数据流条目(数据结构在系统的传播路径)

[置顶] 数据库设计不求人(机房收费系统)_第4张图片

  • 数据存储文件条目(数据保存的地方)

[置顶] 数据库设计不求人(机房收费系统)_第5张图片

  • 加工条目(对数据流的处理)

[置顶] 数据库设计不求人(机房收费系统)_第6张图片

  • 数据源及数据谭条目(即外部实体)

[置顶] 数据库设计不求人(机房收费系统)_第7张图片

概要设计

在概要阶段,我们要进行数据建模,即传统的实体-关系方法,它使用了三种互相关联的信息:数据实体、描述实体的属性、描述实体间相互连接的关系,使用E-R图来表述。

  • 数据实体

    在E-R图中,实体用矩形来表示,是具有若干属性信息的组合体。数据实体可以是外部实体(如显示器)、事物(如报表)、角色(如学生)、行为(如打电话)或者事件(如单击)、组织单位(如院系)、地点(如教室)、或结构(如文件)。

  • 属性

    属性定义数据实体的特征,在E-R图中用椭圆形来表示。

  • 关系

    各个实体之间的关系通过菱形来表示,它们之间的关联有三种:一对一(1:1)、一对多(1:m)、多对多(n:m)。

在这里为了避免属性太多而显得太乱,我去掉了实体的属性,仅展示实体和它们之间的联系。

[置顶] 数据库设计不求人(机房收费系统)_第8张图片

详细设计

在详细设计中,需要把概要设计得到的E-R图转换为关系模式,并且进行范式检查

原则:

  • 一个实体转换为一个关系模式,实体的属性就是关系的属性,实体的键就是关系的键;
  • 联系在转换为关系模式时,分为以下三种不同的情况:
  • 若联系为1:1,可以在两个实体类型转换成的两个关系模式中任意一个关系模式的属性中加入另一个关系模式的键和联系类型的属性。
  • 若联系为1:n,则在N端实体类型转换成的关系模式中加入1端实体类型的键和联系类型的属性。
  • 若联系为m:n,则将联系类型也转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。

范式检查

  • 第一范式:每列都不可分割,在关系型数据库中,第一范式满足
  • 第二范式:不出现局部依赖
  • 第三范式:不出现传递依赖

最后的关系模式为下面所示:

学生(学号,姓名,性别,年级,系别,班级,备注)
卡(卡号,学号,金额,类型,状态,注册时间、退卡时间)
用户(ID,姓名,性别,口令,权限级别)
系统(会员费率,临时费率,单位时间,至少上机时间,准备时间,最低金额)

充值(卡号、充值金额、充值时间)
上机(卡号、上机时间、下机时间、机器名)
登陆(用户ID、登陆时间、注销时间、机器名)
账单(收入、花费、退还、余额、结账时间)

实现

这里使用了PowerDesigner来实现数据库

[置顶] 数据库设计不求人(机房收费系统)_第9张图片

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

小结

其实我们在设计数据库时,如果只是按照标准的流程和规则来完成工作,那么很可能感觉无从下手,我们可以先通过自己的一些生活经验来完成初步的数据库设计。

比如说,分析机房收费系统在确定实体的时候,我们平时的生活经验就是这个系统应该要有学生、上机卡(需要注册、充值)、操作员(给我们办理上下机)、系统等实体,先初步确定之后再仔细分析。还有范式检查的时候还有更高的范式,但是我们一般在设计的时候使其满足第三范式就可以了。

以上就是数据库设计的大致流程,以机房收费系统为例子,这当中可能由于博主理解的偏差,会有不合适的地方,希望大家可以指出来,共同进步。

你可能感兴趣的:(数据库,数据,存储,设计)