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

    # 第一范式
    1 数据库表的每一列都不可再分,即不能有重复值。

    2属性不能重复
    3解决办法
    拆分多个表

    # 第二范式
    1首先要满足第一范式
    2非主键字段需要完全依赖主键
    3主要针对复合主键

    eg
    订单表
    订单编号    种类    数量    时间
    1           铅笔    2       0
    2           钢笔    3       1
    3           墨水    2       2
    用户表
    id    订单编号     username    zhuangtai
    1       1           a           y
    1       2           a           n
    2       3           c           y
    如果id和订单编号为复合主键
    状态完全依赖于主键
    但是用户名只依赖id
    因此不满足第二范式

    存在的问题
    1修改一个用户订单时需要修改多条记录
    2当一个用户没有下单时不能插入数据
    3删除用户的订单会将用户一起删除

    解决思路
    1关键在于用户名没有依赖复合主键
    2将用户名移除并与id新建一张表
    3其余属性合并
    eg
    id      username
    1       a
    2       c

    # 第三范式
    1必须在满足第二范式的情况下
    2其余字段之间不存在依赖性

    eg
    id      username        grade       discount
    1           a              a            0.9
    2           b              b            0.8
    3           c              a            0.9

    存在的问题
    可以看到虽然其余三个属性依赖主键id字段
    但是非主键字段grade discount之间存在依赖关系

    缺陷:
    1输入数据时会导致 如果出现没存在的grade那么discoun 也无处可知
    2删除某一个等级下的所有数据时对应的折扣也将被删除
    3修改某一数据时,对grade修改同时意味着对discount的修改


    解决思路:
    将这对依赖关系独立建表
    grade       discount
    a           0.9
    b           0.8

    # 范式的优缺点
    优点
    1降低了数据的冗余
    2提高了数据的增删改的可靠性

    缺点
    1增加了表的数量
    2降低了查询的效率

    # 反范式
    1直接在表中添加字段
    2会出现数据不一致的问题
    3需要定期更新定期检查


  • 相关阅读:
    最近面试有感,不要耍小聪明,面试官都是开了上帝视角的
    Mac OS X上编写 ASP.NET vNext 系列中断和再开声明
    Mac OS X 上编写 ASP.NET vNext (二) IDE配置
    Mac OS X上编写 ASP.NET vNext(一)KRE环境搭建
    Redhat Linux /etc/profile 与 /etc/bashrc 的区别
    IIS7 Application Pool Integrate Mode 和 Classic Mode 的区别
    Linux 学习笔记(一) 入门
    SQL Server 常用分页SQL
    winform 如何控制输入法
    winform 记录全局异常捕获
  • 原文地址:https://www.cnblogs.com/sugar-k/p/11480346.html
Copyright © 2011-2022 走看看