多个字段实现状态
以商品为例,通常一个商品拥有多种状态标志,是否是打折商品,是否是推荐商品,是否是秒杀商品,对应表结构:
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个