软件架构与思考

👉 所有文章
高性能 高性能设计模式
数据库 数据库分库分表指南 MySQL 建表参考 MySQL 初始化数据的一些方案 数据版本号
分布式 ID 分布式 ID 生成方案探讨
缓存 缓存 使用数据版本号保证缓存是最新数据 基于redis的二级缓存
微服务 如何实现远程调用 RPC 协议中的数据签名验签和加解密方案探讨 关于服务间调用循环依赖的一些思考 我所理解的负载均衡 一致性哈希 基于Redis的分布式会话管理系统 如何部署服务 灰度发布 如何区分上游和下游 日志级别
算法与协议 一个可扩展的 MQ 消息设计 Dynamo涉及的算法和协议 写时复制
任务分发 Gearman入门 如何使用redis构建异步任务处理程序
安全 关于对账的一些理解 一个简单可靠的 Dubbo 请求/响应数据签名方案
其他 使用卫语句减少 if else 嵌套

MySQL 建表参考


字段和表必须有注释

面向未来设计

比如自增主键,不能是 int,而应该是 bigint unsigned 。

禁止为整数声明显示长度

MySQL: 整型数字 中的讨论。

统一幂等字段类型和大小

在做幂等时候,会使用一个外部ID字段

禁止 NULL

NULL 会破坏唯一性。见 MySQL: 唯一索引与NULL

默认值

默认值不是必须要指定的。

整数默认值设置为 0 。

字符串类型字段默认值为空字符串。

不要使用复杂/包装类型

例如时间字段直接使用 bigint unsigned 存秒级时间戳即可,不要使用 datetime、timestamp 等包装类型。

代码中增加时间戳工具类即可;使用 MySQL客户端运行 SQL 查看数据时,时间字段用 from_unixtime 函数转换成年月日即可。

时间戳字段使用 bigint unsigned

时间戳单位一般使用秒。

为什么不用 int ?

  1. int 最大值是 2147483647,对应 2038-01-19 11:14:07 。这个时间快到了。
  2. int unsigned 最大值是 4294967295,对应 2106-02-07 14:28:15 。
  3. 但是 Java 的 int 最大值是 2147483647 ,所以 Java 对应时间戳的类型应该是 Long。
  4. Java Long 一般对应 MySQL 中的 bigint 或者 bigint unsigned。

必须要有自增主键、创建时间、更新时间字段

状态字段默认值不要有业务含义

例如表中有一个 int 类型的 status 字段,默认为 0 。不要用 0 代表成功或失败。

状态设计方案一:0 初始化,1 成功,2 失败。 其他为非法值。

状态设计方案二:1 初始化,2 成功,3 失败。其他为非法值。

使用 utf8mb4 字符集

小心分库分表下的业务唯一性陷阱

分库分表字段必须在业务唯一性字段中,否则无法保证唯一性。

小心字符集的排序规则

每个字符集有多种排序规则。

utf8mb4 默认的排序规则中,'System''system'、'system    ' 是相等的。


( 本文完 )

文章目录