在软件开发的过程,经常有一些类型的字段信息:性别、学历、职级、车辆类别、公司类型、结算类型等。这些字段有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. 商品分类选择 Jquery插件

    如果想要用此插件,请加微信: DS-valeb   说 category 插件索取 效果如下: 注意,一次性加载所有数据, 只适用小量,如果量大,请根据你的可行性来决择! 数据表设计结构如下: 调用如 ...

  2. Linux内核中常用的数据结构和算法(转)

    知乎链接:https://zhuanlan.zhihu.com/p/58087261 Linux内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树. 链表 Linux内核代码大量使用了 ...

  3. 内存问题-JVM调优思路

    通常,内存的问题就是 GC 的问题,因为 Java 的内存由 GC 管理.有2种情况,一种是内存溢出了,一种是内存没有溢出,但 GC 不健康. 内存溢出的情况可以通过加上 -XX:+HeapDumpO ...

  4. 报错:Sqoop2 Exception: java.lang.NoSuchMethodError Message: org.apache.hadoop.security.authentication.client.Authenticator

    报错过程: 进入sqoop2之后, 输入命令:show connector,报错 报错现象: Exception has occurred during processing command Exce ...

  5. 配置RIPng(PT)

    一:拓扑图 二:配置过程 1:首先为pc0:pc1: pc2 配置IPv6地址(注意标明前缀),可以手动配置也可以自动获取. 手动配置 自动获取 2:给路由器配置RIPng协议 全局开启RIPng协议 ...

  6. [UE4]AttachToComponent的AttachmentRule

    官方文档 KeepRelative 将当前相对转换保持为新父级的相对转换 KeepWorld 自动计算相对变换,使附着的组件保持相同的世界变换 SnapToTarget 捕捉转换到附着点

  7. List<Map<String, Object>>集合中获取某个key并转换为List<Integer>集合

    package com.codyy.sso.controller.yuanqu; import java.util.ArrayList; import java.util.HashMap; impor ...

  8. 如何避免在IE内核时,按BackSpace时进行网页会进行回退

    //解决在IE浏览器中input被设置成readonly时,点击Backspace时会出现网页回退 document.onkeydown = check; function check(e) { va ...

  9. 高性能 TCP & HTTP 通信框架 HP-Socket v4.2.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  10. 基础总结(04)-- display:none;&&visibility:hidden;区别

    display:none 1.使元素隐藏,不再占据空间. 2.动态操作时会引起页面回流和重绘,影响性能. 3.子元素也会被隐藏并且添加display:block/visibility:visible无 ...