先说说为什么设计表很重要,抽象这两个字经常出现在招聘的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时,就没有什么业务含义。另外电商中常见的订单表,订单号中一般会包含下单的时间,这便于查看,看到订单号就知道是什么时候的订单,不需要查询数据库。
那么什么时候可以不用定义业务主键,用自增主键。假设场景是记录用户每天第一次登录的时间,此时这个记录表结构单一,只与用户表有关联关系,与其他表都没关系,此时可以不定义业务主键。
总之我觉得大部分情况下还是考虑业务场景,其实大部分公司的数据量都没有到要考虑性能的地步,一个字段的写入并不会影响太多的性能。
这类时间是可以考虑使用的,好处有以下几点:
当然有一些特殊场景建议不要用默认时间函数: