第三范式
第三范式是在第二范式的基础上,确保数据表中的每一个非主键字段都和主键字段直接相关,也就是说: 要求数据表中的所有非主键字段不能直接依赖于其他的非主键字段
-
也就是不能出现非主属性A依赖于非主属性B,然后非主属性B又依赖于主键字段的情况
-
只要非主属性之间有依赖关系,那么就不满足3NF,而上面的情况中明显非主属性A依赖于了非主属性B
-
为什么上面的这个问题中是非主属性A依赖于非主属性B,然后非主属性B又依赖于主键?
-
不能是仅仅是非主属性A依赖于主属性B吗?
-
当然是不可以的,如果仅仅是非主属性A依赖于非主属性B,那么这个时候连第二范式都无法满足,因为我们的第二范式要求我们的数据表中的所有非主键字段都要完全依赖于主键,所以我们的数据表中的非主键字段就只剩下了两种情况:
- 非主键字段直接完全依赖于主键字段
- 比如非主属性A直接完全依赖于主键字段C
- 非主键字段间接的完全依赖于主键字段
- 比如非主属性A直接完全依赖于非主属性B,然后非主属性B又完全依赖于主键字段C
- 加上我们的第三范式是在第二范式的基础上的迭代,满足我们的第三范式的前提就是满足第二范式,所以这里如果是有非主属性之间的依赖,那么最终也是要走向依赖于一个主属性的趋势的
- 非主键字段直接完全依赖于主键字段
-
-
-
通俗的讲: 3NF就是要求所有的非主属性之间不能有依赖关系,那么也就是所有的非主属性之间都要是相互独立的
下面我们通过几个例子来理解第三范式:
eg1:
员工信息表: 员工编号,姓名, 部门编号,部门名称,部门简介
-
这个时候这个员工信息表就是不满足3NF的
- 那么为什么这里的员工信息表就是不满足3NF了,这里我们来进行分析:
- 首先我们要分析这里的员工信息表是否符合1NF(第一范式)和2NF(第二范式)?
- 这里对于字段的原子性显然是满足的(每个列表达的意思都没有歧义,都是唯一的)—> 也就是满足了1NF
- 然后我们就要判断这类的员工信息表是否符合2NF,那么我们先要搞清楚主键是谁: 在员工信息表中主键显然就是员工编号,那么我们就可以发现,其余的四个非主属性都是完全依赖于员工编号的,所以显然我们的员工信息表也是符合2NF的
- 然后我们再来分析员工信息表是否符合3NF?
- 这类我们可以明显的发现员工信息表中的部门名称和部门简介直接依赖于了非主键字段部门编号,而部门编号又直接依赖于主键字段员工编号了 —> 这里显然就是非主键字段直接存在依赖关系,那么显然这样就是符合3NF的
- 首先我们要分析这里的员工信息表是否符合1NF(第一范式)和2NF(第二范式)?
- 那么为什么这里的员工信息表就是不满足3NF了,这里我们来进行分析:
-
那么如何就让这张表符合3NF了?我们要做何种修改?
-
我们只需要将员工信息表中没有直接依赖于主键字段的所有非主键字段都单独拿出去,这个时候重新指定一张表,但是这个时候如果我们只是将所有没有直接依赖主键字段的非主键字段单独拿出去指定成一张表那么显然是不可以的,我们这个新表中就没有主属性了,这个时候我们就要将员工表中这些非主键字段直接依赖的非主键字段复制一份(注意: 这里是复制了一份,而不是直接拿了出去),然后也放入到新表之中作为新表的主键字段 —> 那么有没有想过为什么要将被其他非主键字段依赖的非主键字段复制一份? — 因为这个时候原本我们是一张表,这个时候我们要拆分成两张表,那么这两张表肯定还是要有联系的,这个时候这两张表之间的联系我们就要用这个被依赖的非主键字段来刻画
-
具体设计如下:
员工信息表: 员工编号,姓名,部门编号部门信息表: 部门编号,部门名称,部门简介
- 这里我们就是将部门名称和部门简介直接拿了出来,而对于部门编号我们是复制了一份(我们可以发现在员工信息表中也保留了部门编号)
- 这样的设计就是符合3NF的
-
-
eg2:
商品信息表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UCYCcS5N-1649261544819)(E:\非凡英才\数据库笔记\不满足3NF的数据表设计举例.png)]
- 显然这里的商品信息表就是不满足3NF的,因为上面的商品类别名称直接依赖于了商品类别编号,而没有直接依赖于我们的主键字段(商品编号)
那么我们要作何修改就可以让这两个表符合3NF?
-
我们只需要将商品类别编号和商品类别名称拿出去到一个新的商品类别信息表中(注意: 这里的商品类别名称是直接拿出去到一个新表中,但是这个商品类别编号是复制了一份拿出去的,是保留了一份在商品信息表中的 —> 我们要依赖于这个商品类别编号来为两张表建立连接)
-
具体设计如下:
商品信息表: 商品编号,商品名称,商品价格商品类别信息表: 商品类别编号,商品类别名称
-