数据库设计及三大范式

一、数据库设计的步骤

(1)了解功能需求
在设计数据库之前,设计人员必须要先了解系统的功能需求。这里可以通过阅读产品需求规格说明书,与项目相关人员(比如项目经理、客户等)进行充分沟通。

(2)抽取并标识实体

设计人员分析系统需求规格说明书,从中抽取数据需求对象,并将它们标识为实体。

实体是对现实世界中描述事物数据对象的抽象概念。实体可以是人、物品、机构等等,凡是包含数据特征的对象均可被定义为实体。

在E-R模型图中,实体通常用两层矩形方框方式,并在顶层方框内注明实体的名称。

  针对一个图书销售管理系统数据需求,我们可以抽取出“图书”“商店”“销售”“折扣”“作者”“出版社”实体,并将它们在E-R模型图中标识出来,如图4-17所示。

 

(3)定义实体的属性。

每个实体都有自己的一组数据特征,这些描述实体的数据特征称为实体的属性。

在E-R模型实体符号的两栏矩形框中,上栏区域显示实体名称,下栏区域显示实体属性。

在实体中能够唯一标识不同实体实例的属性或属性集称为标识符。

“客户编号”属性值可以唯一标识不同客户实例,它可以作为客户实体的标识符。如果实体中找不到任何单个属性可以做标识符,就必须选取多个属性的组合作为标识符,此时该标识符被称为复合标识符。例如,“订单明细”实体需要使用“订单编号”和“商品编号”属性作为复合标识符。

在图形表示上,作为标识符的属性需加上下画线。如果是复合标识符,则构成该复合标识符的所有属性都需加上下画线,如图4-5所示。

 

客人:姓名、性别、手机号码、证件号码、证件类型(身份证、驾驶证、通行证等等)…
房间:房号、房间类型(单人房、双人房、豪华房等等)、入住时间、离开时间、房间状态(已入住、未入住)…

(4)实体间的联系

可以使用联系(Relationship)表示一个或多个实体之间的关联关系。现实世界的事物总是存在着这样或那样的联系,这种联系必然要在信息世界中得到反映。联系是实体之间的一种行为,一般用动词来命名关系,如“管理”“查看”“订购”等。

E-R模型图中,实体之间的联系有1:1,1:N,M:N。

  按照实体之间的语义关系,可以将实体分为弱实体和强实体。在现实世界中,某些实体对另一些实体有逻辑上的依赖联系,即一个实体的存在必须以另一个实体的存在为前提,前者就被称为弱实体,而被依赖的实体被称为强实体。例如,“销售”实体必须依赖于“图书”、“商店”实体而存在。 

1:1实体联系的实体分别转换为关系表,我们可将其中一个表的主键放入另一个表中作为外键。

 在1:N实体联系中,如果存在标识符依赖弱实体,在从E-R模型转换关系模型时,我们需要将1端关系表的主键放入N端关系表中,作为外键。

  对 M:N实体联系,关联的两个实体的实例在另一个实体中都有多个实体实例与之相对应。当将E-R模型转换到关系模型时,除了关联的实体均转换为对应的关系表外,我们还增加一个关系表,作为关联表与实体的关系表建立参照约束。

 

 (5)绘制E-R图

定义好实体之后,接下来我们应该根据实体以及实体之间的关系绘制出E-R图。比如:
在这里插入图片描述
长方形代表实体,椭圆形代表实体的属性,菱形代表实体之间的关系。

(6)把E-R图转换成模型
绘制出E-R图之后,我们需要根据它来构建物理模型。构建物理模型可以使用一些工具,比如目前比较流行的PowerDesigner。
在这里插入图片描述
(7)检查模型

数据库三大范式:1、每列不可分割,2、有主键,非主键列依赖主键,3、非主键列不能依赖其他非主键列。
完成模型设计后,我们还要检查模型是否满足第三范式的要求。如果不满足就需要重新对模型进行修正,直到满足第三范式的要求为止。

比如说,上面的模型并没有满足第三范式的要求。因为customer和room这两个表都存在一些与该表没有直接关系的字段。如果要满足第三范式要求,就需要把模型修改为:
在这里插入图片描述
上面模型增加了三个表,分别是identity_type(证件类型表)、register(入住登记表)、room_type(房间类型表),经过对模型的修正后,已经满足第三范式的要求。

(8)根据模型定义数据库

#创建数据库
create database 数据库名;

#删除数据库
drop database 数据库名;

#查询数据库
show databases;

#选定数据库
use 数据库名;

#创建表
create table 表名 (
	列名 数据类型 [primary key] [auto_increment],
	列名 数据类型 [not null] [unique] [default '默认值'] [comment '字段说明'],
	列名 数据类型 [not null] [unique] [default '默认值'] [comment '字段说明'],
	...
	[constraint 外键名 foreign key(外键列) references 表名(主键列) [on update|delete cascade]]
);

#删除表
drop table 表名;

至此,数据库设计阶段的任务已经完成。

二、总结

数据库设计其实并不难,本人觉得比较难的地方在于开始的分析阶段。就是如何根据客户需求把数据库里面的实体,以及实体之间的关系分析出来。所以,在数据库设计阶段,我们应该把重点放在业务需求的分析上,准确把握客户的需求,这样才能够设计出一套比较好的数据库。

posted @ 2020-04-02 14:18  最萌小胡胡  阅读(267)  评论(0编辑  收藏  举报