多属性、多分类MySQL模式设计

简介: 多属性、多分类MySQL模式设计

0、导读

这是来自B乎的一个问答。 当数据同时具备多个属性/分类时,改如何设计表结构和查询?

1、需求描述

我偶尔也会逛逛B乎,看到一些感兴趣的话题也会回复下。

有一次,看到这样的一个话题:

链接: https://www.zhihu.com/question/337083976/answer/767075575 [mysql] 当数据同时属于多个分类时,该怎么查询?分类cate字段为[1,2,3,4,5] ,假如要查询满足分类'2'和'5' 的数据该怎么查询?我尝试过用 cate like '%2%' AND cate like '%5%'去查。想问有没有更好的办法,我这样写数据少了还好,多了根本没法查,效率太低了。

恰好我以前做过类似的业务需求设计,所以就回复了这个问题。

2、模式设计思路

这个需求可以有几种不同的解决思路,我们分别展开说一下。

2.1 用bit数据类型

大概思路如下:

1、物品属性列c1 用bit数据类型 来表示,也就是只有0、1两种取值

2、当物品属性具备某个分类属性时,其值为1,否则为0

3、假如共有5个分类,当物品拥有全部分类属性时,则其值为11111,若其不具备第3个分类属性,则其值为11011,在数据库中转成十进制存储

4、上述两种情况下,将二进制转换成十进制表示,即分别是31和27(建议横版观看,可左右滑动

[root@yejr.me] [zhishutang]> select conv(11111, 2, 10), conv(11011, 2, 10);
+--------------------+--------------------+
| conv(11111, 2, 10) | conv(11011, 2, 10) |
+--------------------+--------------------+
| 31                 | 27                 |
+--------------------+--------------------+

5、然后,只需要对该列用十进制值进行查询比对就行

6、现在如果想判断是否同时具备2、5两个分类属性时,其二进制表示为01001,转成十进制为9,只需要用条件 where c1=9 即可我们来演示一下:建议横版观看,可左右滑动

[root@yejr.me] [zhishutang]>show create table t_bit\G

1. row **
Table: t_bit
Create Table: CREATE TABLE `t_bit` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`c1` int(10) unsigned NOT NULL DEFAULT '0',
`c2` varchar(10) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `c1` (`c1`)
) ENGINE=InnoDB;

insert into t_bit select 0,conv(00001, 2, 10), 'item1';
insert into t_bit select 0,conv(00011, 2, 10), 'item2';
insert into t_bit select 0,conv(00111, 2, 10), 'item3';
insert into t_bit select 0,conv(01111, 2, 10), 'item4';
insert into t_bit select 0,conv(11111, 2, 10), 'item5';
insert into t_bit select 0,conv(10111, 2, 10), 'item6';
insert into t_bit select 0,conv(11011, 2, 10), 'item7';
insert into t_bit select 0,conv(11101, 2, 10), 'item8';
insert into t_bit select 0,conv(11110, 2, 10), 'item9';

[root@yejr.me] [zhishutang]>select * from t_bit;
+----+----+-------+
| id | c1 | c2 |
+----+----+-------+
| 1 | 1 | item1 |
| 2 | 3 | item2 |
| 3 | 7 | item3 |
| 4 | 15 | item4 |
| 5 | 31 | item5 |
| 6 | 23 | item6 |
| 7 | 27 | item7 |
| 8 | 29 | item8 |
| 9 | 30 | item9 |
+----+----+-------+

[root@yejr.me] [zhishutang]>select * from t_bit where c1 = conv(11011,2,10);
+----+----+-------+
| id | c1 | c2 |
+----+----+-------+
| 7 | 27 | item7 |
+----+----+-------+

# 同时我们也注意到这个SQL是可以正常使用索引的
[root@yejr.me] [zhishutang]>desc select * from t_bit where c1 = conv(11011,2,10)\G
1. row **
id: 1
select_type: SIMPLE
table: t_bit
partitions: NULL
type: ref
possible_keys: c1
key: c1
key_len: 4
ref: const
rows: 1
filtered: 100.00
Extra: NULL

下面两种方法是B乎网友的回复,大家也可以参考下。

  1. 用JSON数据类型,然后利用JSON_CONTAINS()函数进行查询
  2. 用SET数据类型,然后利用FIND_IN_SET()函数进行查询

不过,JSON和SET这两种数据类型都不方便加索引以及利用索引扫描,即便是用了5.7的JSON+虚拟列功能,索引效率也是比较低的。而支持JSON数据类型 多值索引(multi-valued Indexes) 也要8.0.17 以上版本才支持。

3、总结

这样看来,总的来说,用二进制转十进制方式来解决本案例需求更为高效,也欢迎提出更多方案思路。



            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
负载均衡 前端开发 算法
聊聊高并发应用中电商秒杀场景的方案实现
聊聊高并发应用中电商秒杀场景的方案实现
720 0
|
9月前
|
编解码 开发框架 搜索推荐
《ArkUI框架:构建原生应用界面的效率革新引擎》
ArkUI是鸿蒙系统原生UI开发框架,采用简洁直观的声明式语法(基于ArkTS语言),极大提升开发效率。它内置丰富多样的UI组件库,支持一站式界面搭建;提供高效的布局系统,轻松应对多设备适配挑战;具备强大的动画与交互能力,助力打造沉浸式体验。同时,实时预览与调试工具加速开发迭代,与HarmonyOS深度融合,充分发挥分布式优势。ArkUI为开发者带来全方位效率提升,推动鸿蒙生态发展,引领UI开发新潮流。
425 0
|
6月前
|
敏捷开发 人工智能 数据可视化
从方法到工具:一文教会你用GTD工作法高效管理时间
在知识经济时代,GTD(Getting Things Done)时间管理理念成为提升效率的核心方法。本文深度解析GTD五步法(收集、处理、组织、回顾、执行),并测评7款主流工具(OmniFocus、Notion、板栗看板等),针对个人、中小团队及企业级用户需求提供选型建议。通过方法论与工具结合,助力实现高效任务管理与目标达成。
|
4月前
|
定位技术 数据处理 API
手把手教你怎么做人口密度热力图
本文介绍了使用Python和ArcGIS绘制人口密度地图的方法。Python部分包括地图数据获取、格式转换、数据整合及可视化;ArcGIS部分涵盖地图投影、数据连接、人口密度计算与图例设置。同时提供了C++代码用于数据分割,并介绍了如何利用高德API获取地址经纬度,实现地图标注。
|
8月前
|
机器学习/深度学习 人工智能 JSON
这个AI把arXiv变成代码工厂,快速复现顶会算法!Paper2Code:AI论文自动转代码神器,多智能体框架颠覆科研复现
Paper2Code是由韩国科学技术院与DeepAuto.ai联合开发的多智能体框架,通过规划、分析和代码生成三阶段流程,将机器学习论文自动转化为可执行代码仓库,显著提升科研复现效率。
1070 19
这个AI把arXiv变成代码工厂,快速复现顶会算法!Paper2Code:AI论文自动转代码神器,多智能体框架颠覆科研复现
|
SQL 存储 Apache
Apache Doris 3.0.3 版本正式发布
亲爱的社区小伙伴们,Apache Doris 3.0.3 版本已于 2024 年 12 月 02 日正式发布。该版本进一步提升了系统的性能及稳定性,欢迎大家下载体验。
497 16
|
存储
算数移位,逻辑移位以及循环移位
算数移位,逻辑移位以及循环移位
582 0
|
9月前
|
人工智能 自然语言处理 计算机视觉
StarVector:图像秒变矢量代码!开源多模态模型让SVG生成告别手绘
StarVector是由ServiceNow Research等机构联合开发的开源多模态视觉语言模型,能够将图像和文本转换为可编辑的SVG矢量图形,支持1B和8B两种规模,在SVG生成任务中表现出色。
834 0
StarVector:图像秒变矢量代码!开源多模态模型让SVG生成告别手绘
|
机器学习/深度学习 边缘计算 PyTorch
PyTorch 与边缘计算:将深度学习模型部署到嵌入式设备
【8月更文第29天】随着物联网技术的发展,越来越多的数据处理任务开始在边缘设备上执行,以减少网络延迟、降低带宽成本并提高隐私保护水平。PyTorch 是一个广泛使用的深度学习框架,它不仅支持高效的模型训练,还提供了多种工具帮助开发者将模型部署到边缘设备。本文将探讨如何将PyTorch模型高效地部署到嵌入式设备上,并通过一个具体的示例来展示整个流程。
3537 1
|
存储 JSON 关系型数据库
MySQL 5.x和MySQL 8.x到底有什么区别?
本文详细对比了MySQL 5.x与MySQL 8.x的主要区别,包括存储引擎改进、性能提升、SQL语法增强(如窗口函数、CTE、JSON支持)、安全性和权限管理、并发及锁机制、InnoDB引擎增强、复制与高可用性等方面的显著差异。通过具体示例展示了8.x版本在企业级应用和高并发场景下的优越表现,建议有条件时尽早升级至MySQL 8.x以充分利用其新特性。