[数据库] 数据库设计五种范式理解

第一范式

书上:消除重复数据组和保证原子性(数据是自包含和独立的)

理解
比如说在一个创建了主键的表中,有数据的主键是重复的,就将重复的数据组移动到新的表中,为这些数据创建新的主键。
另外,数据表中每列的数据是独立的(原子性)。
比如说:

姓名 身高/体重
小明 170/60
小红 175/60

则第一列具有原子性,第二列不具有原子性。

例子:
表1:
表1
表1的主键没有重复,但第三列货物不具有原子性。我们把它拆开。

表2:
请添加图片描述
表二虽然每列都具有原子性,但是主键不唯一了。可以通过在表中添加行项号,然后通过组合键来解决。如表三所示。

表3:
请添加图片描述

第二范式

书上:第二范式进一步减少重复数据的出现。第二范式有两个规则:第一,表必须符合第一范式的规则。第二,每列必须依赖整个键。

在实际中,一个实体还需要分割成两个表,这样就有两个实体。表头是两个有关系的表中父表的一部分。表头的信息只需要存储一次,而细节表存储可能有多个实例信息。表头通常保持原表的名称,细节表通常以表头名称开头,添加一些细节表的信息。

理解
如下表
表4:
请添加图片描述
订单时间和公司名称只和订单ID有关,而与行项号无关。所以可以分割成2个表(表5、表6)。让表中的每列都依赖于整个键。
表5:
请添加图片描述
表6:
请添加图片描述

第三范式

书上:第三范式使得表中所有的列不仅仅依赖于某个事物,而是依赖于正确的事物。
有以下三个规则:
表必须符合2NF。
任何列都不能依赖于非键列。
不可以有派生的数据。

理解
看下表7:
请添加图片描述
可以看出描述只跟型号有关,而与键无关。(描述依赖于型号而不是键)。所以我们可以把表7分为表8和表9。(单价可能每单不一样,所以单价不在此讨论中。)
表8:
请添加图片描述
表9:
请添加图片描述
此处有个总价的列。总价可以根据单价和数量计算出(即为派生数据。)。这在规范中使不允许的,删除该列即可,在需要时进行计算,避免占用多的空间。

第四范式

书上:解决多值依赖问题。符合第三范式且主键中的一列可能分别依赖于主键中的其他列。这种情况非常罕见,通常不会引起实际的问题。因此在数据库领域基本被忽略。

第五范式

书上:处理无损和有损分解。虽然可以分解一个关系,但不能从逻辑上重新构成到原来的形式。这也是非常罕见的,很大程度是学术问题,这里不再讨论。

另一处的范式表述,与上文略有不同。(同学整理)
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
第二范式:所有非主键字段完全依赖主键,不能产生部分依赖。
第三范式:所有非主键字段直接依赖主键,不能产生传递依赖。
BC范式:3NF基础上,主键字段内部不能有部分或传递依赖。
第四范式:BCNF基础上,非主键字段不应该有多值。
第五范式:4NF基础上,消除依赖的多值随着规范化的进行,数据冗余越来越少,但数据库的效率也越来越低。
数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终用目的要满足客户需求。

猜你喜欢

转载自blog.csdn.net/anjue1997/article/details/119108759