专栏首页InvQ的专栏数据库中各种范式有什么区别

数据库中各种范式有什么区别

范式是在识别数据库中的数据元素,关系,以及定义所需的表和各表中的项目这些处事工作之后的一个细化的过程。常见的范式有INF,2NF,3NF,BCNF,以及4NF。

1> 1NF。第一范式是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能又重复的属性。如果出现重复的属性,就可能需要定一个新的实体,新的实体由重复的属性构成,新实体与原来的实体之间为一对多的关系。第一范式的模式要求属性值不可再分裂成更小部分,即属性项不能是属性组合或由组属性组成。简而言之,第一范式就是无重复的列,例如,由“职工号” “姓名” “电话号码”组成的表(一个人可能有一部办公电话和一部移动电话),这时将其规范化为1NF可以将电话号码分为"办公电话"和移动电话两个属性,即职工(职工号,姓名,办公电话,移动电话)。

2>2NF。第二范式,是在第一范式的基础上建立起来的。,即满足第二范式必须先满足第一范式。第二范式要求数据库表中的每个实例或行必须可以唯一的区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。如果关系模式R为第一范式,并且R中的每一个非主属性完全函数依赖于R的某个候选键。则称R为第二范式(如果A是关系模式R的候选键的一个属性,则称A是R的主属性),例如,在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但由于非主属性学分依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分)新关系通过学生表中的外键课程号联系,在需要时连接。也就是在第一范式的基础上消除部分依赖。

3>3NF。第三范式,如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。

以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,所以该表有两个候选码(学号,课程号)和(姓名,课程号),故存在函数依赖:学号——>姓名,(学号,课程号)——>成绩,(姓名,课程号)——>成绩,唯一的非主属性成绩对主码不存在部分依赖,也不存在传递依赖,所以属于第三范式。

就是在第二范式的基础上消除传递依赖。

4>BCNF。它构建在第三范式的基础上,如果关系模式是第一范式,且每个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。假设仓库管理关系表(仓库号,存储物品号,管理员号,数量),满足一个管理员只在一个仓库工作;一个仓库可以存储多种物品,则存在如下关系:

(仓库号,存储物品号)——>(管理员号,数量)

(仓库员号,存储物品号)——>(仓库号,数量)

所以,(仓库号,存储物品号)和(仓库员号,存储物品号)都是仓库管理关系表的候选码,表中的唯一非主键字段为数量, 它是符合第三范式的。但是,由于存在如下决定关系:

(仓库号)———>(管理员号)

(管理员号)——>(仓库号)

即存在关键字段决定关键字段的情况,因此不符合 BCNF。把仓库管理关系表分解为两个关系表:仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),这样的数据库表是符合BCNF的,并消除了删除异常,插入异常和更新异常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《sql必知必会》——读书笔记(1)

    设值主键是为了确定唯一性,当一个字段无法确定唯一性的时候,就需要采用联合主键的方式。(多个字段来定义一个主键)

    MickyInvQ
  • git 突然不出 绿色,红色的图标了

    打开后找到“HKEY_LOCAL_MACHINE–>SOFTWARE–>Microsoft–>Windows–>CurrentVersion–>Explor...

    MickyInvQ
  • 写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分 隔。

    MickyInvQ
  • python并发编程之多进程(实现)

    一、multipricessing模块的介绍      python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需...

    人生不如戏
  • SVN版本控制拾遗

    SVN版本控制拾遗 (原创内容,转载请注明来源,谢谢) 一、概念 仓库(repository)是代码总的存放的地方,工作副本(working copy)的每个开...

    用户1327360
  • 安卓第二夜 有趣的架构

    学习安卓的架构,是从操作系统的角度理解安卓。安卓使用Linux内核,但安卓的架构又与常见的Linux系统有很大的区别。我们先来回顾一下传统的Linux架构,再来...

    Vamei
  • WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。

    服务器上已经有了MYSQL5.X,但因为需要还需要再安装一个MYSQL8,查了一下大概的意思就是 只要服务名和端口别重复就可以同时共存。

    睿儿网络郝刚
  • NDK--双进程守护之利用线程轮询实现APP保活

    1.提高优先级 这个办法对普通应用而言, 应该只是降低了应用被杀死的概率,但是如果真的被系统回收了,还是无法让应用自动重新启动!

    aruba
  • 数组的三种声明方式总结、多维数组的遍历、Arrays类的常用方法总结

    泰斗贤若如
  • JavaScript 工厂函数 vs 构造函数

    当谈到JavaScript语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数。

    前端小智@大迁世界

扫码关注云+社区

领取腾讯云代金券