zoukankan      html  css  js  c++  java
  • 数据库范式(知乎)

    http://www.zhihu.com/question/24696366

    数据库泛型就是数据库应该遵循的规则,也称为范式

    1NF:所有的域都是原子性的,即表的每一列都是不可分割的原子数据项,不能是集合、数组、记录等非原子数据项。即实体中的某个属性有多个子属性时,必须拆分为不同的属性。第一范式是对关系型数据库的最低要求

      

    2NF:在1NF的基础上,非码属性必须完全依赖于码(码:关系中的某个属性或某几个属性的组合,用于区分每个元组,元组可以理解为表中每条记录)

      1NF存在的问题:

      1)数据冗余:表中学号、姓名、系名、系主任数据冗余严重

      2)插入异常:无法插入一个没有学生的新系(主属性不能为空,码包含的属性为主属性)

      3)删除异常:删除一个系的所有学生,将导致系和系名被删除

      4)修改异常:假设李小明转系到法律系,需要修改李小明的所有三条记录

      2NF在1NF的基础上,要求非码属性必须完全依赖于码,即非码属性不能部分依赖于码

      为了消除部分函数依赖,必须将大数据表拆分成两个或更多的小数据表:

      

      形成两张表:

      

    3NF:在2NF的基础上,消除了非主属性对于码的传递函数依赖

      2NF存在的问题:

      1)插入异常:无法插入一个没有学生的新系

      2)删除异常:删除所有学生将导致系消失

      在2NF中,可能存在非码属性传递函数依赖于码,如学号--系名--系主任

      为了消除传递函数依赖,需要继续拆分表:

      

      形成三张表:

      

      符合3NF要求的数据库设计,基本上解决了数据冗余过大、插入异常、删除异常、修改异常等问题

    BCNF范式:

      假设:

      1. 某公司有若干个仓库

      2. 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作

      3. 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量

      则关系模式 仓库(仓库名,管理员,物品名,数量) 属于3NF范式:

      码:(管理员,物品名),(仓库名,物品名)

      主属性:仓库名、管理员、物品名

      非主属性:数量

      非主属性完全依赖于码、同时不存在非主属性对于码的传递函数依赖,所以属于3NF范式

      

      这张表存在的问题:

      1)无法新增未指派管理员、未存放物品的仓库

      2)清空仓库会删除仓库和管理员信息

      3)仓库更换管理员,将修改该仓库的每一条记录

      造成3NF范式存在这些问题的主要原因是:存在主属性对于码的部分函数依赖或传递函数依赖:主属性仓库名 对于 码(管理员、物品)存在部分函数依赖

      BCNF在3NF的基础上消除主属性对于码的部分和传递函数依赖

      因此需要将上表拆分成两个表:

      仓库(仓库名,管理员)

      库存(仓库名,物品名,数量)

  • 相关阅读:
    Linux下一个patch补丁命令
    资本中国人物-金融
    深入浅出JMS(一)——JMS简要
    在JBuilder8在使用ANT
    mysql存储引擎
    Linux系统监控
    SIEM
    mysql主从数据库复制
    JVM中可生成的最大Thread数量
    磁盘IO性能监控(Linux 和 Windows)
  • 原文地址:https://www.cnblogs.com/buptlyn/p/4477147.html
Copyright © 2011-2022 走看看