逻辑设计
范式设计
-
第一范式:数据库表中的所有字段都只具有单一属性 单一属性的列是由基本数据类型所构成的 设计出来的表都是简单的二维表
id name-age 1 张三-23 变为:
id name age 1 张三 23 -
第二范式:要求表中只具有一个业务主键,也就是说符合第二范式的表不能存在非主键列只对部分主键的依赖关系
订单表ID(主键) 订单时间 产品ID 1 2018-12-12 3 1 2018-12-12 4 产品表ID 产品名称 2 娃娃 3 飞机 4 java入门 变化:
订单表ID 订单时间 1 2018-12-12 订单商品中间表ID 订单ID 产品ID 1 1 3 2 1 4 产品表ID 产品名称 2 娃娃 3 飞机 4 java入门 -
第三范式;指每一个非非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上相处了非主键对主键的传递依赖
订单表ID(主键) 订单时间 客户编号 客户姓名 1 2018-12-12 1 张三 2 2018-12-12 2 李四 其中
客户编号 和订单编号管理 关联
客户姓名 和订单编号管理 关联
客户编号 和 客户姓名 关联
如果客户编号发生改变,用户姓名也会改变,这样不符合第三大范式,应该把客户姓名这一列删除
反范式设计
什么叫反范式化设计
-
反范式化是针对范式化而言得,在前面介绍了数据库设计得范式
-
所谓得反范式化就是为了性能和读取效率得考虑而适当得对数据库设计范式得要求进行违反
-
允许存在少量得冗余,换句话来说反范式化就是使用空间来换取时间
范式化设计优缺点
优点:
-
可以尽量得减少数据冗余
-
范式化的更新操作比反范式化更快
-
范式化的表通常比反范式化的表更小
缺点:
-
对于查询需要对多个表进行关联
-
更难进行索引优化
反范式化设计优缺点
优点:
-
可以减少表的关联
-
可以更好的进行索引优化
缺点:
-
存在数据冗余及数据维护异常
-
对数据的修改需要更多的成本
物理设计
命名规范
-
数据库、表、字段的命名要遵守可读性原则
使用大小写来格式化的库对象名字以获得良好的可读性
例如:使用custAddress而不是custaddress来提高可读性。
-
数据库、表、字段的命名要遵守表意性原则
对象的名字应该能够描述它所表示的对象
例如:
对于表,表的名称应该能够体现表中存储的数据内容;对于存储过程
存储过程应该能够体现存储过程的功能。
-
数据库、表、字段的命名要遵守长名原则
尽可能少使用或者不使用缩写
存储引擎选择
| 对比项 | MyISAM | InnoDB |
|---|---|---|
| 主外键 | 不支持 | 支持 |
| 事务 | 不支持 | 支持 |
| 行表锁 | 表锁,即使操作一条记录也会锁住整个表 不适合高并发的操作 | 行锁,操作时只锁某一行,不对其它行有影响 适合高并发的操作 |
| 缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 |
| 表空间 | 小 | 大 |
| 关注点 | 性能 | 事务 |
| 默认安装 | Y | Y |
数据类型选择
当一个列可以选择多种数据类型时
-
优先考虑数字类型
-
其次是日期、时间类型
-
最后是字符类型
-
对于相同级别的数据类型,应该优先选择占用空间小的数据类型
浮点类型
| 列类型 | 存储空间 | 是否精确类型 |
|---|---|---|
| FlOAT | 4个字节 | 否 |
| DOUBLE | 8个字节 | 否 |
| DECIMAL | 每4个字节存9个数字,小数点占1个字节 | 是 |
注意float 和double 是非精度类型,如果是和金额相关尽量用decimal
日期类型
datetime类型在5.6中字段长度是5个字节
datetime类型在5.5中字段长度是8个字节
timestamp 和时区有关,而datetime无关