数据字典(DD)
1. 什么是数据字典
数据字典是描述数据的信息集合,是对系统中使用的所有数据元素的定义的集合。通常一般用户是无法修改数据字典的,只有程序维护人员有编辑、修改数据字典的权限
在开发的程序中,数据字典可以帮助开发人员理解各个数据项目的类型、数值和它们与现实世界中的对象的关系。
例如:
下面这些具有相同类型的配置项,配置到系统的数据字典表中,方便系统维护,由超级管理员统一在后台进行数据字典维护,如果用户需求要增加变更配置项,只需要修改数据字典表记录即可,不需要修改代码。
又或者说:
比如在系统中某些选项是几个特定的值的一个或多个,并且随着发展还可以动态添加。比如支付方式,配送方式等。此时就可以考虑设计数据字典表。在后台进行管理,然后前台要从后端查询。
主动数据字典:指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。
被动数据字典:指修改时必须手工更新其内容的数据字典。
1.1 建立数据字典的目的
- 提高开发效率,降低研制成本。数据字典是数据库开发者、数据监管人和用户之间的共同约定,是系统说明书的一个重要组成部分。一个统一的数据字典有助于开发者建立数据模型以及程序和数据库之间的数据转换接口,为规范化设计和实施数据管理系统铺平了道路。
- 促进数据共享,提高数据的使用效率。通过数据字典,用户可以方便地知道每项数据的意义,了解数据的来源和使用方法,从而帮助用户迅速地找到所需的信息,并按照正确的方法使用数据。
- 控制数据的使用。在某些特定的场合,可以通过对数据字典的控制达到控制数据使用的目的。
2. 如何设计数据字典
- 方式一:在java文件中定义数据字典项
把应用中遇到的数据字典项都定义到一个java文件中,这是最常用的方法,实现起来比较简单,但维护起来就非常繁琐,特别是数据字典项比较多的情况下,相应的java文件就会比较大,一旦数据字典项有更新那么维护起来就比较费时费力。
在java文件中定义数据字典项通常情况下定义为static,好处是可以通过类名直接调用。
举例:
类ReportConstants中定义了以下数据字典项。
public static final int CODE_USERINF_TECHELEVEL_GJ = 1;
public static final String CODE_USERINF_TECHELEVEL_GJ_KEY = "高级";
public static final int CODE_USERINF_TECHELEVEL_ZJ = 2;
public static final String CODE_USERINF_TECHELEVEL_ZJ_KEY = "中级";
public static final int CODE_USERINF_TECHELEVEL_CJ = 3;
public static final String CODE_USERINF_TECHELEVEL_CJ_KEY = "初级";
public static final int CODE_USERINF_TECHELEVEL_WJ = 4;
public static final String CODE_USERINF_TECHELEVEL_WJ_KEY = "无职称";
那么我们在实现中就可以直接引用相应的数据字典项编码及名称,另外,一般情况下需要定义数据字典项编码和名称的转换方法,比如:
public static String getCodeName(int lCode){
//初始化返回值
String strReturn = "未知";
switch (lCode){
case CODE_USERINF_TECHELEVEL_GJ :
strReturn = CODE_USERINF_TECHELEVEL_GJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_ZJ :
strReturn = CODE_USERINF_TECHELEVEL_ZJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_CJ :
strReturn = CODE_USERINF_TECHELEVEL_CJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_WJ :
strReturn = CODE_USERINF_TECHELEVEL_WJ_KEY;
break;
}
return strReturn;
}
这个方法实现了通过数据字典项编码获得数据字典项名称的功能。那么还需要实现一个对应的方法,getCodeByName(String name),即通过数据字典项名称获取数据字典项编码功能(代码这里省略)。这样就可以实现数据字典项编码和名称的相互转换啦。
★★★★但是一旦出现数据字典项名称或编码需要更改(“无职称”项编码需要由“4”改为“0”),或增加减少数据字典项,都需要更新java文件代码。★★★★
- 方式二:在xml文件中定义(繁琐,不介绍)
- 方式三:使用数据库表
方案一:使用一张表
参考【讲了每个字段的意义】:https://github.com/Jessicahust/translation/blob/master/tiemao_2016/03_dict_table_design/03_dict_table_design.md
个人认为比较通用的设计字典表:
或者
CREATE TABLE `data_dictionary` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`code` varchar(36) COLLATE utf8mb4_bin NOT NULL COMMENT '编码',
`name` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名字',
`code_type` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '编码类型',
`desc` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述',
`parent_id` int(11) DEFAULT NULL COMMENT '父ID',
`status` int(2) DEFAULT NULL COMMENT '状态 0禁用 1使用',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
或者【来源尚衣通项目】
parent_id:上级id,通过id与parent_id构建上下级关系,例如:我们要获取所有行业数据,那么只需要查询parent_id=20000的数据。
name:名称,例如:填写用户信息,我们要select标签选择民族,“汉族”就是数据字典的名称。
value:值,例如:填写用户信息,我们要select标签选择民族,“1”(汉族的标识)就是数据字典的值。
dict_code:编码,编码是我们自定义的,全局唯一,例如:我们要获取行业数据,我们可以通过parent_id获取,但是parent_id是不确定的,所以我们可以根据编码来获取行业数据。
方案二:使用两张表[不详解了,个人更喜欢第一种]