今天看了看《数据结构系统原理》(黄靖 主编)这本书(备考自考,不然以我的品味,直接豆瓣9.0以上,哈哈哈)
首先看下书上给出的定义:
- 第一范式(1NF):设 R 为任一给定关系,若 R 中的每个列与行的交点处的取值都是不可再分的基本元素,则 R 为第一范式
- 第二范式(2NF):设 R 为任一给定关系,若 R 为 1NF,且其所有非主属性都完全函数依赖于候选关键字,则 R 为第二范式
- 第三范式(3NF):设 R 为任一给定关系,若 R 为 2NF,且每一个非主属性都不传递函数依赖关系于候选关键字,则 R 为第三范式
个人理解:
- 第一范式(1NF):确保一张表的所有column(或字段)都是不可再分的,这一点我认同书上的说法,比较好理解(针对字段)
- 第二范式(2NF):首先一张表至少定义一个主键或联合主键,其次确保非主键的字段只能根据主键(如果是联合主键,也只能是联合主键,不能是联合主键的子集)查询的到(针对主键)
-
第三范式(3NF):确保每一个非主键,不能具有主键的特性(主键的特性:能够根据它查询到唯一一条数据)(针对表)举个反例:学生表有学号(主键),姓名,年龄, 系号,系名,系主任首先存在传递依赖关系:学号->学生->系号->系名->系主任根据我的定义,该表存在非主键<系号>拥有主键特性,因为可以根据系号查询唯一的<系名>和<系主任>所以应当将<系名>和<系主任>移至系表,学生表可保留<系号>来索引系表
- 第三范式(3NF):第一次应该理解错了。应该是非主键关键字,都必须直接依赖主键,不能通过传递依赖的方式依赖主键。
关于什么叫候选关键字,可以参考我的另一篇博客:传送门
函数依赖:学生的姓名可以由学号决定,即姓名依赖学号。就像 y = f(x), 可以看出 y 的取值大小依赖于 x 的大小:传送门
综上,个人浅薄理解,若有错误请指出,核证后立即改正