数据库–典型场景表设计
配置表设计
通过配置表,可以灵活的实现对某些业务场景的配置。比如:开发中某些经常变更的参数值,使用配置。如 订单30分钟后失效,需求变更,要改为15分钟,那么直接改配置表内容就行,不用发版。某些关键的容易出错的逻辑,加上一个开关,比如: config_value 为 0或1,为1表示开,为0表示关。不需要的逻辑,可以及时用开关关掉。或者是逻辑复杂,开发环境造数据麻烦时,也可以用配置表配置开关,把前置条件关掉,方便验证数据。或者通过配置表实现各场景下的处理器组合(即各种职责链)等。
配置表单表设计
1 2 3 4 5 6 7 8 9 10 11
| CREATE TABLE `xxx_config` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `config_key` varchar(128) NOT NULL COMMENT '配置的KEY', `config_value` varchar(2000) DEFAULT '' COMMENT '配置值', `remark` varchar(100) DEFAULT '' COMMENT '描述', `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0-不可用;1-可用', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_config_key` (`config_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx配置表';
|
根据实际的业务场景,配置的粒度可以控制,一个配置可以拆分为多个config_key
、config_value
,也可以使用一个配置,将配置值封装为一个JSON字符串。
通用配置表设计
通用的配置表设计,有一张配置字典表,字典表中记录各项配置的信息,另一张是配置信息表,记录着具体场景的配置值。
字典表的内容可以按照实际的业务增加更通用的字段,比如记录日志,是否需要权限校验等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| CREATE TABLE `xxx_config_dic` ( `id` varchar(64) NOT NULL COMMENT '主键id', `config_key` varchar(32) NOT NULL COMMENT '配置名称,不能重复,唯一确定一项配置', `config_type` varchar(8) NOT NULL COMMENT '配置类型', `config_desc` varchar(128) DEFAULT NULL COMMENT '配置说明', `default_value` varchar(256) NOT NULL COMMENT '配置的默认值', `check_rule` varchar(256) DEFAULT NULL COMMENT '校验配置项值的规则', `permission_enable` tinyint(4) DEFAULT '0' COMMENT '是否要校验权限', `operation_log` varchar(128) DEFAULT NULL COMMENT '是否需要按该字段的内容日志', `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0-不可用;1-可用', `create_time` bigint(20) unsigned NOT NULL COMMENT '创建时间(单位:毫秒)', `update_time` BIGINT(20) DEFAULT NULL COMMENT '更新时间(单位:毫秒)', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx配置字典表';
|
1 2 3 4 5 6 7 8 9
| CREATE TABLE `xxx_config_info` ( `id` varchar(64) NOT NULL COMMENT '主键id', `config_id` varchar(64) NOT NULL COMMENT 'config_dic表主键id', `config_value` varchar(256) NOT NULL COMMENT '配置值', `create_time` BIGINT(20) unsigned NOT NULL COMMENT '创建时间(单位:毫秒)', `update_time` BIGINT(20) unsigned NOT NULL COMMENT '更新时间(单位:毫秒)', PRIMARY KEY (`id`), KEY `idx_ccftenant_config_info_user_id` (`user_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx配置信息表';
|
基础数据表设计
也可以称为 素材表。这种表结构变化少,新增、更改、删除不频繁。常见的比如:全国省市、模板、等等。
以省市区这种树结构的级联信息为例,可以设计 3 张表,然后分别进行关联,也可以设计一张表,会更加简洁。
3张表的设计:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| // 省表 CREATE TABLE `province` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(6) NOT NULL, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
// 市表 CREATE TABLE `city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(6) NOT NULL, `name` varchar(20) NOT NULL, `provincecode` varchar(6) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=343 DEFAULT CHARSET=utf8;
// 县,区表 CREATE TABLE `area` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(6) NOT NULL, `name` varchar(20) NOT NULL, `citycode` varchar(6) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3145 DEFAULT CHARSET=utf8;
|
这样是没问题的,换成一张表设计,如下:
1 2 3 4 5 6 7 8 9
| CREATE TABLE `region` ( `region_id` varchar(10) NOT NULL COMMENT '地区主键编号', `region_name` varchar(50) NOT NULL COMMENT '地区名称', `region_short_name` varchar(10) DEFAULT NULL COMMENT '地区缩写', `region_code` varchar(20) DEFAULT NULL COMMENT '行政地区编号', `region_parent_id` varchar(10) DEFAULT NULL COMMENT '地区父id', `region_level` int(2) DEFAULT NULL COMMENT '地区级别 1-省、自治区、直辖市 2-地级市、地区、自治州、盟 3-市辖区、县级市、县', PRIMARY KEY (`region_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区表';
|
通过 region_level
这个字段来增加了数据的一个维度信息,就表达一条数据的信息,然后通过 region_parent_id
来表达关联关系,这样一张表就能表达出来了,这样做查询的时候,一张表就把所有信息查出来了,方便不少。
这种设计用在基础数据设计上是非常方便的,但是不适合用在增、删、改频繁的业务场景。
参考文档:
java业务开发常用的配置表及代码
一种通用配置业务设计方式