zoukankan      html  css  js  c++  java
  • 数据库三大范式

    一、第一范式

    1. 要求

    • 最基本的范式
    • 数据库表每一列都是不可分割的基本数据,同一列中不能有多个值
    • 简单说就是要确保每列保持原子性
    • 第一范式的合理遵循需要根据系统的实际需求来定

    二、第二范式

    1. 要求

    • 第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)
    • 即在一个数据库表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中

    三、第三范式

    1. 要求

    • 确保数据表中的每一列数据都和主键直接相关,而不能间接相关
    • 属性不依赖于其他非主属性

    第一范式(1NF)

    数据表的每一列都要保持它的原子特性,也就是列不能再被分割。
    img

    这张表就不符合第一范式规定的原子性,不符合关系型数据库的基本要求,在关系型数据库中创建这个表的操作就不能成功。不得不将数据表设计为如下形式。
    img

    回到顶部

    第二范式(2NF)

    概率:属性必须完全依赖于主键。
    下满这张表不符合第二范式的要求。
    img

    缺点

    • 表中的第一行数据都存储了系名、系主任,数据的冗余太大
    • 如果有一个新的系还没有开始找到学生,那么不能讲该系的信息添加到数据表中去,从数据表中看不到该系的存在
    • 如果将某个系的学生信息全部删除,那么这个系在数据表里也就不存在了,但这个系还存在。
    • 如果某个人要转系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据

    依赖

    在数据表中,属性(属性组)X确定的情况下,能完全退出来属性Y完全依赖于X。
    完全依赖
    完全依赖是针对于属性组来说,当一组属性X能推出来Y的时候就说Y完全依赖于X。
    部分依赖
    一组属性X中的其中一个或几个属性能推出Y就说Y部分依赖于X。
    结论:当一个第一范式的候选码只有一个属性的时候,那它就是第二范式(2NF)

    候选码

    当一个属性或者属性组确定的情况下,这张表的其余所有属性就能确定下来,这个属性或者属性组就叫做或候选码。
    一张表可以有多个候选码
    一般只选一个候选码作为主键
    从表中找到两个属性:学号和课程
    学号可以推出姓名、系名、系主任。
    课程可以推出成绩。
    将它们两个设置为联合主键
    img

    存在的部分依赖

    • 姓名对学号存在部分依赖
    • 系名对学号存在部分依赖
    • 系主任对学号存在部分依赖
    • 这显然不符合第二范式的要求,做出修改:
      img

    表一中分数完全依赖于学号和课程的属性
    表二中姓名、系名、系主任完全依赖于学号的属性
    第二范式消除了第一范式的部分依赖

    第三范式(3NF)

    概念:所有的非主属性不依赖于其他的非主属性
    传递函数依赖
    设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
    在改进后的学生表中:
    主属性:学号
    非主属性:姓名、系名、系主任
    知道系名可以推出系主任,所以非主属性系主任对主属性学号存在传递函数依赖,这不符合非主属性不依赖于其它的非主属性的设计要求。将该数据表改进如下:
    img

    img

    第三范式消除了第二范式的传递函数依赖
    BC 范式
    主属性不能对候选码存在部分函数依赖或者传递函数依赖
    img

    这张表不存在部分函数依赖于传递函数依赖,属于第三范式
    表中的依赖关系

    • 仓库名—————>管理员
    • 管理员—————>仓库名
    • 物品名—————>数量

    主属性:仓库名、管理员、物品名
    非主属性:数量
    存在的问题

    • 先新添加一个仓库,但尚未存放任何物品,不可以为该仓库指派管理员,因为物品名也是主属性,根据实体完整性的要求,主属性不能为空
    • 某仓库被清空后,该仓库的信息也被清空
    • 当需要更新仓库管理员,该仓库存放了多少物品,就要修改多少条信息。
      在这个问题中就是存在了主属性对于候选码的部分依赖,也就是仓库名对于管理员和物品名的部分依赖。
      修改为
      仓库(仓库名,管理员)
      库存(仓库名、物品数、数量)

    范式的目的

    • 减小数据的冗余性
    • 提高效率

    参考https://www.cnblogs.com/gongcheng-/p/10901824.html

  • 相关阅读:
    Spring MVC Ajax 嵌套表单数据的提交
    Spring MVC 过滤静态资源访问
    Spring MVC 页面跳转时传递参数
    IDEA Maven 三层架构 2、运行 springMVC
    IDEA Maven 三层架构 1、基本的Archetype 搭建
    EasyUI DataGrid 基于 Ajax 自定义取值(loadData)
    Spring MVC Ajax 复杂参数的批量传递
    Mybatis Sql片段的应用
    在 Tomcat 8 部署多端口项目
    自动升级的设计思路与实现
  • 原文地址:https://www.cnblogs.com/xiaxiaopi/p/14373342.html
Copyright © 2011-2022 走看看