SQL性能优化系列——设计范式[二]

2019年7月29日09:03:35 发表评论 82
摘要

1.数据库的设计范式都有哪些?
2.数据表的键都有哪些?
3.1NF/2NF/3NF指的是什么?

范式是数据表设计的基本原则,往往会被忽略,也可能不知不觉就用上了,只是不知道有个这玩意儿而已。

数据库的设计范式都有哪些

在设计关系型数据库模型时,需要对关系内部的各个属性间练习的合理化程度进行定义,这就有了不同等级的规范要求,这些规范要求被称为范式(NF)。可以理解为表设计结构需要满足的某种设计标准的级别。

目前关系型数据库共有6种范式。按照范式级别,由低到高分别是:1NF(第一范式),2NF(第二范式),3NF(第三范式),BCNF(巴斯-科德范式),4NF(第四范式)和5NF(第五范式,又叫做完美范式)。

数据表的范式设计越高阶,冗余度就越低,同时高阶范式一定满足低阶范式的要求,即类似常说的向下兼容,比如满足2NF的一定满足1NF,依次类推。

通常设计数据表时应尽量满足3NF。但有时候为了提升查询性能,又会刻意破坏范式规则,也就是反规范化,提升冗余度,降低表之间的关联性(上一篇说过了)。

数据表中的键都有哪些

数据表中的键(Key)由一个或多个属性组成。范式的定义会用到主键和候选键(主键和候选键可以唯一标识元组)。常用键和属性如下:

超键:能唯一标识元组的属性集叫做超键。

候选键:如果超键不包括多余的属性,那么这个超键就是候选键。候选键就是最小的超键

主键:用户可以从候选键中选择一个作为主键。

外键:如果数据表R1中的某个属性集不是R1的主键,而是另一个表R2的主键,那么这个属性集就是数据表R1的外键。

主属性:包含在任一候选键中的属性称为主属性。

非主属性:与主属性相对,指不包含在任何一个候选键中的属性。

通常,我们将候选键称之为“码”,把主键也称为“主码”。因为键可能是由多个属性组成的,针对单个属性,还可以用主属性和非主属性来区分。

数据表的设计范式都有哪些

1NF指的是数据库表中的任何属性都是原子性的,不可再分。事实上,任何DBMS都会满足第一范式的要求,不会将字段拆分。

2NF指的是数据表里的非主属性都要和这个数据表的候选键有完全依赖关系。所谓完全依赖不同于部分依赖,也就是不能仅仅依赖候选键的一部分属性,而要必须依赖全部属性。以一场NBA比赛举个例子:

候选键(球员编号,比赛编号) → 非主属性(姓名,年龄,比赛时间,比赛场地,得分)

上面这个关系说明球员编号和比赛编号决定了球员姓名、年龄、比赛时间。。等数据。

但是这个数据表并不满足第二范式,因为数据表中的字段还存在如下对应关系:

(球员编号)→(姓名,年龄)

(比赛编号)→(比赛时间,比赛场地)

也就是说候选键中的某个属性决定了非主属性。这就是非主属性并非完全依赖候选键。这样可能会产生如下问题:

1.数据冗余:如果一个球员可以参加m场比赛,那么球员姓名和年龄就重复了m-1次。一场比赛也可能会有n个球员参加,那么比赛时间和比赛地点就重复了n-1次。

2.插入异常:如果要添加一场比赛,但是未确定参加比赛球员都有谁,那么就没法插入。

3.删除异常:如果要删除某个球员编号,如果没有单独保存比赛表的话,就会同时把比赛信息删掉。

4.更新异常:如果要调整某场比赛的时间,那么数据表中所有含有这场比赛的时间的记录都要进行调整,否则就会出现同一场比赛时间不同的情况。

为了避免上述情况,可以把球员比赛表设计成如下三张表:

球员表包含球员编号、姓名、年龄等属性;

比赛表包含比赛编号、比赛时间、比赛场地等属性;

球员比赛关系表包含球员编号、比赛编号、得分等属性;

这样每张表都符合第二范式,避免上述异常发生。1NF就是要字段属性是原子性的,2NF就是说每张表就是独立对象、一张表只表达一个意思。

3NF在满足2NF的同时,对任何非主属性都不传递依赖于候选键。就是说不能存在非主属性A依赖于非主属性B、B依赖于候选键的情况。举个例子:

还用球员信息表举例,字段包括:球员编号、姓名、球队名称和球队主教练。

球员编号决定了球队名称,球队名称又决定了球队主教练,这样非主属性球队主教练就会传递依赖于球员编号,因此不符合3NF的要求。其实球队名称和球队主教练两个字段用一个球队编号代替就行了。

总结

关系型数据库的设计都是基于关系模型的,在关系模型中存在4种键,这些键的核心作用就是标识。

后面提到的是范式,这些范式本身存在一些问题,可能会带来插入、更新、删除等异常情况,另一方面也可能会降低查询效率。因为范式等级越高,设计出来的表越多,多表关联查询时难免会影响到效率。

(本文完)

  • 我的微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
  • A+
所属分类:SQL

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: