Mysql 设计规范

1、数据库名字小写、单数、下划线,指定使用utf8字符

CREATE DATABASE dbname  DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

存储emoj表情,使用UTF8mb4

2、表名称小写、单数、下划线,指定使用utf8字符

CREATE TABLE `post_comment` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `post_id` int(11) unsigned NOT NULL COMMENT '文章ID',
  `author` varchar(255) NOT NULL COMMENT '作者',
  `title` varchar(255) NOT NULL COMMENT '标题',
  `content` text NOT NULL COMMENT '评论',
  `status` tinyint(11) NOT NULL DEFAULT '1' COMMENT '1审核、 2审核通过、 3审核失败',
  `create_at` datetime NOT NULL COMMENT '创建时间',
  `update_at` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `post_id` (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章评论'
  • 字段段名称小写、单数、下划线
  • 字段尽量使用 tinyint, 而非 int,并且要有默认值
  • 字段用中文注释、包括表名称注释
  • 每个表带一个自增主键ID,其它业务可设置非自增或者bigint等
  • 全部字段NOT NULL ,而非允许NULL,索引字段字段如果NULL,影响优化器对索引的选择,不能保证有值
  • Engine除非特殊要求,全部为 InnoDB,而非MyISAM
  • 时间类尽量使用int类型,业务要求可设置为datetime或者TIMESTAMP等
  • 使用TINYINT来代替ENUM类型,将字符转化为数字
  • 图片、文件等内容不允许直接存储在数据库,只存文件地址
  • 用户密码等需加密后存储
  • 同一字段在不同表设计的字段类型要一样

3、其它说明

  • 存储过程尽量不用
  • 触发器尽量不用
  • sql语句避免使用临时表
  • 禁止使用外键约束,在程序上面控制约束
  • 临时表名必须以tmp为前缀,并以日期为后缀

4、表数据一致性说明

为了性能考虑,表中设计多余字段,同一个字段值在多张表存储,以空间换时间,这点和mysql本身的设计初衷有出入

5、索引

索引是双刃剑,会增加维护负担,增大IO压力,索引占用空间是成倍增加的,单张表的索引数量控制在5个以内,或不超过表字段个数的20%

https://github.com/lifeibest/guide/blob/master/mysql-%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83.md