位运算解决数据表状态枚举类问题
marcus-ma opened this issue · comments
情景导入
有一张记录问题处理进度的数据表,原字段有三:主键id、问题名称、处理的状态[0:未处理/1:已处理]。现在来了个需求,想将处理的状态记录得详细点,如记录是否经过UI的二次修改、是否经过技术的重构、是否经过CTO的review等等。
初次想法
一开始是的想法是:直接增加表的相应状态字段,但对于表中数据比较多,直接修改表结构不太好。
之后的想法是:每经过一个状态就插入一条数据,处理的状态[0:未处理/1:UI/2:技术……],但表会越来越大
更好的办法
后来找到一个更好的处理办法:将处理的状态值改为用2的幂次方表示
,每到一个状态,就将该状态对应的值累加上。
如[1:未处理/2:UI/4:技术/8:CTO/16:已处理],若有一问题经过UI、技术、CTO的处理,则该状态值为1+2+4+8=15。
这样的好处是:表结构不用进行修改,表数据不会增加过多。
数据展示
如果要列出该问题的处理过程时,可以将状态值进行分解(位运算),就可以得出处理阶段的对应值
function status($statusSum){
$wei = [1,2,4,8,16];
$statusVals = array_filter($wei,function($var) use($statusSum){
return($var & $statusSum);
});
var_dump($statusVals);
}
status(15);
//[1,2,4,8]
结果
问题解决,同时也了解到位运算还有这操作