数据库设计的一般性原则

    数据库是任何系统的底层基石,是直接关系互联网项目性能的最重要指标。

   作为影响项目性能的瓶颈所在,尤其体现在关系型数据库。

    性能来源于设计,而不是优化。

    以下设计原则适用mysql数据库

根据以往的经验和对数据库的一些了解,总结一些数据库设计的一般性原则,以供

后期模块设计时参考。

1 命名原则

   数据库表名和列名大小写统一,为了便于快速识别,最好统一使用小写,单词之间使用下划线连接。

   

2 范式设计

   数据库结构设计不需要严格遵循三范式,适当的使用冗余会降低表的复杂度。尤其是现在存储硬件价格非常便宜的时期。

   

3 分表原则

   在设计表的时候,如果对关系型数据库了解不到位,存储原理知识的缺失会导致表的大小字段混乱。

   由于其存储特性,最好将大字段(text,blob等)与小字段分开存储。

   

4 列的数据类型

   由于数据库会对服务器和网络造成严重的内存和IO消耗,再加上数据库的预读、多次写等特性,在对业务需要充分了解的

   基础上尽可能的使用小字段。如tinyint 能满足需求尽可能不使用smallint,smallint能满足尽可能不使用int.

5 字段默认值

   基于数据库存储特性,数据库设计初期,最好根据需要,尽可能的填充字段默认值,避免出现NULL

 

6 主键索引

   主键索引作为数据库最重要的索引数据,往往与性能直接挂钩。主键索引尽可能使用数值类型,避免出现UUID或者字符类型。

   

7 普通索引设计

   普通索引包括唯一性索引和普通索引。

   这一类的索引设计,尽可能的选取选择性高的列作为索引。避免出现重复度过高的列作为索引。

   索引列的选取,最好考虑当其出现在where条件和order by 字段以及join on 之后的那系列。

   原则上单表不允许出现过多的索引列,考虑使用组合索引。

   

8 数据库注释

   考虑到现在pojo都是使用生成器直接生成,因此需要给表和字段添加相应注释。

   

9 存储引擎的选取

   mysql 最常用的引擎包含InnoDB和MyIsAM,

   5.0版本之前,包含事务的表考虑使用InnoDB,不包含事务的表使用MyISAM,

   5.0版本之后,优先考虑使用InnoDB.

   

10 特殊性字段

   考虑到随着业务的发展,系统往往需要考虑数据迁移,数据源多元化等,需要尽可能避免具有唯一性特性的字段。

   例如mssql中的timestamp。

   

11 外键

    互联网项目应尽可能的剔除外键。

12 数据库计算

    数据库擅长存储与索引数据,尽可能的避免数据库计算,可通过其他设计避免出现数据库计算。

13 内置代码

    mysql 的内置代码功能虽然在5.5版本的发布之后得到很大提升,但是就性能来说与PL-SQL的差距仍然非常巨大。

所以尽可能避免触发器、视图、过程的设计。这也为项目后期可能出现的数据迁移提供条件。

14 冷热数据分离

    数据库设计初期,应尽可能的熟悉业务需要,将冷热数据彻底分离,为数据预热加速提供条件,同时可以提高系统加载效率。

15 数据库扩展

    数据库设计应充分考虑后期扩展,考虑设计上的开闭原则

记录出现被标记状态的情况下,应根据业务需要以及在可预期的时间范围内数据规模考虑是否需要

将不同状态的数据分别存储。

16 json字段考虑

    mysql5之后 加入了存储json格式的技术,在设计时应充分考虑,避免将json字符串直接作为varchar存储。

17 排序规则

    在设计初期,必须注意到当字段为字符类型时期排序规则的选取。utf_bin 表示二进制,大小写区别对待,

utf_general_ci 大小写不敏感,但是比较速度较快,正确性稍差,

utf8_unicode_ci 表示支持扩展,即当把一个字母看作与其它字母组合相等时。体现在使用其他国家语言时。

简单描述

utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。

utf8_general_ci校对速度快,但准确度稍差。

utf8_unicode_ci准确度高,但校对速度稍慢

18 分区

   分表分库的设计,虽然一定程度可以解决数据库的瓶颈问题,但是同时也带来一系列的重大难题,例如事务分布的考虑,

   分表规则、数据分页、数据维护与迁移等等。

   mysql5 之后的版本允许对表进行分区设计。将数据库文件物理分布。

   

猜你喜欢

转载自annan211.iteye.com/blog/2328771