可以使用位操作存储简单一对多的情况
可以使用位操作存储简单一对多的情况
需求如下
数据库中 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 |
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 == 高级用户 + 管理员
每种等级的用户占用一个32位int类型的一位,当发公告时,按位存储能看到该公告人的等级,如:
想要 普通用户和高级用户看到 存储 (1<<0) & (1<<2) 即 0b01 & 0b10 = 0b11 = 3,这个3标识了普通用户和高级用户
如何查询? ,如查询普通用户查看到的公告
select * from A where userLeverCode & 1 != 0
这样的sql就能查询到所有包含普通用户的公告了。
下面的sql用于测试
select 1&1
select 1&2
select 1&3
select 4&6
可以使用位操作存储简单一对多的情况
https://www.huangchaoyu.com/4248451535.html