可以使用位操作存储简单一对多的情况

Posted by hcy on August 7, 2019

可以使用位操作存储简单一对多的情况

需求如下

1
2
3
4
5
6
7
8
9
数据库中 user表有字段userLevel标识用户等级

1 普通用户
2 高级用户
3 vip用户
4 管理员
5 开发人员

另一张公告表A,发布公告时,需要指定类型的用户能看到,如只给管理员发公告,或者 只给 普通用户,高级用户发公告,其他人看不到

当然可以采用中间表的形式,每个公告存储该公告能访问的对应等级的user。今天我们采用另一种方法

二进制位法,原理如下

  • 设对应关系如下:
用户等级 标识 code
普通用户 1 1«0
高级用户 2 1«2
vip用户 3 1«3
管理员 4 1«4
开发人员 5 1«5
1
2
3
4
5
6
7
8
0 0 0 0 0 0 0 1  == 普通用户
0 0 0 0 0 0 1 0  == 高级用户
0 0 0 0 0 1 0 0  == vip用户
0 0 0 0 1 0 0 0  == 管理员
0 0 0 1 0 0 0 0  == 开发人员

0 0 0 0 0 0 1 1  == 普通用户 + 高级用户
0 0 0 0 1 0 1 0  == 高级用户 + 管理员

1
2
每种等级的用户占用一个32位int类型的一位,当发公告时,按位存储能看到该公告人的等级,如:
想要 普通用户和高级用户看到 存储 (1<<0) & (1<<2) 即 0b01 & 0b10 = 0b11 = 3,这个3标识了普通用户和高级用户

如何查询? ,如查询普通用户查看到的公告

select * from A where userLeverCode & 1 != 0

1
这样的sql就能查询到所有包含普通用户的公告了。

下面的sql用于测试

1
2
3
4
select 1&1
select 1&2
select 1&3
select 4&6

转载请注明出处:https://www.huangchaoyu.com/2019/08/07/可以使用位操作存储简单一对多的情况/