数据库–典型场景表设计


配置表设计

通过配置表,可以灵活的实现对某些业务场景的配置。比如:开发中某些经常变更的参数值,使用配置。如 订单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_keyconfig_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业务开发常用的配置表及代码

一种通用配置业务设计方式