利用二进制存储多种状态

背景

目前一个订单需要加一个异常的状态,但是一个订单可能存在多种状态,又要满足平常的分页查询;例如,目前的异常状态有:断货、断码、库存异常、超期。一个订单可能存在多种转态。

解决思路

  • 新建表:按照我们常规的思路,不就是一对多的关系吗,直接新建一张表就好了,用表进行关联,两种场景都可以满足。 这也是我们平常经常使用的。
  • 利用二进制特性: 在原表中加入一个字段,用于存储订单状态的异常类型(exception_type); 按照平时的思路,这个类型一般是枚举值,那么我们可以这样定义:
    /**
     * 异常类型  1.断货 2.断码 3.库存异常  4.超期
     */
    NORMAL(0, "正常"),
    OUT_STOCK(2, "断货"),
    BROKEN_CODE(4, "断码"),
    STOCK_EXCEPTION(8, "库存异常"),
    OVER_DATE(16, "超期"),

  那如果存在多种状态怎么表示呢? 比如一个订单是断货,又是断码,那么我们数据库存的就是6 。同理可得,如果存的是14,那这个单是断码、断货和库存异常。

其实我们可以发现,2|4=6,2|4|8=12,也可以看成 2+4=6,2+4+8=12. 那么在数据库里,我们可以根据  2&6 =2, 4&6=4 的特性去查询。 对应的sql语句为:

select *  from   table   as t   where #{exceptionType}=#{exceptionType}&t.exception_type and exception_type !=0;

 

对于存储在ES上,我没有找到ES上的与操作,可以用回溯算法将值解析,用数组的方式存储,然后查询。

                          

posted @ 2021-06-22 19:40  泉水姐姐。  阅读(232)  评论(0编辑  收藏  举报