目录
1.2 认识数据库范式
1.2.1 什么是数据库范式
1.2.2 第一范式1NF
1.2.3 第二范式2NF
1.2.4 第三范式3NF
1.2 认识数据库范式
作为一名Oracle从业人员,经常需要面对设计数据库的任务,比如作为一名DBA,哟偶可能需要为企业的数据库应用程序设计高效和优雅的数据库,避免数据库的冗余难以维护,要设计精良的数据库,必须遵循一定的规则,而理解数据库方式是进行高效数据库设计的基础。
1.2.1 什么是数据库范式
为了规范化关系型数据库模型,要求数据库系统在设计时必须遵循一定的规则,这种规则就称为关系型数据库系统范式。使用范式的主要目的是为了减低数据的冗余,设计结构合理的数据库。目前关系型数据库中公有6个范式,一般来说数据库只需要满足前面3个范式即可,这3中范式如下所示。
■ 第一范式(1NF):字段必须具有单一属性特性,不可再拆分,比如员工名称字段,必须具有单一的属性,不可以在一个字段中包含员工中文名或英文名,必须考虑拆分为两个字段。
■ 第二范式(2NF):表要具有唯一性的主键列。也就是说表中的每一行哟啊具有一个唯一性的标识列,比如通常使用GUID或自动增长的数字编码来唯一地标识一行,或者是使用身份证号码来唯一地标识员工表中的员工。
■ 第三范式(3NF):表中的字段不能包含在其他表中已出现的非住建字段,比如员工表中已经包含了部门的名称,而部门表中部门编号为主键,部门名称为非主键,那么这就不符合第三范式,通过将员工表中的部门名称更改为部门编号,则可以符合第三范式。
范式是一个逐步升级的过程,也就是说只有在满足了第一范式的情况下,第二范式才能继续进行,范式的实现过程如图1.8所示。
通过对数据库对象应用范式,消除了数据冗余,使得整个数据库的设计具有最佳效率和性能,它会带来如下一些好处:
■ 使数据变得更有组织。
■ 将数据的修改量变得更少,比如当一个表的具体字段记录更新时,其他医用到该表中字段的表会自动得到更新。
■ 需要存储数据的物理空间变得更少。
下面的几个小姐将分别对每一个范式的具体实现过程进行示例介绍。
1.2.2 第一范式1NF
第一范式是设计关系型数据库时应该满足的一个基本范式,可以说如果一个数据库不满足第一范式,将就不是一个关系型数据库。
第一范式要求表中每一个字段都具有唯一的属性,不可以再继续被拆分,举个例子,在设计认人事资料数据库事,其基本结构如表1.1所示。
表1.1 人事信息表
工号 姓名 地址 电话 B0001 张子木 广东省深圳市红岭东路121号 13899168 B0002 李子木 广东省广州市人民西路20号 13799168
这个表中的每一个字段都是具有唯一的属性,可以满足人事信息管理的基本需求,因此如果人事信息管理相对简单,也可以说这个表是符合1NF范式的。
如果人事信息的电话号码出现了两个,或者一个人具有一个公司地址和家庭地址,那么这个设计就不再符合第一范式了,。在比如如果地址字段要拆分为按省、城市和街道地址来进行细分,那么地址就不在唯一属性,需要继续进行拆分,因此也不符合第一范式。
对于重复的字段,可以创建单独的实体来解决,比如重复的电话和地址,可以分别创建一个电话实体和一个笛之爱实体来解决。对于可再拆分的字段,可以通过多个字段来进行表示,例如如果要对地址进行再拆分,结果就可以变成如表1.2所示的人事信息表。
工号 | 姓名 | 省份 | 城市 | 街道 | 电话 |
B0001 | 张子木 | 广东省 | 深圳市 | 红岭东路121号 | 13899168 |
B0002 | 李子木 | 广东省 | 广州市 | 人民西路20号 | 13799168 |
经过拆分后,现在可以说人事信息表基本符合数据库的第一范式,由于范式是一个升级的过程,而第一范式又是一个基本的条件,因此接下来就可以继续进行设计,以便满足第二范式。
1.2.3 第二范式2NF
第二范式是在第一范式的基础之前简历起来的,也就是说,必须首先满足第一范式,才能满足第二范式。第二范式要求每一个数据实体或数据行必须具有一个唯一的识别符,以便可以被唯一地区分。
第二范式要求在行中必须要存储一个用来唯一地标识一行的列,在人事信息表中,使用工号作为唯一性的列。由于工号具有唯一性,可以用来唯一地区分一行,因此通常将工号作为整个表的主键或主码。当确定了主键后,所有其他的字段将完全依赖于主键存在。
主键通常使用PK(Primary Key)进行表示,例如图1.9演示了为员工表和部门表两个实体分别使用工号和部门编号来唯一地区分某行。(由于我这里没有ER画图工具,就用Excel列出来)
在将工号和部门编号作为主键后,表中的其他字段必须具有对主键的依赖关系,如果不是直接依赖,必须考虑另外建立一个新的实体,使其符合第二范式。
1.2.4 第三范式3NF
第三范式是在第二范式的基础上的升级,也就是说为了满足第三范式,必须先满足第二范式。第三范式要求在表中不能包含已经在其他表汇总包含的主键字段信息。
下面是员工表和部门表两个表,其中员工表中包含了在部门表中已经包含的非主键字段信息,如图1.10所示。
第三范式用来消除冗余的数据,可以避免很多数据操作的存储异常,因此在图中,部门名称和部门经理是已经在部门表1中存在的非主键字段,如果在员工表1中在此包含这两个字段,就导致了数据的冗余,并且会导致存储的异常。当用户对部门表汇总的部门名称和部门经理进行了修改之后,如果不对运功表中相关的字段进行修改,则会导致数据的不一致的出现。