• 数据库设计(二) 设计规范(三大范式、四大特性、四大隔离级别以及解决的三种问题)


    一、设计问题

     由于不同的人从不同 的角度考虑问题,设计出的 E-R 就会有着不同的差别,因此要注意以下几个问题

    信息重复:表中数据存在重复的信息,或使用相同含义不同字表述的类型,

    更新异常:由于冗余的信息在进行更新时未全部进行更新,会导致数据出现错误,称为更新异常

    插入异常:无法表示某些信息,如同一个宾馆的标间出现了不同的价格,导致插入时出现异常

    删除异常:在删除某一行记录时,导致将房间类型表中的某一类型也删除掉了,称为删除异常

    二、规范设计 

    1、三大范式

    在进行数据设计时,制定的一些规则,称为数据库设计范式 ,遵守这些规则将创建出良好的数据库,如经常听到的数据库三大范式

    (1)、第一范式

      第一范式(Normal From,1NF)的目标是确保每列的原子性。

      如果每列(或属性)的都是不可再分的最小数据单元(或最小的原子单元)则满足第一范式

    如:地址列 可以拆分为国家 ,省,市,县(区),镇,村(街道办事处)等几个 部分 

    (2)、第二范式

      第二范式(2NF)在第一范式的基础上更近一步,目标是确保表中的每列都和主键相关。

      如果一个关系满足第一范式,并且除了主键以外,其他主键都全部依赖该主键则满足第二范式

    如:订单详细表中有(订单详细编码,订单详细名,订单编号,订单名,订单类型,商品编码,商品名,商品单价,商品数量等)

      其中可以看出

      订单详细名 →  订单详细编码

      订单名,订单类型    →   订单编号

      商品名,商品单价,商品数量   →  商品编码

      其中 → 符号代表依赖,由于上述只有部分列依赖于主键,违背了第二 范式 可以对其进行拆分成 订单详细表,订单表,商品表三个表,通过主外键进行相互关联

    (3)、第三范式

      第三范(3NF)是在第二范式的基础上更近一步,第三范式的目标是确保每列都和主键列直接相关,而不是间接相关

      如果一个关系满足第二范式,并且除了主键以外的其他列都只能依赖主键列,列与列之间不存在相互依赖关系,则满足第三范式

    借助数学中的Armstrong 公理来判定,如  A、B、C、D 中是表中的四个列

      其中A 为主键, B →  A(B依赖A),C →  A,D →  A 如果其中还有,B →  C,C →  D 从这两个还可以推导出 B →  D,此时虽然满足第二范式,但是不满足第三范式

      只有 当 A 为主键时,有且只有 B →  A(B依赖A),C →  A,D →  A ,这三个依赖时才满足第三范式。

    在现实的话如:商品表中有(商品编号,商品名,商品类型,商品规格,商品单价)

      其中虽然 商品名,商品类型,商品规格,商品单价 都依赖 主键商品编号,但是 商品规格,商品单价 依赖于商品类型

      由于不同类型的商品的 规格 和 单价不同

      因此还可以将其分为商品表和商品类型表,这样才满足第三范式

    2、数据库事务的四大特性:(ACID)

    原子性( Atomicity ):指的是事务是一个不可分割的工作单位,要不全部成功,要不全部回滚

    一致性( Consistensy ):事务在执行前后数据库处于一致性。(如:AB之间转账,A少100,B必须要增加100)

    隔离性( Isolation ):多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离

    持久性( Durability ):指一个事务一旦被提交,他对数据库的影响是永久性的。

    三、规范化和性能的关系

    由于项目对于最终的用户来说,客人最关心的是方便清晰的数据结果,因此在设计数据库时,设计人员和客户对数据库的设计规范化与性能之间存在一定的矛盾。

    如上为了满足数据库三大范式, 数据操作性能也随之受到了影响,毕竟查询一个表和查询 多个表的性能是不一样的,因此在实际设计时,既要考虑三大范式,避免数据的冗余和各种数据操作异常;又要考虑数据库的访问性能。可以使用的小操作有:为了减少表之间的连接,提高数据库性能,允许适当的冗余列

    如:金额列存在不满足数据库设计的第三范式,因为金额可以通过单价乘以数量得到,但是增加后可以提过数据的处理速度,加快访问速度,便于直观展示,相对而言是一个比较好的冗余(对其形容 比较高级的说法叫以空间换取时间),但是,不要轻易 违反数据库设计的规范化原则。如果处理不好,可能会适得其反,使应用程序运行速度更慢。

  • 相关阅读:
    Java并发包concurrent——ConcurrentHashMap
    Eclipse中给SVN添加项目
    Maven在导入其他项目时报错:Plugin execution not covered by lifecycle configuration
    新导入的项目目录结构不对(main目录)
    java.lang.reflect.Method.getAnnotation()方法示例
    彻底理解ThreadLocal
    Oracle查询前几条数据的方法
    PLSQL Developer新手使用教程(图文教程)
    PLSQL连接本地oracle或远程oracle数据库,实现随意切换
    Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
  • 原文地址:https://www.cnblogs.com/obge/p/13605028.html
Copyright © 2020-2023  润新知