无论什么web编程,还是应用开发,都离不开数据库,数据库是数据存储的中心,缺了数据,编程就无从谈起。

有些项目团队有专门的DB工程师,来负责数据库的设计与优化,有些项目没有专门的DB人员,是由开发人员一同设计了,今天聊一聊数据库设计中一些经验与原则(以MySql为例)。

数据库设计文档,这个一定得有,得详细记录每个表是干什么的,每个字段的类型、名称、长度及备注说明。

设计原则

  • 单表字段数量尽可能控制在50个以内,如果比较多,考虑拆分表。比如交易表存储的字段比较多,可以拆分为tb_trade,tb_trade_status 一个代表交易表,一个代表交易状态表。
  • 按常规存储与经常更新存储拆分表,比如用户表可以拆分为tb_user,tb_user_data,一个保存用户常规表,这里面数据一般不会变动更新,一个是更新比较频繁表单独保存。
  • 尽可能不使用text类型,如果非用不可,也不经常有,建议拆表,把text字段的单独建一张表。
  • 如果有自定义字段表,建议拆表,把自定义字段表单独建一张表。
  • 字段类型用尽量小的存储空间来存一个字段的数据;能用int,就不用varchar,能用varchar(40)就不用varchar(255)。比如IP地址等。
  • 字段类型固定长度的最好使用char,比如城市编码,邮编等等。
  • 字段类型能使用tinyint就不用smallint,int,如果业务上不出现负数,就限制不允许负数,这样可以把最大值扩大一倍。
  • 字段可以设置默认值就设置一个默认值,能不允许为空就不能为空。
  • 字段枚举值之间预留一些值便于后续扩展,比如交易状态表0代表关闭,5代表待付款,10代表已付款,15代表已经发货,20代表已经收货等。#说明#这样做的好处是便于后续扩展,万一后续业务需求,多出一个状态值,可以很容易的定义。
  • 每个表创建一个递增主键id索引(原因可以查查innodb的索引原理就明白了)。
  • 如果有业务单号字段,在单号上创建unique索引。
  • 合理使用索引,不是越多越好。
  • 每个表保留created_at,updated_at,分别保留创建时间,最后更新时间#说明#为后续的API接口开发预留,因为后续接口是需要抓取增量数据的,全是依靠updated_at来完成的。
  • 数据一经产生,不能删除,可以考虑用一个字段标识是否删除,比如is_deleted#说明#一则为了数据完整性,后续可查。再则如果有API接口,数据删除后,第三方系统只能傻傻的认为数据还存在,就不可能保证数据一致性了。
  • 尽可能的满足数据库范式要求,但适当冗余保存一些字段也是可以的。#说明#适当保存一些冗余方便后续的查询,再者有些数据具有及时性,只代表数据产生那一刻的数据,比如交易明细中商品就是明显的代表。
  • 不要使用存储过程,如果是mssql可以使用,但要注意存储过程的编写方法,后续会写到。
  • 合理使用事务,把一些条件及判断,尽可能在事务开始之前完成,避免事务占用时间过长导致堵塞。



access拆分表多个表 access 拆分表_数据


数据库命名原则

数据库命名

  • 采用英文字母、下划线、数字;
  • 命名要简洁易懂,不要过长。如user_db,weixin_db,trade_db,当然也可以直接为user,weixin,trade等等;
  • 除非是一些分库或备份库,可以加0-9的自然数,如user_db_202012,除此之外,不要使用数字#说明#数字一般代表的是序号,日期等,便于理解,除此之外,没有什么意义,加上了有些画蛇添足的味道。

表名命名

  • 采用26个英文字母(区分大小写)、0-9数字、下划线"_"组成;
  • 命名简洁易懂,多个单词之间用下划线分隔,如user_log#说明#不建议使用驼峰法,如userLog,因为有些数据库是区分大小写的,userlog,userLog代表不同的表,如果在开发中不小心把userLog写成了userlog就会出现异常,没必要给项目挖坑。更不建议直接使用userlog,这种写法不便于读。
  • 建议系统表使用统一前缀,比如tb_user_log,tb_trade等#说明#使用前缀的好处是,一则查看的时候会自动排序,把相同的一类排在一块,再者一看就知道是系统表,不能轻易动,后续在使用过程中,可能会出现一些临时表,测试表等,这些表在用完后是需要删除的,也许在使用后暂时忘记了处理,回关一看就知道是什么用途。
  • 相同业务类型的使用统一前缀,比如tb_user,tb_user_data,tb_user_log等等#说明#这样做的好处是便于查看。

字段命名

  • 采用26个英文字母、下划线、0-9自然数(如不需要尽量不用)
  • 命名简洁易懂,多个单词之间用下划线分隔;#说明#不建议使用驼峰法,比如fName,原因上述已经说明了。
  • 不要使用关键字冲突字段,比如sum,distinct等等,有些项目在字段名上统一加上了前缀f_,比如f_name,f_mobile等,其实这样做的目的就是防止与关键字冲突了,可以根据个人喜好是否统一加前缀。