分类目录归档:数据库

数据库设计学习笔记

为什么要进行数据库设计

优良的设计

  • 减少数据冗余
  • 避免数据库维护异常
  • 节约存储空间
  • 高效的访问

糟糕的设计

  • 存在大量的数据冗余
  • 存在数据插入、更新、删除异常
  • 浪费大量存储空间
  • 访问数据低效

数据库设计步骤

  1. 需求分析
  2. 逻辑设计
  3. 物理设计
  4. 维护优化

需求分析

  • 数据是什么
  • 数据有哪些属性
  • 数据和属性各自的特点有哪些

逻辑设计

  • 使用ER图都数据库进行逻辑设计
  • 同选用的DBMS无关

名词解释

  • 关系: 一个关系对应通常所说的一张表
  • 元组: 表中的一行
  • 属性: 表中的一列
  • 候选码: 可以唯一确定一个元组的属性组
  • 主码:其中一个候选码
  • 域: 属性的取值范围
  • 分量: 元组中的一个属性值

ER图概要

  • 矩形: 实体
  • 椭圆: 属性
  • 菱形: 操作(关系)
  • 线段:联系

操作异常

  • 插入异常
  • 更新异常
  • 删除异常

范式

第一范式

要求数据库字段都是不可再分的(原子性)
换句话说就是要求数据库中的表都是二维表

第二范式

数据库中的表不存在非关键字字段对任一候选关键字段的部分函数依赖
部分依赖是组合关键字中,某一关键字决定某字段的情况

第三范式

不存在传递依赖

BC范式

如果是复合关键字,关键字字段之间不能存在函数依赖

物理设计

选择合适的数据库管理系统

表及字段的命名规则

  • 可读性原则
  • 表意性原则
  • 长名原则

字段类型选择原则

当一个列可以选择多种数据类型进行存储的时候,应该优先考虑数字类型,其次是日期或者二进制类型,最后是字符串类型。对于相同级别的数据类型,应该优先选择占用空间小的类型。

字段大小如下(来自慕课网课程截图)

char与varchar的选择
  • 列中长度差不多同样长的优先考虑char 否则考虑varchar
  • 列中最大数据长度小于50Byte,优先考虑char
  • char字段不宜大于50Byte
decimal与float的选择
  • 精确数据只能选用decimal
  • 非精确数据优先float

主键选择

  • 区分业务主键和数据库主键
  • 考虑主键是否要自动增长
  • 主键类型占用空间尽可能小

避免使用外键约束

  • 降低数据导入的效率
  • 增加维护成本
  • 虽然不建议使用外键约束,但是相关联的列上一定要建立索引

避免使用触发器

  • 降低数据导入的效率
  • 可能会出现意想不到的数九异常
  • 使业务逻辑变得复杂

严禁使用预留字段

  • 无法准确的知道预留字段的类型
  • 无法准确的知道预留字段的所存储的内容
  • 后期维护一个预留字段的的代价和增加一个字段的代价相同

反范式化

简单来说就是增加冗余以空间换时间
比如增加冗余字段,可以减少表的连接,提高了效率,但是违反了第三范式(有了传递)

维护和优化

维护数据字典

  1. 使用第三方工具进行维护
  2. 使用数据库自带的备注进行维护
  3. 到处数据字典

维护索引

选择合适的列建立索引
  • 出现在where ,group by,order by 从句中的列
  • 可选择性高的列应放到索引的前面
  • 索引中不要包含太长的数据类型
注意点
  • 索引要适量,过多的索引会使读写的效率都降低
  • 定期维护索引碎片
  • 在SQL语句中不要使用强制索引关键字

维护表结构

注意点
  • 使用在线变更别结构的工具(MySQL5.6以后本身支持)
  • 同时对数据字典进行维护
  • 控制表的宽度和大小(表的拆分)
表的垂直拆分

把一个宽表拆分为若干窄表,经常查出的列应该放同一张子表中,以此提高查询效率

表的水平拆分

当一个表中的数据量过多的时候,通过对主键进行哈希,尽量平均分到多个子表当中,以此提高查询效率
也就是说表的垂直拆分是为了解决表太宽的问题,而水平拆分是解决表太长的问题