数据库设计(二)之物理设计

物理设计要做什么

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

Oracle、SqlServer、MySql及PgSQL

  • 版权、成本考虑:

数据库设计(二)之物理设计_第1张图片

  • 功能上的考虑:

Oracle:业界内比较好的一种DBMS,性能很高,是适合大的事务操作。

  • 操作系统上的考虑:

SqlServerL只支持Windows系统下

Oracle、MySql及PgSQL:可支持linux系统、windows系统

  • 开发语言上的考虑:

如果使用.net开发语言,使用SQLServer比较好

  • 应用场景上的考虑:

mysql及PgSQL适用于互联网项目

Oracle、SqlServer适用于企业级项目(Oracle,如电信级、金融类,因为扩展性好,安全性高,SqlServer:中小型企业的erp)

介绍Mysql常用的存储引擎

数据库设计(二)之物理设计_第2张图片

 

二、定义数据库、表及字段的命名规范

所有对象命名原则:

1.可读性原则

 注意:大小写命名(驼峰),有的DBMS对大小写比较敏感,比如Mysql

2.表意性原则

对象的名字应该能够描述它所标识的对象。

例如:表名,可以体现存储的数据内容

          对于存储过程,存储过程名称应该体现存储过程的功能

3.长名原则

尽可能少使用或者不使用缩写。

适用于数据库DB名之外的任一对象

数据库设计(二)之物理设计_第3张图片

这样的命名,当只看表名、字段名,完全不知道该表是干什么的。在开发和后期运维时,可读性很差,需要完全依赖手册。

三.根据所选的DBMS系统选择合适的字段类型

 列的数据类型的选择:1.会影响数据存储空间的开销,2.影响数据查询的性能

字段类型选择的原则:

 当某列可以选择多种数据类型时,应优先考虑数字类型,其次是日期或二进制类型,最后是字符类型

对于相同级别的数据类型,应优先选择占用空间小的数据类型

 数据库设计(二)之物理设计_第4张图片

 Mysql在MySQL内部使用4个字节INT类型来存放时间戳数据,时间戳类型,只能存储到2038年,因为现在已经2020年了,还是慎用哈。同理,int类型来存储时间也要慎用!

 以上原则主要从下面两个角度考虑:

1.在对数据进行比较时(查询条件、join条件及排序)等操作时:同样的数据,字符处理往往比数字处理慢

 2.在数据库中,数据处理以页为单位,列的长度越小,利于性能提升

数据库如何具体选字段类型:

  •  char与varchar如何选择?

1.如果列中要存储的数据长度差不多一致的,应考虑用char;否则应该考虑用varchar 。如:身份证号,手机号

2.如果列中最大数据长度小于50Byte,则一般也考虑char(如果该列很少用,则基于节省空间和减少I/O的考虑,还是选择用varchar)

3.一般不宜定义大于50Byte的char类型列。(差不多15个字符)

  • decimal与float如何选择

 1.decimal用于存储精确数据,二float只能用于存储非精确数据。

2.由于float的存储空间开销一般比decimal小,故非精确数据优先选择float类型

  • 时间类型如何存储

1.使用int来存储时间字段的优缺点

优点:字段长度比detetime小

缺点:使用不方便,要进行函数转换

限制:只能存储到2038-01-19 11:14:07,因为2^32为2147483648

2.需要存储的时间粒度 

年、月、日、小时、分、秒、周

四、数据库设计其他注意事项:

1.如何选择主键

数据库设计(二)之物理设计_第5张图片

2.避免使用外键约束

  •  降低数据导入的效率,高并发环境影响很严重
  • 增加维护成本
  • 隋然不建议使用外键约束,但是相关联的列上一定要建立索引

3.避免使用触发器

1.降低数据导入的效率

2.可能会出现意想不到的数据异常,尤其遇到业务需求变更

3.使业务逻辑变得复杂 

4.关于预留字段

 1.无法准确知道预留字段的类型。

2.无法准确的知道预留字段中所存储的内容

3.后期维护预留字段所要的成本,通增加一个字段所需要的成本是相同的

4.严禁使用预留字段

 

五.反范式化设计

 为了性能和读取效率的考虑,适当对第三范式的要求进行违反,而允许存在少量的数据冗余。以空间换时间。

 数据库设计(二)之物理设计_第6张图片

数据库设计(二)之物理设计_第7张图片

数据库设计(二)之物理设计_第8张图片

数据库设计(二)之物理设计_第9张图片

为什么反范式化

1.减少表的关联数量

2.增加数据的读取效率

3、反范式化设计一定要适度

 

你可能感兴趣的:(☆数据库)