MySQL 通用数据字典采用“dict_type + dict_item”双表结构,统一管理各类业务枚举值;主表定义类型(type_code、type_name 等),项表存储键值对(item_key/item_value),通过 type_code 关联,支持排序、启用控制与高效查询。

MySQL 中实现通用数据字典功能,核心是用一张“字典主表 + 字典项表”的结构替代大量硬 编码 或重复建表,兼顾灵活性、可维护性和查询效率。不推荐为每个业务字段单独建字典表(如 sex_dict、status_dict),而应统一抽象,避免碎片化。
字典主表(dict_type):定义字典分类
用于管理所有字典类型,如“用户状态”、“订单来源”、“性别”等,每条记录代表一类取值集合。
- type_code:唯一标识,建议用小写英文 + 下划线(如
user_status、order_source),程序中直接引用,避免中文或空格 - type_name:显示名称,供后台管理页面展示(如“用户状态”)
- remark:可选说明,比如“0- 禁用,1- 启用,2- 待审核”
- enabled:是否启用(tinyint(1)),便于动态开关某类字典
- sort_order:排序权重,用于 前端 下拉框顺序控制
字典项表(dict_item):存储具体 键值对
存放每个字典类型下的实际选项,与主表通过外键关联。
- type_code:关联
dict_type.type_code,不建议用外键约束(避免删除主类时级联风险,业务层控制更稳妥) - item_key:业务值,通常是数字或短字符串(如
1、active),对应数据库字段实际存的值 - item_value:显示文本(如“启用”、“活跃”),前端下拉、列表展示用
- is_default:是否默认项(tinyint(1)),方便初始化或兜底逻辑
- sort_order:该项在同类中的排序,比 type 级排序更细粒度
- enabled:该项是否可用(例如“已废弃”的状态项可设为 false,不影响历史数据)
常用查询与使用方式
业务代码中查字典,通常只需根据 type_code 和 item_key 获取文本;管理端则按 type_code 拉取全部有效项。
- 查单个值的显示名:
SELECT item_value FROM dict_item WHERE type_code = 'user_status' AND item_key = '1' AND enabled = 1 - 查某类全部可用项(带排序):
SELECT item_key, item_value FROM dict_item WHERE type_code = 'order_source' AND enabled = 1 ORDER BY sort_order, item_key - 连表查业务数据 + 字典文本(如查用户列表并显示状态中文):
SELECT u.id, u.name, d.item_value AS status_text<br> FROM user u<br> LEFT JOIN dict_item d ON u.status = d.item_key AND d.type_code = 'user_status' AND d.enabled = 1
增强实用性的小技巧
- 加唯一联合索引:
(type_code, item_key)防止重复录入;(type_code, enabled, sort_order)加速常用查询 - item_key 类型建议统一为
VARCHAR(50),兼容数字、字母、短编码(如WX、ALIPAY),避免 INT 限制扩展性 - 支持 多语言?可在 dict_item 加
lang字段(如zh-CN、en-US),按需扩展,初期可不加 - 缓存建议:应用层对全量字典(按 type_code 分组)做本地缓存(如 Caffeine),更新时清对应 key,减少 DB 查询压力






























