数据库——1.数据库设计的三大范式

这篇文章我们主要来讲一下数据库设计的三大范式,这个还是很有用的。

目录

1.概述

2.第一范式

3.第二范式

4.第三范式

5.小结


1.概述

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。
在实际开发中最为常见的设计范式有三个:

  1. 第一范式(确保每列保持原子性)
  2. 第二范式(确保表中的每列都和主键相关)
  3. 第三范式(确保每列都和主键列直接相关,而不是间接相关)

下面,我们依次具体的讲解一下这三大范式。

2.第一范式

第一范式(确保每列保持原子性),是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性

拓展:原子性一般就是指不可分割性(这个原子性在数据库的其他地方还会提到的)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示:

数据库——1.数据库设计的三大范式_第1张图片

上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。

3.第二范式

第二范式(确保表中的每列都和主键相关)是指属性完全依赖于主键,要求数据库表中的每个实例或行必须可以被唯一的区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。
订单信息表:

数据库——1.数据库设计的三大范式_第2张图片

这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。
而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示:

数据库——1.数据库设计的三大范式_第3张图片

这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。

4.第三范式

 第三范式(确保每列都和主键列直接相关,而不是间接相关)是要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。

数据库——1.数据库设计的三大范式_第4张图片

这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。

5.小结

 这篇文章介绍了数据库的三大范式,下面小结一下。

第一范式,只要有原子性就行,保证表是正确的,其余的不管

第二范式,要保证属性完全依赖于主键,目的是降低数据冗余度,主要是出现在有联合主键时会用到

第三范式,一个表中不包含已在其它表中已包含的非主键信息,说白了就是拆分表,减少字段的重复,目的还是为了降低冗余

插话:一切关于数据的操作的最终目标就是降低数据的冗余,提高数据的运算效率

完全依赖:

官方解释:完全依赖即完全函数依赖,设R为任一给定关系,X、Y为其属性集,若X → Y,且对X中的任何真子集X’ ,那么X’ ↛ Y 都成立,则称Y完全函数依赖于X

大白话:当表中每一个非关键字字段都只依赖于同一个关键字,那么这个表中非关键字字段和关键字字段的关系就是“完全依赖”

你可能感兴趣的:(数据库,数据库,经验分享,学习,sql)