转载自:http://www.lvzaiyi.com/Daily.aspx?pid=33

数据库设计的第三范式

关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效率、优雅的数据库,否则可能会设计出错误的数据库.

目前,主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。满足最低要求的叫第一范式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推。

范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦,但是操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。要权衡是否使用更高范式是比较麻烦的,一般在项目中,用得最多的也就是第三范式,我认为使用到第三范式也就足够了,性能好而且方便管理数据。

函数依赖,如果一个表中某一个字段Y的值是由另外一个字段或一组字段X的值来确定的,就称为Y函数依赖于X。

第一范式(1NF)
定义:如果关系模式R的每个关系r的属性都是不可分的数据项,那么就称R是第一范式的模式。
简单的说,每一个属性都是原子项,不可分割。
1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。关系数据库设计研究的关系规范化是在1NF之上进行的。

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

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

学生编号  姓名  性别  电子邮件   电话
20080901  张三  男   zs@126.com  88886666
20080902  李四  女   ls@126.com  66668888

第二范式(2NF)
定义:如果关系模式R是1NF,且每个非主属性完全函数依赖于候选键,那么就称R是第二范式。
简单的说,第二范式要满足以下的条件:首先要满足第一范式,其次每个非主属性要完全函数依赖与候选键,或者是主键。也就是说,每个非主属性是由整个主键函数决定的,而不能由主键的一部分来决定。

例如(学生选课表):
学生    课程   教师    教师职称  教材         教室  上课时间
李四    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)
定义:如果关系模式R是2NF,且关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖,则称关系R是属于第三范式。  
简单的说,第三范式要满足以下的条件:首先要满足第二范式,其次非主属性之间不存在函数依赖。由于满足了第二范式,表示每个非主属性都函数依赖于主键。如果非主属性之间存在了函数依赖,就会存在传递依赖,这样就不满足第三范式。

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

修改后,选课表:

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

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

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

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

转载于:https://www.cnblogs.com/lucky_dai/archive/2012/05/10/2494274.html

数据库设计的第三范式相关推荐

  1. 优化MySchool数据库设计(SQL Server)

     优化MySchool数据库设计 学东西要学活学透,用对方能理解的方式讲解(最好以贴近生活的方式讲解)怎么用 编程思维:用空间换时间 项目的开发包括以下几个阶段: 需求分析:分析客户的业务和数据处理需 ...

  2. 数据库设计之范式与反范式

    范式设计 什么是范式? 范式来自英文Normal Form,简称NF.要想表之间设计-个好的关系,必须使关系 满足一定的约束条件,此约束已经形成了规范,分成几个等级,一级比一级要求 得严格.满足这些规 ...

  3. 用mysql设计数据库的步骤_数据库设计的主要步骤是什么

    数据库设计的主要步骤是什么 发布时间:2020-08-12 10:00:24 来源:亿速云 阅读:141 作者:小新 这篇文章给大家分享的是有关数据库设计的主要步骤是什么的内容.小编觉得挺实用的,因此 ...

  4. MySQL 学习笔记(14)— 数据库设计流程、实体关系图、第一范式、第二范式、第三范式、外键使用

    本文参考:https://gitbook.cn/gitchat/column/undefined/topic/5db92c12a9c3a53bc3800f0c 1. 数据库设计流程 数据库设计是对数据 ...

  5. 软件设计之 数据库设计

    [按语:在软件设计或是动态网站开发中,数据库设计时很重要,我觉得可以说是开发工作的核心部分,所以学好数据库设计,是很重要的,也是大有前途的...]  ◆.概念 首先要搞清楚容易混淆的两个概念:&quo ...

  6. 关系型数据库设计要领(值得收藏)

    欢迎关注方志朋的博客,回复"666"获面试宝典 摘要 本文讨论关系数据库设计相关的一些内容,涉及关系模型,表结构设计等内容,以学生选修课程讲述设计过程,在尽量讲清楚设计要领的前提下 ...

  7. 数据库设计三大范式和ER模型

    1. 数据库设计之三范式的介绍 范式: 对设计数据库提出的一些规范,目前有迹可寻的共有8种范式,一般遵守3范式即可. 第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列.(1NF强调字 ...

  8. 14 个实用的数据库设计技巧,一次性教给你!

    目录 原始单据与实体之间的关系 主键与外键 基本表的性质 范式标准 通俗地理解三个范式 要善于识别与正确处理多对多的关系 主键PK的取值方法 正确认识数据冗余 E--R图没有标准答案 视图技术在数据库 ...

  9. DQL查询语句约束数据库设计备份和还原

    DQL:查询语句 1. 排序查询* 语法:order by 子句* order by 排序字段1 排序方式1 , 排序字段2 排序方式2...* 排序方式:* ASC:升序,默认的.* DESC:降序 ...

最新文章

  1. 作为一名程序员,数学到底对你有多重要?
  2. 用eclipse在windows下搭建cocos2d-x开发环境
  3. matlab 变参数 方程组,解带参数方程组 运行结果竟然自己带了新参数z
  4. 吴恩达《序列模型》精炼笔记(2)-- NLP和Word Embeddings
  5. Java线程之守护线程(Daemon) .
  6. 求连续序列的最大子序列和
  7. Apollo进阶课程㉘丨Apollo控制技术详解——基于模型的控制方法
  8. Hadoop HBase概念学习系列之hbase shell中执行java方法(高手必备)(二十五)
  9. java分布性_java大型分布系统性能优化实战教程
  10. hypermesh optistruct 形状优化
  11. 485通讯的校验和_三菱FX3U与变频器通讯程序如何编写
  12. seaweedfs入门
  13. marshmallow——简介
  14. 多线程学习--案例-子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次
  15. 中国量化金融行业 全解 金融工程 计算机 统计学 金融 专业领域 就业指南
  16. Latex 设置表格字体垂直居中且水平居中,字体放在表格最中央之简单好用的方法
  17. python的树蕨类型(是数据嘿嘿嘿,打错发现挺好玩的)
  18. 分析程序员为什么单身
  19. Java+MySQL 基于ssm的公司员工人事工资管理系统#毕业设计
  20. 跑前端vue项目流程

热门文章

  1. python中do的用法,如何使用docplex(python)对优化问题中的约束进行建模?
  2. Truffle合约交互 - WEB端对以太坊数据的读写
  3. Android平台监听系统截屏方案预研及相关知识点
  4. 火车票售票系统mysql_为何火车上明明有很多空位,售票系统却会显示无座?
  5. JZOJ 5050. 【GDOI2017模拟一试4.11】颜色树
  6. Cortex-A 处理器运行模型
  7. Qt 关于定时器实用的总结
  8. python 浮点数精度丢失_javascript解决小数的加减乘除精度丢失的方案
  9. [POJ 1222] EXTENDED LIGHTS OUT
  10. 战争游戏[tarjan]