zoukankan      html  css  js  c++  java
  • 数据库三个范式详解

    数据库三个范式详解

    数据库范式的提出是为了对关系数据库中的数据进行规范而提出的一个概念,第一范式,第二范式,第三范式这三个范式逐渐对数据进行细分,意思就是指属于这三种范式之一的关系数据库的数据相互之间的依赖关系越来越清晰明了。下面对三种范式进行详细的讲解。

    第一范式(1NF):属于第一范式的数据库的表的列(属性)是不能再进一步拆分的。如

    学号 课程
    2014212797 软件技术基础   高数

    很显然,这个表格的第二列是可以在细分的,所以不属于第一范式。第一范式是数据库数据的最低要求,不满足第一范式的的“数据库”不能称为关系数据库,在非规范化数据去掉组合项。

    学号 课程
    2014212797 软件技术基础  
    2014212798 高数

    第一范式会出现数据冗余、插入、删除异常现象。(比如上面表格中学号的重复现象)

    第二范式(2NF):首先得满足第一范式的条件,并且表中必须要有一个主键,同时不属于主键的属性(意思是主键可以是几个属性)必须完全依赖于主键(这句话有点绕,好好理解下),即设置好某个表的属性后可以根据这个主键检索得到唯一的一个属性,而不能得到几个结果。如果出现的部分依赖的属性则应当将该属性与主键的依赖部分单独分离出来,单独建立一个表。第二范式的任务就是在满足第一范式的条件下消除部分函数依赖。

    学号   |  姓名 |  邮箱  |  课程号  | 课程地址

    2323    lf       ddd      123         345

    2323   lj       dsd       345        3789

    显然这个表属于第一范式,主键(由学号与课程地址)能定位到唯一一行。但是课程地址部分依赖于课程号,与学号无联系,所以该数据库不属于第二范式。所以需要讲部分依赖的主键与属性单独建立一个表。原表变为两个表:

    学号   |  姓名 |  邮箱  |  课程号 

    2323    lf       ddd      123        

    2323   lj       dsd       345       

      课程号  | 课程地址

      123         34

      345        3789

    不符合第二范式的数据库容易产生数据冗余

    第三范式(3NF):首先满足第二范式,同时不能存在传递性依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

    简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
    StudyNo   |   Name   |   Sex   |      Email         |      bounsLevel   |   bouns

    20040901      john         Male       kkkk@ee.net   优秀                    $1000

    20040902     mary         famale    kkk@fff.net       良                         $600

    这个完全满足了第二范式,但是bounsLevel和bouns存在传递依赖

    更改为:

    StudyNo   |   Name   |   Sex   |      Email         |      bouunsNo

    20040901      john         Male       kkkk@ee.net   1

    20040902     mary         famale    kkk@fff.net       2

    bounsNo   |   bounsLevel   |   bouns

    1                   优秀                $1000

     2                 良                   $600

    表中bounsNo作为主键

    一般符合第三范式的关系数据库能够避免数据冗余的情况。

    本文参考了一下几篇博文:

    http://blog.csdn.net/sunzhenhua0608/article/details/16850053

    http://blog.csdn.net/famousdt/article/details/6921622

    学生管理系统:http://www.cnblogs.com/nx520zj/archive/2013/05/29/3105725.html

  • 相关阅读:
    Android studio怎么创建shape的XML文件
    请问如何在PS中将一张图标里的各个小图标分离成一个个图标?
    IOS 开发之 -- 过滤掉字符串里面所有的非法字符 字典和json之间的互转
    ios开发之 -- 5分钟集成融云的客服功能
    ios开发之 --调用系统的页面,显示中文
    IOS 开发之-- textfield和textview,return键的改变,点击return键
    IOS 开发之--获取真机的deviceToeken
    iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
    iOS 开发之--打测试包的时候报错的解决方法
    ios开发之 -- 调用系统定位获取当前经纬度与地理信息
  • 原文地址:https://www.cnblogs.com/alsf/p/6219682.html
Copyright © 2011-2022 走看看