刚参加工作的表弟问我如何设计一个表

文章目录

      • 以公司表模版为基础,确定表名,固定字段
      • 不要给字段或者表设置字符集
      • 用业务主键还是自增主键
      • 创建时间,更新时间要不要使用数据库默认的时间

表弟能问出这个问题,表哥是吃惊又欣慰。吃惊是年纪轻轻的小伙子竟然知道设计表的重要性,还知道来问表哥,欣慰的是表弟一直在思考,一直在进步!

先说说为什么设计表很重要,抽象这两个字经常出现在招聘的JD里,比如具备抽象能力,实际开发中我们也会听到领导说要设计要抽象,要不以后开发成本很高。而抽象后的映射到数据存储方面就是数据库表的设计,因此从表的设计里就可以看出来一个程序员对于当前业务的理解深度如何,抽象能力如何。接下来就来介绍设计一个表的思路

以公司表模版为基础,确定表名,固定字段

实际开发中,不要自己随便定义表字段名称等,可以先看看其他表是否有共同点,或者问leader有没有建表规范。
比如下面就是一个模版,模版中有几个注意点:

  • 表名,字段名,字段类型全小写,其余大写
  • 每个字段都要有注释
  • 自增主键,业务主键,创建时间,更新时间,逻辑删除为固定字段,每个表都有且字段名一致
CREATE TABLE `xx_xx_xx` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `xx_xx_xx_id` bigint(20) NOT NULL COMMENT '业务主键',
  `xxx_xxx` varchar(32)  NOT NULL COMMENT '业务字段注释',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `is_delete` bigint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标记:0-未删除,1-删除',
  PRIMARY KEY (`id`),
  INDEX(`xxx_xxx`)
) COMMENT='xxx表';

不要给字段或者表设置字符集

一般来说变更数据库的SQL都会像代码一样提交到一个地方进行管理。统一管理的好处是可以溯源,迁移数据库时比较快,假设公司数据库要用阿里云产品切换到腾讯云产品,此时我们只要把同一管理的SQL执行一遍即可。

此时如果给每个字符集设置了字符集,可能就会导致一个同样的建表SQL在阿里云执行成功,在腾讯云执行失败,如果表多会增加很多工作量。

偷偷告诉你,不设置字符集,默认都是UTF-8,这是所有都支持的。

用业务主键还是自增主键

这个取决于表的业务,表是否需要和其他表关联,比如商品SPU表跟SKU表最好定义业务主键。如果不定义业务主键,那么在sku表里关联spu时,就没有什么业务含义。另外电商中常见的订单表,订单号中一般会包含下单的时间,这便于查看,看到订单号就知道是什么时候的订单,不需要查询数据库。

那么什么时候可以不用定义业务主键,用自增主键。假设场景是记录用户每天第一次登录的时间,此时这个记录表结构单一,只与用户表有关联关系,与其他表都没关系,此时可以不定义业务主键。

总之我觉得大部分情况下还是考虑业务场景,其实大部分公司的数据量都没有到要考虑性能的地步,一个字段的写入并不会影响太多的性能。

创建时间,更新时间要不要使用数据库默认的时间

这类时间是可以考虑使用的,好处有以下几点:

  1. 自动时间戳:不需要在代码中写入时间
  2. 减少出错:可以当作默认时间,保证正确

当然有一些特殊场景建议不要用默认时间函数:

  1. 时间需要修改计算
  2. 服务器涉及多个时区

你可能感兴趣的:(MySQL,初级程序员进阶,oracle,数据库)