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