数据字典结构设计方法

数据字典(Data dictionary)是描述数据的信息集合,是对系统中使用的所有数据元素的定义的集合。

什么是数据字典

什么是数据字典? 字典的英文是 Dict, 翻译过来是字典、词典。

和字典同类的东西呢,就是 Map。 Map 就是地图、映射的意思。

所以字典的本质就是 映射,对应。

字典一般分为两部分: 名称 和 描述信息。 用计算机术语说,就是 键-值对(Key-Value pair), 名值对、还有 Code-Name 等。

在系统中,因为有很多标准、规范、约定, 为了执行这些规范,对数据分类、数据状态进行精确定位,又或者因为多个系统之间需要进行数据交换,但叫法和显示上有差别,在存储数据时需要存储码值,而不能只存储显示时使用的名称。

例如状态值和状态名称。标准做法是只存储 VALUE, 不存储名称。 如果考虑优化,减少数据表的关联查询(join),那么可以在存储 VALUE 的同时冗余存储 NAME。 当然,需要根据具体情况来设计, 如果 NAME 或者描述信息太长,占用空间较大,那么可能就不会进行冗余。 顺便提一句, 减少空间占用 也是使用数据字典的一个原因。

数据字典作用是什么

在平时开发的过程中,特别是在遇到表单时候,我们经常需要为前端提供一些下拉选项的信息,这时候我们需要为前端提供下拉菜单的信息,让前端进行渲染。同时我们在数据库中存储的只可能是对应的编码。

如果前端直接将value值写死在前端代码中,那么就破坏了低耦合原则,如果未来清查状态有增加或者管理员想要修改,那么需要修改前端代码,会带来非常大的麻烦。

为解决该问题,就需要设计数据字典,其实就是数据库中的一张表。

数据字典的设计

最简设计

名称-值。

通用设计

如果状态、类型都有对应的字典表,那么随着系统规模的扩大,字典表会越来越多,可能200张表里面有30-50个是字典表。 这就很烦人了,这些表的字段都是差不多的。这时候比较好的办法就是合表。合表就会涉及到数据类型和如何区分的问题。

将相似的表结构合并时,添加一个字段来进行区分是常见的做法。数据字典的区分,我们一般使用 分类这个字段。分类的英文单词,大致有: type、class、classify、category 等。因为分类是给系统后台或者程序员看的,所以一般是使用字符串类型(String, VARCHAR(32))。

同时,为了避免再引入一个分类类型说明的表,我们做一点冗余: 使用2个字段: 分类编码(category_code) 和 分类说明(category_desc)。

简单优化

ID、排序

运维审查方便

创建时间、更新时间、创建人、修改人

最终结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE IF NOT EXISTS `dict_common` (
`id` bigint(20) unsigned NOT NULL COMMENT '自增ID',
`dict_code` varchar(64) NOT NULL COMMENT '编码',
`dict_desc` varchar(64) NOT NULL COMMENT '名称',
`category_code` varchar(64) NOT NULL COMMENT '分类编码',
`category_desc` varchar(64) DEFAULT NULL COMMENT '分类说明',
`sort_no` int(8) unsigned NOT NULL DEFAULT '999' COMMENT '排序编号',
`data_type` varchar(64) NOT NULL DEFAULT 'STRING' COMMENT '数据类型',
`remark` varchar(128) DEFAULT NULL COMMENT '附加说明',
`locate_code` varchar(64) DEFAULT NULL COMMENT '检索标识',
`create_id` bigint(20) unsigned DEFAULT '0' COMMENT '创建人ID',
`update_id` bigint(20) unsigned DEFAULT '0' COMMENT '修改人ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`version` int(8) NOT NULL DEFAULT '0' COMMENT '乐观锁版本号',
PRIMARY KEY (`id`),
UNIQUE KEY `dict_code_category_code` (`dict_code`,`category_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='通用数据字典';

参考链接

  1. 通用数据字典表结构设计,by Jessicahust.
  2. 数据库设计之数据字典的使用与设计,by 沉默终止.
  3. 数据字典,by baidu.