SQL数据库设计(二) -- 物理设计
今天主要介绍数据库设计的物理设计,上一篇文章已经讲了,数据库设计的需求分析和逻辑设计,如果你没有看到,请点击下面的连接:SQL数据库设计(一)—需求分析与逻辑设计物理设计根据数据库自身的特点把逻辑设计转换成物理设计。1.选择合适的数据库管理系统常见的数据库系统以MySQL为例,介绍存储引擎存储引擎事务锁粒度主要应用忌用MyISAM(mysql5.5以下
今天主要介绍数据库设计的物理设计,上一篇文章已经讲了,数据库设计的需求分析和逻辑设计,如果你没有看到,请点击下面的连接:
SQL数据库设计(一)—需求分析与逻辑设计
物理设计
根据数据库自身的特点把逻辑设计转换成物理设计。
1.选择合适的数据库管理系统
常见的数据库系统
以MySQL为例,介绍存储引擎
存储引擎 | 事务 | 锁粒度 | 主要应用 | 忌用 |
---|---|---|---|---|
MyISAM(mysql5.5以下默认) | 不支持 | 支持并发插入的表级锁 | Select多 Insert少 | 读写操作频繁 |
MRG_MyISAM | 不支持 | 支持并发插入的表级锁 | 分段归档,数据仓库 | 全局查找过多的场景 |
Innodb(5.5以上默认) | 支持 | 支持MVCC的行级锁 | 事务处理 | 无 |
Archive(日志系统) | 不支持 | 行级锁 | 日志记录,只支持insert,select | 需要随机读取,更新,删除 |
Ndb cluster(MySQL集群使用) | 支持 | 行级锁 | 高可用性 | 大部分应用 |
2.定义数据库,表及字段的命名规范
所有对象的命名应该遵循下面原则
1.可读性原则(使用大写和小写结合的方式来格式化库对象的名字已获得良好的可读性.)
2.表意性原则(对象的名字应该能描述他所标示的对象.)
3.长名原则(尽量不要使用缩写)
3.根据DBMS系统选择合适的字段类型
字段类型的选择原则:
列的数据类型一方面影响数据存储空间的开销,另一方面也会影响数据查询的性能.
当一个列可以选择多种数据类型时,优先考虑数字类型,其次是日期或二进制类型,最后是字符类型.
对于相同级别的数据类型,应该优先选择占用空间小的数据类型.**
mysql的字段类型
char 与varchar的选择原则:
如果列中要存储的数据差不多长度,则选择char,否则考虑varchar
如果列中最大数据长度小于50Byte,则一般考虑使用char
一般不宜定义大于50byte的char类型列
decimal和float选择原则:
1.decimal用于存储精确数据,而float只能用于存储非精确数据
2.由于float的存储开销比decimal小,所以优先选择float数据类型
如何存储时间类型:
1.使用int存储时间字段 优点:字段长度比datetime小;缺点:使用不方便,要进行函数转换(并且有时间上限)
2.根据时间粒度,选择不同的日期类型
不同数据类型的比较原则
- 在对数据进行比较(查询,join,排序)操作时,同样的数据,字符处理往往比数字处理慢.
- 在数据库中,数据处理以页为单位,列的长度越小,利于性能的提升.
如何选择主键:
1.区分业务主键和数据库主键
业务主键用于标示业务数据,进行表与表之间的关联;
数据库主键用于优化数据存储.(Innodb会生成6个字节得到隐含主键)
2.根据数据库类型,考虑主键是否要顺序增长.
有些数据库是按照主键的顺序逻辑存储的.
3.主键的字段类型所占空间要尽可能的小
对于使用聚集索引方式存储的表,每个索引后都会附加主键信息.
避免使用外键约束
1. 降低数据导入的效率.
2.增加维护成本.
3.虽然不建议使用外键约束,但相关联列上一定要建上索引.
避免使用触发器
1.降低数据导入的效率.
2.出现不可预料的数据异常
3.使业务逻辑变得复杂
4.反范式化设计。
为了性能和读取效率的考虑,适当的对第三范式的要求进行违反,而允许存在少量的数据冗余.
当数据库以读为主时,可以适度进行反范式化,提高读取效率.
使用空间换取时间.
反范式化设计举例:
这个数数据库完全符合第三范式,但是查询时需要联结大量的表,导致读取效率偏低.
为了提高读取效率,我们适当的增加一下冗余字段,可以有效的减少联结表的个数,提高读取效率.
使用反范式化得好处 :
- 减少表的关联数量
- 增加数据的读取效率
- 反范式化一定要适度
物理设计就介绍到这里了,明天讲下索引优化,结束数据库设计.
更多推荐
所有评论(0)