谈谈我对数据库三范式的字面理解

今天看了看《数据结构系统原理》(黄靖 主编)这本书(备考自考,不然以我的品味,直接豆瓣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 的大小:传送门

综上,个人浅薄理解,若有错误请指出,核证后立即改正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章