Oracle BITAND函数妙用解决方案

背景

有这样的一个需求,比如是用户与角色的关系,两者是多对多的。一个用户可以有多个角色,一个角色包含多个用户。我们很容易就考虑到了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被选中(1+0+4+0=5)
1010 表示参数2和参数4被选中(0+2+0+8=10)
1111 表示所有参数都被选中(1+2+4+8=15)
在数据库或代码中,我们可以使用这个整数二进制数(位掩码)来表示这四个参数的组合状态。然后,我们可以使用位运算来处理和查询这些参数。

通过按位与(bitwise AND)运算,我们可以检查特定参数是否被选中。
通过按位或(bitwise OR)运算,我们可以将参数的状态进行合并。
通过按位异或(bitwise XOR)运算,我们可以进行参数的状态切换。
使用位掩码的好处是可以有效地表示多个开关状态,并将它们组合为一个整数,节省了存储空间。同时,通过位运算,我们可以对这些开关状态进行快速的逻辑操作和查询。然而,也需要小心处理位掩码可能导致的溢出和位数问题。

解决问题

我们用位掩码来解决这个角色的信息存储。这个案例不太有现实的意义。。仅供参考,切勿深究。用户表中新增一列auth,用于保存位掩码。

约定:
管理员:1
普通用户:2
只读用户:4

如果勾选了 管理员 和 普通用户,保存的结果值为3( 1 + 2 = 3),同理可配对任意的组合,每种组合的和值都会是唯一的。

在检索是否勾选了管理员角色,即可通过如下语句:

select * from user_info where bitand(auth, 1) = 1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/18352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP地址转换函数

#include<string.h> #include<arpa/inet.h> #include<stdio.h>int main(void){char ip[]"1.2.3.4";//字符串struct sockaddr_in server_addr;inet_pton(AF_INET,ip,&server_addr.sin_addr.s_addr);//字符串 to 网络字节序printf("s_addr …

Kubernetes 概述

1、K8S 是什么&#xff1f; K8S 的全称为 Kubernetes (K12345678S) 作用 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如 Docker&#xff09;的集群&#…

iOS——Block签名

首先来看block结构体对象Block_layout&#xff08;等同于clang编译出来的__Block_byref_a_0&#xff09; #define BLOCK_DESCRIPTOR_1 1 struct Block_descriptor_1 {uintptr_t reserved;uintptr_t size; };#define BLOCK_DESCRIPTOR_2 1 struct Block_descriptor_2 {// requi…

【vue】组件使用教训

组件使用 报错组件找不到 These dependencies were not found: 遇见的问题 在使用vue的时候&#xff0c;做了一个统计图的功能&#xff0c;引入了chart。 但是在运行项目的时候&#xff0c;直接报错启动不起来&#xff0c;报错内容是 告诉我依赖找不到&#xff0c;然后还试…

微信小程序iconfont真机渲染失败

解决方法&#xff1a; 1.将下载的.woff文件在transfonter转为base64&#xff0c; 2.打开网站&#xff0c;导入文件&#xff0c;开启base64按钮&#xff0c;下载转换后的文件 3. 在下载解压后的文件夹中找到stylesheet.css&#xff0c;并复制其中的base64 4. 修改index.wxss文…

从零开始学Docker(二):启动第一个Docker容器

宿主机环境&#xff1a;RockyLinux 9 这个章节不小心搞成命令学习了&#xff0c;后面在整理成原理吧 Docker生命周期 拉取并启动Nginx容器 # 查找镜像 例如&#xff1a;nginx [root192 ~]# docker search nginx 我们可以看到&#xff0c;第一个时官方认证构建的nginx # 拉…

如何能够高效实现表格中的分权限编辑功能

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 在表格类填报需求中&#xff0c;根据当前登录用户的不同等级&#xff0c;能填报的区域会…

图论--最短路问题

图论–最短路问题 邻接表 /* e[idx]:存储点的编号 w[idx]:存储边的距离&#xff08;权重&#xff09; */ void add(int a, int b, int c) {e[idx] b;ne[idx] h[a];w[idx] ch[a] idx ; }1.拓扑排序 给定一个 n 个点 m 条边的有向图&#xff0c;点的编号是 11 到 n&#xf…

日常整理的一些前端知识点笔记

整理的一些前端知识点 ECMAScript和JavaScript是什么关系 ECMAScript 和 JavaScript 的关系是&#xff0c;前者是后者的规格&#xff0c;后者是前者的一种实现 &#xff08;另外的 ECMAScript 方言还有 JScript 和 ActionScript&#xff09;。日常场合&#xff0c;这两个词是…

Delphi 开发不一样的窗体标题栏:TTitleBarPanel

目录 TTitleBarPanel 的使用 TTitleBarPanel 的使用进阶 一、设置标题栏高度、颜色 二、个性化标题栏的关闭等按键 我们在用Delphi开发程序的时候&#xff0c;窗体的标题栏一般都是标准的windows标题栏&#xff0c;上面包括&#xff1a;程序图标、标题、最小化、最大化、关闭…

Linux中error while loading shared libraries错误解决办法

默认情况下&#xff0c;编译器只会使用/lib和/usr/lib这两个目录下的库文件&#xff0c;通常通过源码包进行安装时&#xff0c;如果不指定–prefix&#xff0c;会将库安装在/usr/local/lib目录下 当运行程序需要链接动态库时&#xff0c;提示找不到相关的.so库&#xff0c;会报…

[Python进阶]定制类:属性篇

4.10.2 属性篇 4.10.2.1 getattr、getattribute 通常我们可以通过obj.attr访问某个对象的属性。而__getattr__则是用来处理我们在获取某个不存在的属性时希望的处理。 默认情况下&#xff0c;如果我们获取了一个不存在的属性时&#xff0c;会报错&#xff1a;AttributeError。…

如何做好Code Review:思考、方法和实践 (真实经验总结)

目录 背景 Code Review 目标 系统层面 代码规范 业务逻辑 日志 测试 安全

k8s1.26.6 安装gitlab

Gitlab官方提供了 Helm 的方式在 Kubernetes 集群中来快速安装&#xff0c;但是在使用的过程中发现 Helm 提供的 Chart 包中有很多其他额外的配置&#xff0c;所以我们这里使用自定义的方式来安装&#xff0c;也就是自己来定义一些资源清单文件。 Gitlab主要涉及到3个应用&…

Python爬虫时遇到连接超时解决方案

在进行Python爬虫任务时&#xff0c;经常会遇到连接超时&#xff08;TimeoutError&#xff09;错误。连接超时意味着爬虫无法在规定的时间内建立与目标服务器的连接&#xff0c;导致请求失败。为了帮助您解决这个常见的问题&#xff0c;本文将提供一些解决办法&#xff0c;并提…

用合成数据训练托盘检测模型【机器学习】

想象一下&#xff0c;你是一名机器人或机器学习 (ML) 工程师&#xff0c;负责开发一个模型来检测托盘&#xff0c;以便叉车可以操纵它们。 ‌你熟悉传统的深度学习流程&#xff0c;已经整理了手动标注的数据集&#xff0c;并且已经训练了成功的模型。 推荐&#xff1a;用 NSDT设…

【LeetCode】88. 合并两个有序数组

这道题我总共想了三种解法。 1.将nums2中的元素依次放入nums1有效元素的后面&#xff0c;再总体进行排序。 import java.util.*; class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int j 0;for(int i m;i<mn;i){nums1[i] nums2[j];j;}Arrays…

搭建网站 --- 快速WordPress个人博客并内网穿透发布到互联网

文章目录 快速WordPress个人博客并内网穿透发布到互联网 快速WordPress个人博客并内网穿透发布到互联网 我们能够通过cpolar完整的搭建起一个属于自己的网站&#xff0c;并且通过cpolar建立的数据隧道&#xff0c;从而让我们存放在本地电脑上的网站&#xff0c;能够为公众互联…

机器学习分布式框架ray运行xgboost实例

Ray是一个开源的分布式计算框架&#xff0c;专门用于构建高性能的机器学习和深度学习应用程序。它的目标是简化分布式计算的复杂性&#xff0c;使得用户能够轻松地将任务并行化并在多台机器上运行&#xff0c;以加速训练和推理的速度。Ray的主要特点包括支持分布式任务执行、Ac…

vue3单选选择全部传all,否则可以多选

<el-form-item label"发布范围-单位选择"><el-radio-group v-model"formData.unitRadio" change"getUnit"><el-radio label"ALL" click.prevent"radioChange(ALL)">全部</el-radio><el-radio la…