数据库中枚举型数据字典处理

数据库中枚举型数据字典处理

以前在做数据库编程基本上是使用VB、PowBuilder、IFS、SAP这样的平台,底层对数据做了大量封装,设计数据库中字段时考虑得不是很多,用得也比较随意 ,去年开始重新在学习JAVA采用spring boot框架,虽然现在有mybatis-plus和tk-mybatis用于数据层访问,对数据库一般的CURD访问基本没有问题,也比较简单了,但对于有逻辑控制关系的数据字典来说,还是比较复杂,有以下几点经验,总结如下:

一、尽量不要让字典字段为空

空字段(null)在普遍CURD上没有什么关系,但在进行逻辑控制时,java的空字段,总是要抛出异常,问题防不胜防,让编程变得十分复杂,不论是前端显示逻辑,还是后端比较判断、选择判断,都需要先判断空,然后再处理逻辑,变得十分复杂,有是甚至还要判断空白("").

       if (department != null && !"".equals(department)){
            criteria.andDepartmentEqualTo(department);
        }
        if (selectCodeColor != null && !"".equals(selectCodeColor)){
            criteria.andCodeColorEqualTo(selectCodeColor);
        }
        if (selectQuarState != null && selectQuarState!= 0){
            criteria.andQuarantineStateEqualTo(selectQuarState);
        }

用thyemleaf的th:在前端编程时,判断比较困难,可以用“?”做一些判断简单的判断,复杂的判断还得专门写一个处理的JS函数。

//前端html代码中判断,
th:class="${pagination.page == page}? 'active' : ''">
//前端JS判断
   //给日期字段赋值,只能取前面年月日,并以-号分隔,否则前端不回显
if (data_obj.quarantineStart != null) {
    $("#quarantineStart").val(data_obj.quarantineStart.substring(0, 10));
 } else {
      $("#quarantineStart").val(null);
}

这些处理稍有不慎都会引起程序错误。

因此在数据库设计时,对于有逻辑关系控制的数据库字段,强烈建立不要使用null空值,为字段设计缺省值,减少编程时的空值处理逻辑、减少程序BUG,少为前后端程序员填坑。

二、尽量用数字作枚举值,少用字符做枚举值,不要用汉字

当前数据存储空间已经不是问题了,在采取设计枚举数据字典时,有人喜欢用汉字字符作为枚举字符代码,这样简单易懂,在基于spring boot的前后端开发时,这种用法问题还比较多。
spring boot本身对所有处理逻辑都要自己编程,在后端程序中处理字符串时也会产生意相不对的问题。
另外前后端开发环节中,前后端需要大量交互字典代码数据,中间有数据库到后台、后台到前端存在两层转码,有时会发生错误。
引外,开发环境与生产环境不同,如开发用windows,生产用linux也会产生字符、字体问题,也会产生意想不到的问题。
因此,数据库中枚举字典设计时,建立还是用数字或字母作为存储字符,另用数字更好,比较更方便,同时用0作为缺省值。

    /**
     * 0不需要隔离,9居家办公14天,1居家隔离7天,2居家隔离14天,21医学隔离7天,22医学隔离14天
     */
    NOt_QUARANTINE(0,"不需要隔离"),
    HOME_QUARANTINE_7(1,"居家隔离7天"),
    HOME_QUARANTINE_14(2,"居家隔离14天"),
    HOME_WORK_14(9,"居家办公14天"),
    HOSPITAL_QUARANTINE_21(21,"医学隔离7天"),
    HOSPITAL_QUARANTINE_22(22,"医学隔离14天"),
    OUT_OF_JIAXING_99(99,"外出嘉兴未归");

三、为枚举增加enum类统一处理

在spring boot开发中,对枚举处理工作非常多,建立统一为枚举增加enum处理包,所有处理都通过这个包处理,不要在程序中处理,否则后续修改工作量太大。

private Integer type;
    private String description;

    public static String typeOfDescription(Integer type){
        for (QuarantineTypeEnums quarantineTypeEnums : QuarantineTypeEnums.values()){
            if (quarantineTypeEnums.getType().equals(type)){
                return quarantineTypeEnums.getDescription();
            }
        }
        return "";
    }

你可能感兴趣的:(数据库中枚举型数据字典处理)