码迷,mamicode.com
首页 > 数据库 > 详细

数据库三范式

时间:2018-10-01 14:08:49      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:重复   要求   实例   第一范式   开放   int   自己   com   直接   

一、设计数据库时所依据的共有三个范式

  1、第一范式:要求有主键,数据库中不能出现重复记录,每一个字段是原子性不可再分的

    实例:

技术分享图片

    分析以上出现的问题:

      ①数据存在重复记录,没有主键,数据不唯一

      ②联系方式还可以再分,不是原子性

   修改之后的:

技术分享图片

   总结第一范式:

    ①每一行必须唯一,必须有主键,这是设计数据库的最基本的要求

    ②主键通常采用数值型(int/bigint)或者定常字符串(自己写的方法来实现)来表示

    ③关于列不可再分,需要根据实际情况具体分析,如联系方式,为了开放上的遍历就可能采用一个字段了

  2、第二范式:是建立在第一范式的基础之上的,非主键字段完全依赖主键,不能部分依赖,严格意义上说就是:尽量避免使用联合主键

    实例:

    示例1、数据仍然可能重复:

技术分享图片

      示例2、确定主键,学生编号,教师编号,出现冗余

        技术分享图片

       出现的问题:

        ①虽然确定了主键,但是此表会出现大量的冗余,主要涉及到的冗余字段有“学生姓名”和“教师姓名”

        ②出现冗余的原因是:学生姓名部分依赖了主键的一个字段”学生编号“,而没有依赖“教师编号”,教师姓名部分依赖了主键的一个字段“教师编号”,而没有依赖学生编号,这就是第二范式的部分依赖

     改进版:学生和老师之间是多对多,所以需要一个中间表来建立这种联系

     技术分享图片

     技术分享图片

     辅助表:(教师和学生的关系表)

     技术分享图片

     这是典型的多对多设计

  3、第三范式

     建立在第二范式的基础上,要求非主键字段不能传递依赖于主键字段。

    实例:

    技术分享图片

    分析:

      ①从表中看班级名称存在冗余,班级名称没有直接依赖于主键

      ②班级名称字段依赖于班级编号,班级编号依赖于学生编号,那么这就是传递依赖

    改进版:

      ①把冗余的字段拿出来建立表

      ②学生信息表中,班级编号设置为外键

      学生信息表:

      技术分享图片

      班级信息表:

      技术分享图片

      典型的一对多

 

数据库三范式

标签:重复   要求   实例   第一范式   开放   int   自己   com   直接   

原文地址:https://www.cnblogs.com/rgever/p/9734577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!