zoukankan      html  css  js  c++  java
  • 数据库范式快速理解

    范式主要作用是消除冗余

    未经范式化的表

    employee表字段:

    字段名 字段描述
    EmployeeID (员工ID,主键)
    departmentName (部门名称,主键)
    Name (姓名)
    Address (地址)
    job (岗位)
    jobDescription (岗位说明)
    skill (员工技能)
    departmentDescription (部门描述)
    email (邮箱)

    第一范式:

    第一范式就是每一个属性都不可再分

    单字段有冗余信息不满足第一范式:比如 address 中国广州市番禺区××街道

    新建地址表关联主表addressID,字段为:主键addressID,country,city,street,则满足第一范式

    第二范式

    表中的属性必须完全依赖于全部主键,而不是部分主键。所以只有一个主键的表如果符合第一范式,那一定是第二范式。

    employee表很明显departmentDescription依赖于主键departmentID,对主键部分依赖,不满足第二范式。

    新建部门表department关联主表departmentID,字段:主键departmentID,departmentName,departmentDescription,则满足第二范式

    第三范式

    第三范式是为了消除数据库中关键字之间的依赖关系

    jobDescription(岗位说明)是由job(岗位)所决定,则jobDescription依赖于job,可以看出这不符合第三范式

    新建岗位表关联主表job,字段:主键job,jobDescription,则满足第三范式

    BC范式(BCNF)

    前言:在一个数据库中每行的值都不相同,则可称为候选键。

    每个表中只有一个候选键(一般为主键)。

    每个员工都有一个唯一的email,不符合BCNF。

    新建email表,字段:主键employeeID,email

    第四范式

    第四范式是消除表中单字段多值依赖

    如上表skill可能有很多个值:比如A员工:JS,Python,SQL,B员工:JS,C,C++

    这个数据库属性存在多个值,这就可能造成数据库内容不一致的问题。解决办法是将多值属性放入一个新表。

    新建skill表,字段:EmployeeID,skill


    范式登记越高,表越多。表多会带来很多问题:

    1. 查询时要连接多个表,增加查询难度

    2. 查询时需要连接多个表,降低了数据库查询性能

    一般用第二范式或第三范式

  • 相关阅读:
    【t035】收入计划
    【Z10】引水入城
    【a702】贷款利率
    【t057】任务分配
    10个带源码的充满活力的Web设计教程
    PHP和MySQL Web开发(原书第4版) 高清PDF+源代码
    Optimizing concurrent accesses in a directory-based coherency protocol
    献给母亲节的沙画,致此生最爱——母亲!
    献给母亲节的沙画,致此生最爱——母亲!
    C#一些实用的工具
  • 原文地址:https://www.cnblogs.com/Neroi/p/13633750.html
Copyright © 2011-2022 走看看