银川市建设厅网站,做网站需要什么专业,个人网站做哪些内容,seo 网站结构调整背景
有这样的一个需求#xff0c;比如是用户与角色的关系#xff0c;两者是多对多的。一个用户可以有多个角色#xff0c;一个角色包含多个用户。我们很容易就考虑到了RBAC权限模型#xff0c;那创建一个用户表#xff0c;一个角色表#xff0c;还有一个用户角色关联表…背景
有这样的一个需求比如是用户与角色的关系两者是多对多的。一个用户可以有多个角色一个角色包含多个用户。我们很容易就考虑到了RBAC权限模型那创建一个用户表一个角色表还有一个用户角色关联表。多容易理解多轻松啊。可是如果角色不支持新建呢固定只能是管理员、普通用户、只读用户。那你怎么做还创建一个角色表吗还创建一个用户角色关联表吗当然那肯定是可以的。不过角色表里面就永远只有3条数据你每次查库的时候还总要join两个表麻烦哦。那么有没有一个不用新建表又能维护用户和角色之间的多对多关系呢答案就是位掩码。
原理分析
位掩码是一种使用二进制位来表示和存储多个开关状态或选项的技术。在您的设计中每个平台的权值都被赋予了不同的2的幂次方值20、21、2^2 等这是位掩码的常见用法。
通过将平台的权值设置为2的幂次方值并使用按位或运算将这些权值组合在一起您可以有效地表示多个平台的选中状态并将其存储为一个整数字段。而使用按位与运算您可以快速检查某个平台是否被选中。
位掩码在计算机科学和数据库设计中有广泛的应用特别是在需要对多个开关或选项进行组合表示和处理时。它是一种节省存储空间和提高效率的技术也提供了一种简洁的方式来表示和处理多个状态或选项。
当使用位掩码时我们将多个开关状态或选项用二进制位表示每个开关对应一个二进制位通常是0或1。通过将不同开关的二进制位组合在一起我们可以用一个整数通常是一个二进制数来表示多个开关状态的组合。
假设有以下四个开关参数
参数1权值为 2^0 1 参数2权值为 2^1 2 参数3权值为 2^2 4 参数4权值为 2^3 8 现在我们可以将这四个参数的二进制位组合在一起形成一个四位二进制数例如
0101 表示参数1和参数3被选中10405 1010 表示参数2和参数4被选中020810 1111 表示所有参数都被选中124815 在数据库或代码中我们可以使用这个整数二进制数位掩码来表示这四个参数的组合状态。然后我们可以使用位运算来处理和查询这些参数。
通过按位与bitwise AND运算我们可以检查特定参数是否被选中。 通过按位或bitwise OR运算我们可以将参数的状态进行合并。 通过按位异或bitwise XOR运算我们可以进行参数的状态切换。 使用位掩码的好处是可以有效地表示多个开关状态并将它们组合为一个整数节省了存储空间。同时通过位运算我们可以对这些开关状态进行快速的逻辑操作和查询。然而也需要小心处理位掩码可能导致的溢出和位数问题。
解决问题
我们用位掩码来解决这个角色的信息存储。这个案例不太有现实的意义。。仅供参考切勿深究。用户表中新增一列auth用于保存位掩码。
约定 管理员1 普通用户2 只读用户4
如果勾选了 管理员 和 普通用户保存的结果值为3 1 2 3同理可配对任意的组合每种组合的和值都会是唯一的。
在检索是否勾选了管理员角色即可通过如下语句
select * from user_info where bitand(auth, 1) 1;