码迷,mamicode.com
首页 > 其他好文 > 详细

利用二进制存储多种状态

时间:2021-06-23 16:25:36      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:bsp   数据库   分页   新建   span   type   算法   建表   一个   

背景

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

解决思路

  • 新建表:按照我们常规的思路,不就是一对多的关系吗,直接新建一张表就好了,用表进行关联,两种场景都可以满足。 这也是我们平常经常使用的。
  • 利用二进制特性: 在原表中加入一个字段,用于存储订单状态的异常类型(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上的与操作,可以用回溯算法将值解析,用数组的方式存储,然后查询。

                          

利用二进制存储多种状态

标签:bsp   数据库   分页   新建   span   type   算法   建表   一个   

原文地址:https://www.cnblogs.com/xiaofeng-fu/p/14920023.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!