本文最后更新于:June 30, 2023 pm

本文作者:[wangwenhai] # 概要:本文主要讲如何通过Mysql实现配置常量查字典

1.背景简介

我们在开发过程中,经常会遇到一些枚举常量,例如性别有男女,公司成员有员工和老板等等.诸如此类的场景下,常量就需要统一配置管理了,在WEB系统设计中,一般作为字典形式来使用.说白了就是根据某个key来查value,从而实现枚举效果.

2.数据库设计

接下来我们就设计一个最简单的字典.字典分为项和值,我们分别建表如下:

  1. 字典项表

    CREATE TABLE `ez_dictionary_key` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
      `table_name` varchar(64) DEFAULT NULL COMMENT '表名',
      `name` varchar(200) DEFAULT NULL COMMENT '名称',
      `label` varchar(200) DEFAULT NULL COMMENT '显示的文本',
      `record_version` int(11) NOT NULL DEFAULT '0' COMMENT '记录版本',
      `x` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '删除',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='字典的项';
    
  2. 字典值表

    CREATE TABLE `ez_dictionary_value` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
      `key_id` int(11) DEFAULT NULL,
      `value` varchar(255) DEFAULT NULL COMMENT '名称',
      `label` varchar(255) DEFAULT NULL COMMENT '显示的文本',
      `record_version` int(11) NOT NULL DEFAULT '0' COMMENT '记录版本',
      `x` tinyint(1) unsigned NOT NULL DEFAULT '0',
      `create_time` datetime NOT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='字典的值';
    
  3. 插入记录

    1. 插入一条字典项

      image-20191230143909122

    2. 插入两条字典值.

      image-20191230143929809

3.应用案例

我们如何去用字典查询?接下来用一个小案例来阐述.假设我们的用户帐户有状态如下:

....省略....
`status` int(4) DEFAULT NULL COMMENT '账户状态:正常【1】,冻结【2】,过期【3】'
....省略....

当用户的status字段值不同时,对应不同的文本显示,我们写如下SQL:

SELECT
	A.*, D.label AS `account_status`
FROM
	ez_user AS A
LEFT JOIN (
	SELECT
		B.label,
		B.`value`
	FROM
		ez_dictionary_value B
	WHERE
		B.key_id = (
			SELECT
				C.id
			FROM
				ez_dictionary_key C
			WHERE
				C.table_name = 'ez_user'
			AND C.`name` = 'status'
		)
) AS D ON (A.`status` = D.`value`)

通过匹配,一次性即可显示出所有用户的帐户状态码和文本含义.如果需要查询ID为1的用户的状态,只需要修改上述SQL为下面的即可:

SELECT
	A.id, D.label AS `account_status`
FROM
	ez_user AS A
LEFT JOIN (
	SELECT
		B.label,
		B.`value`
	FROM
		ez_dictionary_value B
	WHERE
		B.key_id = (
			SELECT
				C.id
			FROM
				ez_dictionary_key C
			WHERE
				C.table_name = 'ez_user'
			AND C.`name` = 'status'
		)
) AS D ON (A.`status` = D.`value`)
WHERE
	A.id = 1;

查询结果如下:

image-20191230143238325

4,总结

本文我们学习了一种简单的通过数据库配置常量来实现类似查询字典的形式.


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

EMQX核心连接器-Esockd框架的使用 Previous
Emqx插件开发实战 Next