阿里巴巴是 MySQL 数据库 的老用户了,并且阿里巴巴自己还开发 开源了 MySQL 的 一个分支 AliSQL
对于阿里巴巴编写的关于 MySQL 数据库 制表 的 规范很有学习价值!
以下是我的一些心得体会
阿里巴巴要求
>>表示 是非 状态 的 字段 字段名 需是 is_xxx 这样 ,这个字段的类型 是 unsigned tinyint 值 1代表'是',0 代表 '否';
本来
*表的字段类型选择=>要求是性能尽量好,占用空间尽量小
优先选用: int -> date time -> enum -> char -> vchar -> text
这里我自己以前喜欢用枚举类型,嘻嘻;
详解 unsigned tinyint 类型
这个数据类型 是 表示 这个数的范围是 非负 的,输入负数 MySQL 会抱错,
将一个字段的 数据类型 设为 unsigned tinyint 可以通过 SQLyog 小海豚的 可视化工具操作,
也可以通过SQL 语句 这样 设置
ALTER TABLE t_food ADD ( age TINYINT UNSIGNED DEFAULT NULL COMMENT '备注');
>>表名 必须使用 小写字母 或 数字 , 字段名 必须使用 小写字母 或 数字 或 下划线
禁止出现 数字开头,禁止两个下划线中间出现数字;
说明:MySQL 在 Windows 下 不区分 大小写,但是 在 Linux 下 默认 是 区分大小写;
>>表名 不使用 复数 名称
比如表达 食物 就用 food 不要用 foods
>>禁用保留词 ,如 desc / range / match/ delayed 等等,请参考MySQL 官方保留词;
>>索引名 命名 规范 主键索引:pk_字段名;唯一索引:uk_字段名 ;普通索引: idx_字段名;
>>小数 类型 阿里巴巴 的要求是 用 decimal 类型 做存储, 禁止 float 或 double
因为他俩 存储 小数的时候存在精度损失,
这是二进制存 十进制小数不可避免的问题,decimal 不会精度损失是底层用字符串存的小数;
我的理解是根据实际业务需要来,小数存储精度越高,存储空间越大,所以根据自己的精度需要选择小数的存储类型;
>>如果存储的字符串长度特别接近,使用char 定长字符串,
这个算基本常识了,varchar 与 char 的区别 就不赘述了,不考虑业务情景,char的性能更好;
>>如果存储的 某字段 的值是 文字 ,文字长度超过5000,则定义数据类型是 text,并且与主键对应独立出来做一张
表,避免影响其他字段索引效率;
>>一张表 必备的 三个字段 id (这个不用多说), gmt_create(表示某条数据的创建的时间,数据类型是 datetime), gmt_modified(表示某字段的修改时间,数据类型是 datetime);
阿里巴巴的 推荐 规范
>>表名 最好 是 加上 '业务名称_表的作用'
例如:alipay_task trade_config 种种
>>库名 与 应用 名称 尽量一致
>>如果修改字段含义或对字段表示状态的追加时,注意及时更新 字段 的注释
>>字段允许 冗余 ,已提高 查询性能,但必须考虑数据一致. 冗余字段 应遵守:
I 不是频繁修改的字段
II不是varchar超长字段,更不可能是 text 字段
>>单表行数 超过 500 万 行 或者 单表 容量 超过 2GB 才推荐 分库分表;
不过这个阿里的运行环境毕竟是一般人不能比的,所以知道有这个事,具体还是根据自己的情况来;
阿里巴巴提供的一些参考
>> 一些字段设置值的范围
对象 年龄区间 字段类型 字节 表示范围
人 150岁以内 tinyint unsigned 1 无符号 0-255
龟 数百岁 smallint unsigned 2 无符号 0-65535
恐龙化石 数千年 int unsigned 4 无符号 0-约42.9亿
太阳 约50亿年 bigint unsigned 8 无符号 0- 约10的19次方