数据库设计之范式

2020年10月30日 / 8次阅读 / Last Modified 2020年10月30日
SQLite

范式这个词是翻译过来的,原文是 Normalization Form。

数据库设计时,有一些共性的设计考虑,称之为范式。学习这些设计范式,可以让我们设计出结构良好的表结构(数据库里面全是Table)。比如,最基本的设计考虑之一就是,不要在不同的位置存放相同的数据,这样的设计会出现数据同步的问题。

反范式(Denormalization)是一个有趣的地方,设计良好的表结构,并不意味着执行效率就是最高的,如果对执行效率有更高的要求,我们就要考虑反范式的设计,一般都是通过临时表。

良好的数据库表结构设计,带来的好处,可能远远超过执行速度提升带来的,毕竟保证数据的可靠一直完整,应该是最重要的!

1NF

First Normal Form,是最优先要考虑的设计范式,1NF内含3个需要满足的条件:

  • 一个Table里的行与行之间,没有内在的联系,插入顺序是不可依靠的,数据库不保证插入顺序就是读出顺序,程序代码的逻辑要认为各个row之间的顺序是随机的;
  • 一个Table里,每一行都是独立的,不重复的;虽然数据库允许重复内容的行,但是实际上有一个隐藏的rowid,让每一行都不一样;
  • 一个Table里的每一个格子(存放具体数据的位置)内存放的数据,要不可再分割,比如存放一个list或array,这个时候要考虑使用one-to-many的结构,用另一张表来存放这些list或array;

1NF中,可能就第3个条件,需要好好考虑,比如存放时间,是否要把年月日单独存放!?将年月日单独存放,可以加快查询,内存消耗也会小一些。

2NF

2NF是针对一个表级约束,primary key是多column的场景。

2NF的内容是:当多个column都输入primary key的时候,其它column的内容,不能只依赖于primary key中的某一个column。

比如我们用 build_id 和 room_id 组合在一起唯一确定一个 meeting room,如果有一列address,当某个building内有很多间会议室的时候,你就会发现address的内容在重复,此时就属于违反的2NF设计范式。

3NF

3NF的内容:消除传递依赖关系。

从数据关系上分析,A依赖B,B依赖C,这就是有传递依赖的关系。在设计表结构的时候,中间的那个B,就要想一想,是否能用。用的话,可能会出现冗余数据。

1NF,2NF和3NF,都与数据不冗余,不重复出现有关!

更高阶的范式

4NF,也叫BCNF。还有5NF,6NF。一般都不怎么用得上,你设计的表格满足3NF的时候,基本上就是良好设计。

-- EOF --

本文链接:https://www.pynote.net/archives/2697

留言区

《数据库设计之范式》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    这就是数据库设计的三大范式!! [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top