数据规范化设计
- 在实际的项目开发中,如果系统的数据存储量较大,设计的表比较多表和表之间的关系比较复杂,首先就需要进行规范化的数据库设计,然后进行具体的创建数据库、创建表的工作。无论是创建动态网站,还是创建桌面窗口应用程序,数据库设计的重要性都不言而喻。如果设计不当,会存在数据存在异常、修改复杂、数据冗余等问题,程序性能也会受到影响。通过规范化的数据库设计,可以消除不必要的数据冗余,获得合理的数据库结构,提高项目的应用性能。
规范数据库设计的重要性
- 什么是数据库设计
- 数据库设计就是将应用中涉及的数据实体及这些数据实体之间的关系,进行规划和结构化的过程。
- 数据库设计非常重要
- 数据库中创建的数据结构的种类,以及在数据实体之间建立的关系是决定数据库系统效率的重要因素。糟糕的数据库设计表现在以下两个方面
- 效率低下。
- 更新和检索数据时会出现许多问题。
- 良好的数据库设计表现在以下三个方面。
- 效率高。
- 便于进一步扩展
- 使应用程序的开发变得容易。
- 数据库中创建的数据结构的种类,以及在数据实体之间建立的关系是决定数据库系统效率的重要因素。糟糕的数据库设计表现在以下两个方面
数据库设计的步骤
-
项目开发需要经过需求分析、概要设计、详细设计、代码编写、运行测试和部署上线几个阶段
- 需求分析阶段:分析客户的业务和数据处理需求。
- 概要设计阶段:绘制数据库的E-R图,用于在项目团队内部、设计人员和客户之间进行沟通,确认需求信息的正确性和完整性。
- 详细设计阶段:将E-R图转换为多张表,进行逻辑设计,确认各表的主外键,并应用数据库设计的三大范式进行审核。经项目组开会讨论确定后,还需根据项目的技术实现、团队开发能力及项目的成本预算,选择具体的数据库(如MySQL或Oracle等)进行物理实现。
以上步骤完成后,开始进入代码编写阶段开发应用程序。
现在讨论在需求分析阶段对后台数据库的分析。
- 需求分析阶段的重点使调查、收集并分析客户业务的数据需求、处理需求、安全性与完整性需求。常用的需求分析方法包括调查客户的公司组织情况、各部门的业务需求情况、协助客户分析系统的各种业务需求和确定新系统的边界。无论数据库的大小和复杂程度如何,在进行数据库的系统分析时,都可以参考下列基本步骤。
- 收集信息。
- 标识实体。
- 标识每个实体需要存储的详细信息。
- 标识实体之间的关系
-
收集信息。
- 创建数据库之前,必须充分理解数据库需要完成的任务和功能。简单地说,就是需要了解数据库需要存储那些信息(数据)、实现那些功能。
-
认识实体
- 在收集需求后,必须标识数据库要管理的关键对象或实体。前面曾经学习过对象的概念,实体可以是有形的事物,如人或产品;也可以是无形的事物,如商业交易、公司部门或发薪周期。在系统中标识这些实体以后,与它们相关的实体就会条例清楚。
注意:实体一般是名词,一个实体只描述一件事情,不能重复出现含义相同的实体。
数据库中的每个不同的实体都拥有一个与其对应的表。
-
标识每个实体需要存储的详细信息
- 将数据库中的主要实体标识为表的候选实体以后,就要标识每个实体存储的详细信息,也称为该实体的属性,这些属性将组成表中的列。简单地说,就是需要细分出每个实体中包含的子成员信息。
注意:在进行实体属性分解时,含义相同的成员信息不能重复出现,如联系方式、电话等。每个实体对应一张表,实体中的每个子成员对应表中的一列。
-
标识实体之间的关系
- 关系型数据库有一项非常强大的功能,即它能够关联数据库中各个项目的相关信息。不同类型的信息可以单独存储,但是如果需要,数据库引擎还可以根据需要将数据组合起来。在设计过程中,要标识实体之间的关系,首先需要分析数据库表,确定这些表在逻辑上是如何相关的,然后添加关系列建立起表之间的连接。
绘制E-R图
- 和机械行业需要机械制图、建筑行业需要施工图一样,数据库设计也需要图形化的表达方式—E-R(Entity-Relationship)图,也称为实体—关系图。它包括一些具有特定含义的图形符号,下面将介绍相关理论和具体的图形符号。
-
实体—关系模型
-
实体
- 所谓实体就是指现实世界中具有区分其他事物的特征或属性并于其他事物有联系的事物。
- 实体一般是名词,对应表中的一行数据。严格地说,实体指表中一行特定数据,但在开发时,我们也常常把这个表称为一个实体。
-
属性
- 属性可以理解为实体的特征。属性对应表中的列。
-
联系
- 联系是指两个或多个实体之间的关联关系
- 实体用矩形表示,一般是名词;属性用椭圆形表示,一般也是名词;联系用菱形表示,一般是动词。
-
映射基数
- 映射基数表示通过联系与该实体关联的其他实体个数。对于实体集X和Y之间的二元关系,映射基数必须为下列基数之一
- 一对一。X中的一个实体最多与Y中的一个实体关联,并且Y中的一个实体最多与X中的一个实体关联。
- 一对多。X中的一个实体可以与Y中的任意数量的实体关联,Y中的一个实体最多与X中的一个实体关联。
- 多对一。X中的一个实体最多与Y中的一个实体关联,Y中的一个实体可以与X中的任意数量的实体关联。
- 多对多。X中的一个实体可以与Y中的任意数量的实体关联,反之亦然。
- 映射基数表示通过联系与该实体关联的其他实体个数。对于实体集X和Y之间的二元关系,映射基数必须为下列基数之一
-
实体关系图
- E-R图以图形的方式将数据库的整个逻辑结构表示出来,E-R图由以下几部分组成。
- 矩形表示实体集。
- 椭圆形表示属性。
- 菱形表示联系集。
- 直线用来连接属性和实体集,也用来连接实体集和联系集。
直线是可以有方向的(在末端有一个箭头),用来表示联系集的映射基数。箭头的定位很简单,可以将其视为指向引用的实体。
- E-R图以图形的方式将数据库的整个逻辑结构表示出来,E-R图由以下几部分组成。
-
-
关系数据库模式
-
用二维表的形式表示实体和实体间联系的数据模型称为关系模型。关系数据库模式是对关系数据库结构的描述,或者说是对关系数据库框架的描述。一个关系通常对应一张表。一般情况下,把关系模式表示为如下形式。
- R(U)或者R(A,B)
其中,R表示关系名,U表示属性集合,A、B代表U中的属性
将E-R图转换为关系模式的步骤如下:
- 把每个实体都转化为R(A,B)形式。
- 建立实体间联系的转换。
- 实体间的联系分为一对一、一对多、多对多三种,当两个实体各自转化为关系模式后,实体间来联系的转换如下
- 一对一的转换:把任意实体的主键放到另一个实体的关系模式中。
- 一对多的转换:把联系数量为一的实体的主键放到来联系数量为N的实体关系模式中。
- 多对多的转换:把两个实体的主键和联系的属性放到另一个关系模式中,注意多生成一个关系模式。
- 实体间的联系分为一对一、一对多、多对多三种,当两个实体各自转化为关系模式后,实体间来联系的转换如下
-
设计规范化
-
从用户角度而言,将所有信息放在一个表中很方便,因为这样查询数据可能比较容易,但是容易出现以下几个问题
- 信息重复。
- 更新异常
- 插入异常。
- 删除异常。
-
在进行数据库设计时,有一些专门的规则,称为数据库的设计范式。遵守这些规则,将创建设计良好的数据库。下面将逐一讲解数据库设计中著名的三大范式理论
- 第一范式:第一范式(Normal Form,1NF)的目标是确保每列的原子性。如果每列(或者每个属性值)都是不可再分割的最小数据单元(也称为最小原子单元),则满足第一范式。
- 第二范式:第二范式(2NF)再第一范式的基础上更进一层,其目标是确保表中的每列都和主键相关。如果一个关系满足第一范式,并且除了主键外的其他列都全部依赖于该主键,则满足第二范式。
- 第三范式:第三范式(3NF)再第二范式的基础上更进一层,第三范式的目标时确保每列都和主键列值直接相关,而不是间接相关。如果一个关系满足第二范式,并且除了主键意外的其他列都只能依赖于主键,列和列之间不存在相互依赖关系,则满足第三范式。
主键与外键在多表中的重复出现不属于数据冗余,非键字段的重复出现才是数据冗余
- 规范化和性能的关系:在设计数据库时,设计人员和客户对数据库的设计规范化和性能之间存在一定的矛盾。在实际的数据库设计中,既要考虑三大范式,避免数据的冗余和各种数据操作异常;又要考虑数据访问性能。有时,为了减少表间的连接,提高数据库的访问性能,允许适当的数据冗余列,这可能是最适合的数据库设计方案。应该反对低级冗余,高级的冗余目的是提高数据的处理速度是一种以空间换取时间的做法。