ARTS打卡计划第一周-Share-系统字典模块的设计
在软件开发的过程,经常有一些类型的字段信息:性别、学历、职级、车辆类别、公司类型、结算类型等。这些字段有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 |
|
||
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-系统字典模块的设计的更多相关文章
- ARTS打卡计划第一周
Algorithms: https://leetcode-cn.com/problems/two-sum/ Review: https://www.infoq.cn/article/EafgGJEtq ...
- ARTS打卡计划第一周-Tips-ControllerAdvice的使用
通常在开发具体项目过程中我们可能会面临如下问题: 统一所有的json返回结果 统一处理所有controller中的异常,并且给不同异常不同的返回状态值 统一对返回的接口做数据校验或者加密,防止篡改 在 ...
- ARTS打卡计划第一周-Review
本周分享的文章来自于medium的 Testing Best Practices for Java + Spring Apps 这个文章主要讲的是java测试的一些最佳实践 1.避免函数返回void, ...
- ARTS打卡计划第一周-Algorithm
7. Reverse Integer import math class Solution: def reverse(self, x: int) -> int: ret = 0 if x > ...
- ARTS打卡计划第二周
Algorithms: https://leetcode-cn.com/problems/3sum/ 算法是先排序,然后按照两个数和两边逼中,考虑去重. Review: https://www.inf ...
- ARTS打卡计划第二周-Share-使用java注解对方法计时
现在有这样一种常见,系统中有一个接口,该接口执行的方法忽快忽慢,因此你需要去统计改方法的执行时间.刚开始你的代码可能如下: long start = System.currentTimeMillis( ...
- ARTS打卡计划第二周-Review
本周review的文章是:https://medium.com/@hakibenita/optimizing-django-admin-paginator-53c4eb6bfca3 改篇文章的题目是: ...
- ARTS打卡计划第九周
Algorithms: https://leetcode-cn.com/problems/merge-two-sorted-lists/submissions/ 合并两个链表 Review: “Pu ...
- ARTS打卡计划第二周-Tips-mysql-binlog-connector-java的使用
最近发现一个挺不错的框架mysql-binlog-connector-java,可以实时监控binlog的变化. 首先检查mysql的binlog是否开启,在开启的情况下: 引入依赖 <depe ...
随机推荐
- Creating Excel files with Python and XlsxWriter——Introduction
XlsxWriter 是用来写Excel2007版本以上的xlsx文件的Python模块. XlsxWriter 在供选择的可以写Excel的Python模块中有自己的优缺点. #---------- ...
- A* 算法的原理
参考下面的博客内容, 已经写的很详细了, 就不用重复写了. https://blog.csdn.net/haxiongha/article/details/81357687
- 探索C++头文件解析方法
最近一直在搞基于SWIG的C++接口翻译Java代码的工作.SWIG内部基于Bison(Yacc)的C/C++解析器,最近纠结于SWIG不能解析C++构造函数中的默认初始化赋值操作,想找一个能够补充此 ...
- 工控随笔_20_西门子_WinCC的VBS脚本_09_常量和流程控制_02
vbs不但提供了分支结构,还提供了丰富的循环形式.一共有3种循环: 1.for循环 2.do...loop循环 3.while循环 各种循环有各自的特点,在使用的时候可以进行转换. 前面已经描述过Fo ...
- ASP.NET CORE 3 安装遇到的问题
最近在研究 ASP.NET CORE, visualstudio2019 也已正式发布,本以为安装vs2019后就默认支持asp.net core 3,谁知是不支持的,需单独安装net core 3及 ...
- CSS 不规则图形绘制
基础技能1 - 神奇的border 我们先来画一个长方形: .Rectangle { height: 100px; width: 200px; background: darkgray; border ...
- python3学习笔记九(if语句)
# !/usr/bin/python3 斐波那数列,两个元素的总和确定下一个数a,b = 0,1while b < 1000: print(b,end=',') a, b = b, a+bpri ...
- How do I improve my English speaking skills in a very short time?
You have asked some very important questions. I think the first step is to prioritize the issues: Yo ...
- python中Multiprocessing
import multiprocessing as mp #该函数不能有返回值,如果需要则应该将值放在queue中 def job(a,b): print('aaaa') if __name__ == ...
- windows旋转屏幕快捷键配置
1.打开屏幕分辨率 2.高级设置 3.英特尔核心显卡控制板 4.图形属性 5.选项和支持 6.管理快捷键(启用.禁用)