数据库设计心得

数据库设计心得

什么是数据库设计

数据库设计就是根据业务系统的需求,综合我们选择的DBMS,为业务结构创造出最优的数据存储模型。并建立好数据库中的表结构与表之间的关联关系的过程。使之能有效的对应用系统中的数据进行存储,并可以提高对已经存储数据的访问。

优良的数据库设计

  1. 减少数据冗余
  2. 避免数据维护异常
  3. 节约存储空间
  4. 高效访问

数据库设计的大致步骤

  1. 需求分析(数据有哪些,数据有哪些属性,数据与属性它们各自的特点)
  2. 逻辑设计(ER图对数据库进行逻辑建模)
  3. 物理设计(根据选择的数据库的特点把逻辑设计转换成物理设计)
  4. 维护优化(新的需求建表,索引优化,大表拆分)

数据库需求分析

  1. 了解系统中所要存储的数据
    • 实体与实体之间的关系(1对1,1对多,多对多)
  2. 了解数据存储的特点
    • 实体属性的特点(唯一标识一个实体)
  3. 了解数据的生命周期
    • 数据存储特点(永久,暂时)

数据库逻辑设计

  1. 将需求转化成数据库的逻辑模型
  2. 通过ER图的形式对逻辑模型进行展示
    • 矩形:实体集
    • 菱形:关系集
    • 椭圆:实体属性
    • 线段:将实体连上属性,将实体连上关系
  • 数据库的逻辑设计与DBMS的选择无关

数据库逻辑设计规范

  • 第一范式
    • 要求数据库中的表都是二维表
  • 第二范式
    • 要求数据库中的表不存在非关键字段对候选字段的部分依赖
  • 第三范式
    • 要求数据库中的表不存在非关键字段对候选字段的传递依赖

数据库物理设计

  • 选择合适的数据库管理系统
    • Oracle:商业数据库,基于服务器核心数收费、适用于企业级项目和金融业
    • SQLServer:商业数据库,基于服务器核心数收费,Windows独家。
    • MySQL:开源数据库,互联网项目
    • PgSQL:开源数据库
  • 定义数据库命名规范
    • 可读性原则
    • 表意性原则
    • 长名原则
  • 根据选择的DBMS系统选择合适的字段
    • 列的数据类型一方面会影响数据存储开销,另一方面会影响查询性能
    • 选择原则
      • 优先考虑数字类型,其次是日期二进制类型,最后是字符类型。
      • 对于相同级别的数据类型,应该选择占用小的类型
    • 选择角度
      • 对于数据操作时,同用数据字符的处理要比数字的处理慢上很多
      • 数据处理以页为单位,列的长度越小,利于性能提升
    • 同级别选择
      • char与varchar的区别
        1. 如果数据存储的长度差不多时,优先选择char
        2. 如果列的最大数据长度小于50Byte,优先选择char
        3. 如果这个列很少使用,基于节省空间与减少I/O考虑,优先选择varchar
      • float和decimal的区别
        1. decimal实现精准存储,精度存储选择decimal
        2. float存储空间开销一般比decimal小
  • 反范式设计
    • 目的:为了性能与读写性能的考虑而适当对第三方式进行违反
    1. 减少表的关联数量
    2. 增加数据的读取效率
    3. 反范式化一定要适度
  • 其他注意事项
    • 如何选择主键
      • 业务主键:标识业务数据,进行表与表间的关联
      • 数据库主键:为了优化数据存储自动生成的主键(Innodb会自动生成6个字节的隐含主键)
    • 主键是否要顺序增长
    • 主键的字段类型要尽量小
    • 少用外键
      • 降低了数据的导入效率
      • 增加维护成本
      • 关联的列上一定要建立索引
    • 避免使用触发器
      • 降低数据的导入效率
      • 可能会出现意想不到的数据异常
      • 使业务逻辑变得复杂
    • 严禁使用预留字段

MySQL常用数据引擎

  1. MySAM
    • 不支持事务
    • 不支持表级锁
    • 不适合频繁读取
    • 读写速度快
  2. MRG_MySAM
    • 不支持事务
    • 不支持表级锁
    • 不适合全局查找
    • 适合分段归档,数据仓库
  3. Innodb
    • 支持事务
    • 支持MVCC事务锁
    • 适合事务处理
    • 读写高效
  4. Archive
    • 不支持事务
    • 行级锁
    • 仅支持insert,select
    • 占用空间小
  5. Ndb cluster
    • 支持事务
    • 行级锁
    • 高可用性

数据库优化

  1. 维护数据字典
    • 第三方工具对数据字典进行维护
    • 利用数据本身的备注字段来维护数据字典
  2. 维护索引
    • 选在在where,group by从句,order by从句中的列
    • 可选择性高的列要放在索引前面
    • 索引中不要包括太长的数据结构
  3. 维护表结构
    • 使用在线变更表结构工具
    • 同时对数据字典进行维护
    • 控制表的宽度与大小
  4. 数据库选择合适操作
    • 尽量选择批操作,而不是逐条结婚
    • 禁止使用select *
    • 控制用户使用自定义函数
    • 不要使用数据库中的全文索引
  5. 表拆分
    • 垂直拆分
      • 经常一起查询的列放一起
      • text,blog等大字段拆分出到附加表
    • 水平拆分
      • 表过大时,选择Hash,Key进行平均拆分
posted @ 2019-04-21 09:25  まだまだだわ  阅读(186)  评论(0编辑  收藏  举报