侧边栏壁纸
博主头像
Wyatt博主等级

Done is better than perfect!

  • 累计撰写 103 篇文章
  • 累计创建 31 个标签
  • 累计收到 7 条评论

数据库规范-Normalization(0NF->3NF)

Wyatt
2020-12-30 / 0 评论 / 0 点赞 / 310 阅读 / 2,046 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-12-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一. 简介

数据库规范化是一种组织数据库中数据的技术。规范化是一种正式的方法,它应用一组规则来将属性与实体相关联。设计数据库时使用规范化。
数据库规范化主要用于:

  • 消除冗余数据
  • 确保逻辑存储数据(最终结果是更灵活的数据模型)

二. 流程

数据模型的规范化包含几个步骤。这些步骤称为规范化规则。每个规则都称为正常形式(1NF,2NF,3NF)。这三种形式是最重要的形式。普通形式有3种以上,例如BCNF,4NF,5NF等,但是这些形式很少使用,可以忽略。每种规范形式比以前的规范形式对数据的约束更大。

这意味着设计者必须首先获得第一范式(1NF)才能获得第二范式(2NF)。设计者必须先获得第二范式(2NF),然后才能获得第三范式(3NF)。
例如下图:

3nf流程.png

三. 0NF

下表中的数据未规范化,因为它包含重复的属性(student_1,student_2,...)。
teacher表

四. 1NF:去除重复组

在第一种范式中,实体不包含重复的组,并且所有属性都必须具有唯一的名称。
实体只能包含两个维度。一个老师有多个学生(student_1,student_2,...)。
我们需要因此创建一个新实体的。包含名称如student_1,student_2等属性的数据模型是错误的数据库设计。重复属性会使数据的灵活性降低,并使搜索数据变得困难。

1NF-student表

1NF-teacher表

五. 2NF:消除冗余数据

如果实体已达到1NF且其所有属性都依赖于完整(主)键,则该实体为第二范式。具有仅包含一个属性的主键的实体为第二范式(2NF)。

在我们的示例中,键是teacher_id + student_id。我们为老师和学生之间的关系创建一个新的实体teacher_student_relationship。
针对以上的many-many关系,设计调整后的表结构图如下:

2NF-teacher
2NF-student
2NF-teacher_student_relationship

六. 3NF:消除传递依赖性

如果实体为第二范式且其所有属性都不可传递地依赖于完整的主键,则该实体为第三范式(3NF)。当非素数属性依赖于其他非素数属性而不是素数属性或主键时,就存在传递依赖。换句话说:第三种范式表示实体中的任何属性都不依赖于非主属性,后者又依赖于主键。

在如下图中,属性office_address是可传递的,取决于属性office的具体设置。我们必须创建一个新的实体office,以便我们可以从客户实体中删除属性office_address。现在,老师实体处于第三范式(3NF)。

6.1 变更前

2NF

6.2 变更后

3NF-teacher

3NF-office

七. 标准化结果

这是数据库规范化(3NF)之后的数据模型,数据库ER图(物理模型)
ER图

八. 结论

日常工作中,3NF是一项基本的数据库设计原则。很多时间大家都知道去怎么做,但是却没有进行一些具体的归纳总结。没有系统性学习DBMS的同学也可以完成很好的数据库设计,但是在理论和流程方面的系统性知识框架还是极度缺少的,尤其是我这样的野路子开发者。
所以,**“七分设计,三分开发”**的确是一种很不错的方法论,方便大家能够系统提升自我,对工作内容的认知程度提高。

0

评论区