博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库设计的三大范式
阅读量:5105 次
发布时间:2019-06-13

本文共 1740 字,大约阅读时间需要 5 分钟。

什么是范式:为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)

一般在项目中,前三种方式就满足我们的需求了

第一范式:

  简单的说,数据表中的每一列(每个字段)必须是不可拆分的最小单元。每一个属性都是原子项,不可分割。

  第一范式是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。关系数据库设计研究的关系规范化是在1NF之上进行的。

  例如(学生信息表):

  学生编号   姓名   性别       联系方式
  20080901    张三     男   email:zs@126.com,phone:88886666
  20080902    李四     女   email:ls@126.com,phone:66668888

以上的表就不符合,第一范式:联系方式字段可以再分,所以变更为正确的是:

  学生编号   姓名   性别     联系方式     电话

  20080901    张三     男   email:zs@126.com  88886666
  20080902    李四     女   email:ls@126.com  66668888

第二范式(2NF)

简单的说,第二范式要满足以下的条件:首先要满足第一范式,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情

  例如(学生选课表):

  学生   课程     教师     教师职称       教材       教室   上课时间
  李四   Spring   张老师   java讲师   《Spring深入浅出》   301   08:00
  张三   Struts    杨老师   java讲师   《Struts in Action》   302   13:30

这里通过(学生,课程)可以确定教师、教师职称,教材,教室和上课时间,所以可以把(学生,课程)作为主键。但是,教材并不完全依赖于(学生,课程),只拿出课程就可以确定教材,因为一个课程,一定指定了某个教材。这就叫不完全依赖,或者部分依赖。出现这种情况,就不满足第二范式。

  修改后,选课表:

  学生   课程     教师      教师职称   教室   上课时间
  李四   Spring   张老师   java讲师   301   08:00
  张三   Struts    杨老师   java讲师   302   13:30

课程表:

  课程       教材 
  Spring   《Spring深入浅出》 
  Struts   《Struts in Action》

所以,第二范式可以说是消除部分依赖。第二范式可以减少插入异常,删除异常和修改异常。

第三范式(3NF)

第三范式要满足以下的条件:首先要满足第二范式。要求:表中的每一列只与主键直接相关而不是间接相关,

上例中修改后的选课表中,一个教师能确定一个教师职称。这样,教师依赖于(学生,课程),而教师职称又依赖于教师,这叫传递依赖。第三范式就是要消除传递依赖。

  修改后,选课表:

  学生   课程        教师    教室   上课时间

  李四   Spring   张老师   301   08:00
  张三   Struts    杨老师   302   13:30

  

    教师表:

    教师   教师职称
  张老师   java讲师
  杨老师   java讲师

这样,新教师的职称在没被选课的时候也有地方存了,没人选这个教师的课的时候教师的职称也不至于被删除,修改教师职称时只修改教师表就可以了。

简单的说,

第一范式就是原子性,字段不可再分割;
第二范式就是完全依赖,没有部分依赖;
第三范式就是没有传递依赖。

转载于:https://www.cnblogs.com/Demon-Mx/p/8556253.html

你可能感兴趣的文章
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
前端监控
查看>>
clipboard.js使用方法
查看>>
0906第一次作业
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
iOS6与iOS7屏幕适配技巧
查看>>
mysql 历史记录查询
查看>>
伪类与超链接
查看>>
一段js代码的分析
查看>>
centos 7 redis-4.0.11 主从
查看>>
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
视频:"我是设计师"高清完整版Plus拍摄花絮
查看>>