数据库设计那些事——第3章 物理设计
3-1 数据库物理设计要做什么
物理设计要做什么
- 选择合适的数据库管理系统。如Oracle、SQLServer、MySQL及PgSQL。
- 定义数据库、表及字段的命名规范。
- 根据所选的DBMS系统选择合适的字段类型。
- 反范式化设计。
3-2 选择哪种数据库
- 常见的DBMS系统
- 商业数据库:Oracle和SQLServer(更适合企业级项目)
- 开源数据库:MySQL和PgSQL(适用于互联网项目)
3-3 MySQL常用存储引擎

3-4 数据库表及字段的命名规则
所有对象名应该遵循下述原则:
1.可读性原则:使用大写和小写格式化的库对象名字以获得良好的可读性。例如:使用CustAddress而不是custaddress来提高可读性。(这里要注意有些DBMS系统对表名的大小写敏感的)
2. 表意性原则:对象的名字应该能够描述它所标识的对象。例如,对于表,表的名称应该能够体现表中存储的数据内容;对于存储过程,存储过程名称应该能够体现存储过程的功能。
3. 长名原则:尽可能少使用或者不使用缩写,适用于数据库(DATABASE)名之外的任一对象。


3-5 数据库字段类型选择原则

列的数据类型一方面影响数据存储空间的开销,另一方面也会影响数据查询性能。当一个列可以选择多种数据类型时,应该有限考虑数字类型,其次是日期或二进制类型,最后是字符串类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。

以上选择原则主要是从以下两个角度考虑:
- 在对数据进行比较(查询条件、JOIN条件及排序)操作时:同样的数据,字符处理往往比数字处理慢。
- 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升。
3-6 如何具体选字段类型
char与varchar如何选择
原则:
- 如果列中要存储的数据长度差不多是一致的,则应该考虑用char;否则应该考虑用varchar。
- 如果列中的最大数据长度小于50Byte,则一般也考虑用char。(当然,如果这个列很少用,则基于节省空间和减少I/O的考虑,还是可以选择用varchar)
- 一般不宜定义大于50Byte的char类型列。
decimal与float如何选择
原则:
- decimal用于存储精确数据,而float只能用于存储非精确数据。故精确数据只能选择用decimal类型。
- 由于float的存储空间开销一般比decimal小(精确到7位小数只需要4个字节,而精确到15位小数只需要8字节),故非精确数据优先选择float类型。
时间类型如何存储
- 使用int来存储时间字段的优缺点
优点:字段长度比datetime小。
缺点:使用不方便,要进行函数转换。
限制:只能存储到2038-1-19 11:14:07即2^31为2147483648 - 需要存储的时间粒度
年 月 日 小时 分 秒 周
3-7 数据库设计其他注意事项
如何选择逐渐
- 区分业务主键和数据库主键
业务主键用于标识业务数据,进行表与表之间的关联;
数据库主键为了优化数据存储(Innodb会生成6个字节的隐含主键) - 根据数据库的类型,考虑主键是否要顺序增长
有些数据库是按主键的顺序逻辑存储的 - 主键的字段类型所占空间要尽可能的小
对于使用聚集索引方式存储的表,每个索引后都会附加主键信息。
避免使用外键约束
- 降低数据导入的效率
- 增加维护成本
- 虽然不建议使用外键约束,但是相关联的列上一定要建立索引
避免使用触发器
- 降低数据导入的效率。
- 可能会出现意想不到的数据异常。
- 使业务逻辑变得复杂。
关于预留字段
- 无法准确的知道预留字段的类型。
- 无法准确的知道预留字段中所存储的内容。
- 后期维护预留字段所要的成本,同增加一个字段所需要的成本是相同的。
- 严禁使用预留字段。
3-8 反范式化表设计
反范式化是针对范式化而言的,在前面介绍了数据库设计的第三范式,所谓的反范式化就是为了性能和读取效率的考虑而适当的对第三范式的要求进行违反,而允许存在少量的数据冗余,换句话来说反范式化就是使用空间来换取时间。






为什么反范式化
- 减少表的关联数量
- 增加数据的读取效率
- 反范式化一定要适度

浙公网安备 33010602011771号