在软件开发的过程,经常有一些类型的字段信息:性别、学历、职级、车辆类别、公司类型、结算类型等。这些字段有2个特征:1是字段可选的类型是有限,2是字段可能会变化,我们把这种字段描述为字段字段。  本篇文章重点总结系统字典模块的设计,根据我的工作经验,我对字典模块的设计认知包含如下几个阶段:

一、硬编码到页面

这个阶段,一般是把可以枚举的option写在html,或者通过后台模板硬编码到html中。这种方式的实现优点在于实现简单,也没有依靠数据库。但是缺点也是很明显,如果这些字段发生了变化,需要去改代码,还需要重新发布代码。

二、在数据建表,以附表的形式

例如在一个订单表中,有一个结算字段,当然结算的类型是有限,我们可以建立一个结算类型表。这样订单表只存结算的字段id,这样也能做到动态添加结算类型。这样做缺点在于,加了一个字段字段就加一个表,那么有几百上千个字段就需要多太多的表。而且在获取数据的时候,需要去连接查询拿到数据,其实也会影响性能

三、统一建字典表去管理所有的字典

目前我们公司采用的就是这种方式去统一管理所有的字典,我们使用2个表去实现这样一个模块。一个是字典类型表,一个是字典选项表。一个字典类型,对应多个字典选项表。字典表有如下字段:

字段名称 字段类型 字段含义
id   int 主键
dict_type   string 字典的英文表示,如性别可以描述为gender
dict_name  string 字典名称,例如性别
tags string 标签,可以有多个,用逗号拼接
common字段   一些通用管理字段,如更新时间,更新人,创建人等
     
     
     

这个表需要注意的是,要留tags字段作为扩展,经常有的ERP系统之中,字典可能有几千个,需要一些标识去分割。例如可以将字典的类型分为财务、综管、生产等,这样方便显示。

也可以将一些权限的表示放入其中,例如tags包含role:1表示role的id为1的才能去修改字典等。

字典选项表如下:

字段名称 字段类型 字段含义
id    
dict_id 关联的是dict_type的id 字典类型id
dict_value_id   字典选项的option的key,也可以不要次字段,这样option的key就是id
dict_value  
字典选项的option的value
code   字典选型的编码
sort等通用字段       

需要注意的是dict_value_id可以不需要,这样dict_value_id可以和id一致。采用这样的实现方式,可以统一管理所有的字典,但是会需要一些基础的公用代码去解决使用的问题。

1、字典选项的呈现的问题

有这样一个场景,有一个学生表,有一个性别字段。我们在字典表里加入一个gender的字典,添加2个option,1:男,2:女。那么性别字段中存的是1或者2。

首先在学生数据录入的时候,页面层必须知道性别这个字段是字典类型,然后可以通过这个字典类型的dict_type去拉去dict_value,这样就能呈现。同样在学生表数据呈现的时候,后端可以统一替换字典项的id为name,也可以直接返回给前端,让前端统一替换所有的字段项的值。当然在具体实现的过程中,可以使用缓存去存储所有的字典的数据,也可以通过一些约定的形式,采用动态实现的方式,在框架层替换option的值。例如所有的字典字段,名称都必须是_dict_type。

2、字典选项被删除的问题

例如学生表中的option的男被删除了,那么学生表中的性别为1的数据就会出现问题。目前我们采用的解决方式是dict_value采用逻辑删除的方式,这样数据删除了也能正常显示。不过具体需要根据需求去解决这个问题,例如不存在的option设置为一些异常标识。

ARTS打卡计划第一周-Share-系统字典模块的设计的更多相关文章

  1. ARTS打卡计划第一周

    Algorithms: https://leetcode-cn.com/problems/two-sum/ Review: https://www.infoq.cn/article/EafgGJEtq ...

  2. ARTS打卡计划第一周-Tips-ControllerAdvice的使用

    通常在开发具体项目过程中我们可能会面临如下问题: 统一所有的json返回结果 统一处理所有controller中的异常,并且给不同异常不同的返回状态值 统一对返回的接口做数据校验或者加密,防止篡改 在 ...

  3. ARTS打卡计划第一周-Review

    本周分享的文章来自于medium的 Testing Best Practices for Java + Spring Apps 这个文章主要讲的是java测试的一些最佳实践 1.避免函数返回void, ...

  4. ARTS打卡计划第一周-Algorithm

    7. Reverse Integer import math class Solution: def reverse(self, x: int) -> int: ret = 0 if x > ...

  5. ARTS打卡计划第二周

    Algorithms: https://leetcode-cn.com/problems/3sum/ 算法是先排序,然后按照两个数和两边逼中,考虑去重. Review: https://www.inf ...

  6. ARTS打卡计划第二周-Share-使用java注解对方法计时

    现在有这样一种常见,系统中有一个接口,该接口执行的方法忽快忽慢,因此你需要去统计改方法的执行时间.刚开始你的代码可能如下: long start = System.currentTimeMillis( ...

  7. ARTS打卡计划第二周-Review

    本周review的文章是:https://medium.com/@hakibenita/optimizing-django-admin-paginator-53c4eb6bfca3 改篇文章的题目是: ...

  8. ARTS打卡计划第九周

    Algorithms: https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/ 合并两个链表 Review:  “Pu ...

  9. ARTS打卡计划第二周-Tips-mysql-binlog-connector-java的使用

    最近发现一个挺不错的框架mysql-binlog-connector-java,可以实时监控binlog的变化. 首先检查mysql的binlog是否开启,在开启的情况下: 引入依赖 <depe ...

随机推荐

  1. 1、链表之增、删、查实现(C语言)

    一.功能描述: 可以创建节点并添加到链表中.查看链表中的所有节点.并可以删除特定的节点 二.代码实现 1.主函数main主要实现的是从后台键入不同的字符,执行对应的函数来实现特定的操作代码如下: in ...

  2. 动态调用WebService(传对象返回接受对象)

    基础属性//客户端代理服务命名空间,可以设置成需要的值. string ns = string.Format("WindowsForms"); private Assembly a ...

  3. Web高级 Eventloop和事件执行顺序

    1. EventLoop 1.1 调用栈 当一个方法执行时内部调用另外的方法,则会形成调用栈,如图: 1.2 任务队列 JavaScript有一个主线程执行当前任务,主线程的代码同步执行,并把遇到的事 ...

  4. 发布一个PHP包到Packagist, 然后使用Composer安装

    Composer 能够方便的进行项目的依赖管理,  当我们发布一个包并且希望别人通过Composer安装的时候, 就需要将包发布到Composer的包仓库Packagist上面. 下面进行详细的说明一 ...

  5. 树莓派中学TensorFlow

    树莓派中默认的虚拟环境为python 2.x,需要用下面的-p参数修改为python3环境.电信wifi和公司网络直接用pip3 install TensorFlow都不好使,用联通手机热点可以安装. ...

  6. 7.2.4 else与if配对

    规则是,如果没有花括号,else与离它最近的if匹配,除非最近的if被花括号括起来. 注意:要缩进"语句","语句"可以是一条简单语句或复合语句. 记住,编译器 ...

  7. vue 路由别名 路由跳转

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. oracle、grid 用户ID

    oracle.grid 用户ID [root@db-rac02 rules.d]# id oracle uid=54321(oracle) gid=54321(oinstall) groups=543 ...

  9. Oracle中 to_date和to_char用法

    to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...

  10. Delphi 7启动后提示Unable to rename delphi32.dro的解决办法

    在Win10 64 上安装完Delphi 7,每次打开报错: Unable to rename 'C:\Program Files (x86)\Borland\Delphi7\Bin\delphi32 ...