2019-04-03

开发OJ之数据库表设计

因为数据库的表结构涉及到接下来的所有开发,前前后后已经想了很久了,还是尽快决定下来。

规范

MySQL表设计大致遵循 阿里巴巴Java开发手册,但做出了以下改变:

  1. 数据表名使用复数形式。
  2. 长字段定义:大于2048字节,如有同属于一个表内的长字段且逻辑上有一定关联,会被独立出来并归并到另外一个的表里,否则单独列为一个表,禁止索引任何大字段!
  3. 使用created_at, updated_at TIMESTAMP 替代gmt_create, gmt_modified DATETIME (嗯,我不管2038问题,这是MySQL管的Orz
  4. 不允许使用NULL,包括deleted_at这种字段,如果nullable字段与其他字段建立Unique关系,会出现可重复问题
  5. updated_at 字段 默认值使用 CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  6. deleted_at 字段 默认值使用 0
  7. 除 updated_at, deleted_at 字段外,其余TIMESTAMP字段默认值使用 CURRENT_TIMESTAMP
  8. ip储存为varchar(40),我认为IPv6没那么容易用完。

总览

适当冗余和反范式,以减少查询复杂度。

所有文件位于GITHUB

选择带外键的来阐述设计想法,以及本地开发使用,但不建用于生产环境。

不带外键的 sql 中删去了部分外键所带来的不必要的索引。

请查看 GITHUB **

-- EOF --

comments

如果无法加载 请将 disqus.com | disquscdn.com 加入代理