一种多选项的高效存取(存储、查询)解决方案

📅 2026/7/1 9:08:55
一种多选项的高效存取(存储、查询)解决方案
设计思想核心思路编码将每个选项与特定的比特位上对应起来选中为1未选中为0存储将比特位转换为Long型64bit最大支持64个多选项数据库表字段为BIGINT查询与位运算主要流程编码将多选项进行编号例如对职业发展的多选项进行编号为1-收入无上限2-培训与发展3-职业价值感4-行业稳定性5-社交与人脉6-塑造个人品牌7-团队综合素质8-终身学习对兴趣爱好的多选项进行编号为1-编程2-听音乐唱歌3-篮球4-玩游戏5-看电影6-享美食7-健身8-旅游9-看书10-写作。存储前端选择了哪些选项就传递哪些选项的编号。例如选择了编程、篮球则传递的编号串为1,3后端将编号串转换为二进制串再转换为数字落库查询前端还是只传选项编号后端将其转换为数字在数据库层面使用位运算中的与运算匹配包含了参数选项的记录。编码将多选项转换为数字现以兴趣爱好为例为其多选项定义编号1-编程2-听音乐唱歌3-篮球4-玩游戏5-看电影6-享美食7-健身8-旅游9-看书10-写作根据二进制位下标与十进制数的互转例1用户A勾选的兴趣爱好为1-编程2-听音乐唱歌5-看电影6-享美食前端传递的串为1,2,5,6转换为二进制串0011 0011转换规则在有选项编号出现的位下标的位置上填充1其他位置填充0转换为十进制后落库51例2用户B勾选的兴趣爱好为3-篮球4-玩游戏6-享美食7-健身10-写作前端传递的串为3,4,6,7,10转换为二进制串0010 0110 1100转换为十进制后落库620查询原理查询的核心思想与位运算X Y X则说明X的所有值为1的二进制位、在Y中对应的二进制位也为1。也就是说Y为1的二进制位包含了X的所有为1的二进制位。从而实现了查询条件X在Y中存在包含项目启动Step 1在application.yml中修改数据库连接参数Step 2执行resources/sql.sql下的SQL文件初始化数据Step 3从启动类App.java启动Step 4启动成功后进入前端页面http://localhost:9898/person.html新增数据演示必要数据多选项进行勾选去数据库查看刚刚新增的记录查询数据演示选择查询条件点击“Query”进行查询查看运行日志显示执行的SQL查询示例以多选项”兴趣爱好“为例展示查询的工作原理构造数据AA选择了1-编程2-听音乐唱歌5-看电影6-享美食7-健身8-旅游前端传递的编号串1,2,5,6,7,8转换为二进制串0000 1111 0011转换为数字243BB选择了3-篮球4-玩游戏8-旅游9-看书10-写作前端传递的编号串3,4,8,9,10转换为二进制串0011 1000 1100转换为数字908CC选择了2-听音乐唱歌3-篮球5-看电影6-享美食7-健身9-看书10-写作前端传递的编号串2,3,5,6,7,9,10转换为二进制串0011 0111 0110转换为数字886DD选择了1-编程3-篮球4-玩游戏6-享美食7-健身8-旅游10-写作前端传递的编号串1,3,4,6,7,8,10转换为二进制串0010 0110 1101转换为数字749EE选择了2-听音乐唱歌4-玩游戏5-看电影7-健身8-旅游10-写作前端传递的编号串2,4,5,7,8,10转换为二进制串0010 1101 1010转换为数字730FF选择了1-编程2-听音乐唱歌3-篮球4-玩游戏5-看电影7-健身前端传递的编号串1,2,3,4,5,7转换为二进制串0000 0101 1111转换为数字95GG选择了1-编程3-篮球4-玩游戏6-享美食8-旅游10-写作前端传递的编号串1,3,4,6,8,10转换为二进制串0010 1010 1101转换为数字685插入到数据库DROP TABLE IF EXISTS person; CREATE TABLE person ( id BIGINT AUTO_INCREMENT, name VARCHAR(50) DEFAULT NULL COMMENT 姓名, gender INT DEFAULT NULL COMMENT 性别0-女1-男, address VARCHAR(128) DEFAULT NULL COMMENT 地址, careers BIGINT DEFAULT NULL COMMENT 职业发展多选项, -- 兴趣爱好多选项。可选项1-编程2-听音乐唱歌3-篮球4-玩游戏5-看电影6-享美食7-健身8-旅游9-看书10-写作。 -- 例如全选11 1111 1111保存为十进制1023全不选00 0000 0000保存为十进制0只选择听音乐唱歌0000 0010保存为十进制2 -- LONG最大支持64位最多支持64个多选项的任意选择 interests BIGINT DEFAULT NULL COMMENT 兴趣爱好多选项, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, deleted INT DEFAULT 0 COMMENT 是否删除0-否1-是, PRIMARY KEY(id) );-- 将上文中构造的数据以SQL的形式插入到数据库中只以多选项兴趣爱好为例 INSERT INTO person(name, gender, address, careers, interests, create_time, update_time, deleted) VALUES (AA, 1, SH CN, 1, 243, 2022-12-12,2023-12-12, 0), (BB, 1, SH CN, 1, 908, 2022-12-12,2023-12-12, 0), (CC, 1, SH CN, 1, 886, 2022-12-12,2023-12-12, 0), (DD, 1, SH CN, 1, 749, 2022-12-12,2023-12-12, 0), (EE, 1, SH CN, 1, 730, 2022-12-12,2023-12-12, 0), (FF, 1, SH CN, 1, 95, 2022-12-12,2023-12-12, 0), (GG, 1, SH CN, 1, 685, 2022-12-12,2023-12-12, 0);查询选择了1-编程这个选项的记录目标在多选项中查询选择了1-编程这个选项的记录用户的兴趣爱好多选项二进制形式AA 0000 1111 0011BB 0011 1000 1100CC 0011 0111 0110DD 0010 0110 1101EE 0010 1101 1010FF 0000 0101 1111GG 0010 1010 1101将1-编程进行转换转换为二进制0000 0000 0001转换为十进制1查询原理将查询条件0000 0000 0001与AA~GG的二进制位进行与运算后仍然为查询条件的记录则是选择了1-编程这个选项的记录查询过程将查询条件与AA的二进制位进行与运算0000 0000 0001 0000 1111 0011 #-------------------------- 0000 0000 0001 与运算结果仍为查询条件说明这条记录包含了1-编程这个选项将查询条件与BB的二进制位进行与运算0000 0000 0001 0011 1000 1100 #---------------------------- 0000 0000 0000 与运算结果不为查询条件说明这条记录不包含了1-编程这个选项其他记录运算同理最终发现只有AA、DD、FF、GG的运算结果符合条件这四个记录就是满足选择了1-编程这个选项的所有记录SQL实现select * FROM person WHERE interests 1 1;查询选择了2-听音乐唱歌5-看电影这些选项的记录