逻辑设计
数据库设计的三范式
- 第一范式:无重复的列
- 数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
- 第二范式:属性完全依赖于主键
- 满足第二范式必须先满足第一范式。数据库表中的每个实例或行必须可以被唯一的区分。为实现区分,通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性被称为主关键或主键、主码。
- 第三范式:要求一个数据库表中不包含已在其他表中包含的非主键字段信息
- 满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其他表中包含的非主关键字信息,即除主键外的关键字信息。
范式设计
- 范式设计的优点:
- 可以尽量的减少数据冗余
- 范式化的更新操作比反范式化更快
- 范式化的表通常比反范式化的表更小
- 范式设计的缺点:
- 对于查询需要对多个表进行关联
- 更难进行索引优化
反范式设计
反范式化是针对范式化而言的
所谓的反范式化就是为了性能和读取效率的考虑而适当的违反数据库设计范式的要求
允许存在少量的冗余,换句话来说反范式化就是使用空间来换取时间
-
反范式化的优点:
- 可以减少表的关联
- 可以更好的进行索引优化
-
反范式化的缺点:
- 存在数据冗余及数据维护异常
- 对数据的修改需要更多的成本
物理设计
命名规范
- 数据库、表、字段的命名要遵守
可读性原则
- 使用大小写或者下划线分割来格式化的库对象名字以获得良好的可读性
- 数据库、表、字段的命名要遵守
表意性原则
- 对象的名字应该能够描述它所表示的对象
- 数据库、表、字段的命名要遵守
长名原则
- 尽可能少使用或者不使用缩写
存储引擎选择
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 |
表锁 ,即使操作一条记录也会锁住整个表不适合高并发的操作
|
行锁 ,操作时只锁住某一行,不对其他行有影响适合高并发的操作
|
缓存 | 只缓存索引,不缓存真是数据 | 不仅缓存索引还要缓存真实数据,对内存要求比较高,而且内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
数据类型选
-
当一个列可以选择多种数据类型时
- 优先考虑数字类型
- 其次是日期、时间类型
- 最后是字符类型
- 对于相同级别的数据类型,应该优先选择占用空间小的数据类型
浮点类型的选择
列类型 | 存储空间 | 是否精确类型 |
---|---|---|
FLOAT | 4个节点 | 否 |
DOUBLE | 8个字节 | 否 |
DECIMAL | 每4个节点存9个数字, 小数点占1个字节 |
是 |
- 日期类型的选择
类型 | 大小(字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2037年某时 | YYMMDD HHMMSS | 混合日期和时间值,时间戳 |
- timestamp和时区有关,而datetime无关