flag字段设计

利用标志位表示多种状态

Posted by Bug1024 on March 22, 2017

多个字段实现状态

以商品为例,通常一个商品拥有多种状态标志,是否是打折商品,是否是推荐商品,是否是秒杀商品,对应表结构:

id is_on_sale is_recommend is_seckill
1 1 0 1
2 0 0 1
3 1 1 1

这种方案不利于扩展,后期有新的标志需要再添加新的字段

利用位运算实现多种状态

Linux系统中的权限,通常我们所知权限分为r 读, w 写, x 执行,它们的权值分别为4,2,1,所以如果用户要想拥有这三个权限就必须chomd 7, 即7=4+2+1,表明这个用户具有rwx权限,如果只想这个用户具有r,x权限 那么就chomd 5即可。 商品的状态也可以参考类似的设计,我们可以分别设置is_on_sale,is_recommend,is_seckill的权值为4,2,1

id is_on_sale is_recommend is_seckill flag
1 1 0 1 5
2 0 0 1 1
3 1 1 1 7

如果新增了第4种状态,那么则可以设置其权值为8,第5种则为16

相关SQL

    -- 设置打折商品(或操作)
    update demo set flag = flag | 4;
    -- 取消打折商品(异或操作)
    update demo set flag = flag ^ 4;
    -- 获取打折商品(与操作)
    select * from demo where flag & 4;

缺点

  • 搜索的时候无法利用索引
  • bigint最最大数值为2^126,因此flag最多只能支持126个