返回顶部
首页 > 资讯 > 数据库 >多属性、多分类MySQL模式设计
  • 113
分享到

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

多属性多分类MySQL模式设计 2019-04-17 14:04:30 113人浏览 无得
摘要

一、导读 这是来自B乎的一个问答。 当数据同时具备多个属性/分类时,改如何设计表结构和查询? 二、需求描述 我偶尔也会逛逛B乎,看到一些感兴趣的话题也会回复下。 有一次,看到这样的一个话题: 链接:https://www.zhihu.c

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

二、需求描述
我偶尔也会逛逛B乎,看到一些感兴趣的话题也会回复下。 有一次,看到这样的一个话题:

链接:https://www.zhihu.com/questio...

[Mysql] 当数据同时属于多个分类时,该怎么查询?

分类cate字段为[1,2,3,4,5] ,假如要查询满足分类’2’和’5′ 的数据该怎么查询? 我尝试过用 cate like ‘%2%’ AND cate like ‘%5%’去查。 想问有没有更好的办法,我这样写数据少了还好,多了根本没法查,效率太低了。

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

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

(一)用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                 |
+--------------------+--------------------+

然后,只需要对该列用十进制值进行查询比对就行 6、现在如果想判断是否同时具备2、5两个分类属性时,其二进制表示为01001,转成十进制为9,只需要用条件 where c1=9 即可

我们来演示一下:

[root@yejr.me] [zhishutang]>show create table t_bitG

*************************** 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 以上版本才支持。

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


延伸阅读

  • Multi-Valued Indexes
  • The SET Type
您可能感兴趣的文档:

--结束END--

本文标题: 多属性、多分类MySQL模式设计

本文链接: https://lsjlt.com/news/2926.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 多属性、多分类MySQL模式设计
    一、导读 这是来自B乎的一个问答。 当数据同时具备多个属性/分类时,改如何设计表结构和查询? 二、需求描述 我偶尔也会逛逛B乎,看到一些感兴趣的话题也会回复下。 有一次,看到这样的一个话题: 链接:https://www.zhihu.c...
    99+
    2019-04-17
    多属性 多分类MySQL模式设计
  • mysql多级分类设计
    简介 在数据库设计中,经常会遇到需要存储多级分类信息的情况,如商品分类、地区分类等。本文将详细介绍如何在MySQL中设计和管理多级分类数据 解决方案 一. 层级字段(Hierarchy Field)方...
    99+
    2023-09-03
    mysql
  • 【设计模式】揭秘 VUE 计算属性中的设计模式
    Observer 模式 Observer 模式是一种设计模式,允许对象观察另一个对象的内部状态并做出相应的反应。在 VUE 中,我们可以使用计算属性来实现 Observer 模式。当被观察对象的属性发生改变时,计算属性会自动重新计算并触...
    99+
    2024-02-20
    VUE 计算属性 设计模式 Observer 模式 Memoization 模式 State 模式
  • javascript设计模式之鸭子类型和多态
    目录1.鸭子类型2.多态2.1 java多态2.2 js多态总结本文参考曾探编写的JavaScript设计模式与开发实践 设计模式的实现都遵循一条原则,即“找出程序中变化...
    99+
    2024-04-02
  • Java多线程之读写锁分离设计模式
    主要完成任务: 1.read read 并行化 2.read write 不允许 3.write write 不允许 public class Rea...
    99+
    2024-04-02
  • TypeScript中设计模式有多少种
    小编给大家分享一下TypeScript中设计模式有多少种,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有5种,设计模式是可以帮助开发人员解决问题的模板。在本中涉及...
    99+
    2023-06-15
  • Java多线程之Future设计模式
    目录Future -> 代表的是未来的一个凭据AsynFuture -> Future具体实现类FutureService -> 桥接Future和FutureTa...
    99+
    2024-04-02
  • Java多线程 Guarded Suspension设计模式
    目录1.Guarded Suspension模式的结构2. Guarded Suspension模式的简单实现前言: Guarded Suspension意为保护暂停,其核心思想是仅...
    99+
    2024-04-02
  • Java多线程 Producer and Consumer设计模式
    目录 producer是生产者的意思:指生产数据的线程, consumer是消费者的意思:指的是使用数据的线程 public class ProducerThr...
    99+
    2024-04-02
  • python设计模式之单例模式你了解多少
    目录单例模式概念单例模式使用场景python实现单例模式 总结单例模式 概念 单例模式:“保证一个类仅有一个实例,并提供一个访问它的在这里插入代码片全局访问点。 单例模式会...
    99+
    2024-04-02
  • javascript设计模式中鸭子类型和多态怎么实现
    这篇文章主要介绍“javascript设计模式中鸭子类型和多态怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript设计模式中鸭子类型和多态怎么实现”文章能帮助大家解决问题。1....
    99+
    2023-06-26
  • MySQL的多表设计
    一、外键约束  保证数据的完整性。  定义外键约束:可以直接在create语句中定义外键 foreign key 当前表名(字段名) references&...
    99+
    2024-04-02
  • Java多线程中读写锁分离设计模式怎么用
    小编给大家分享一下Java多线程中读写锁分离设计模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要完成任务:read read 并行化read writ...
    99+
    2023-06-25
  • Java多线程中Future设计模式怎么用
    这篇文章将为大家详细讲解有关Java多线程中Future设计模式怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Future -> 代表的是未来的一个凭据public interfac...
    99+
    2023-06-25
  • java中设计模式(多例)的实例详解
    java中设计模式(多例)的实例详解多例:单例设计模式的变形,可以看成是一个缓存池的单例,而缓存池里面可以存多个数据实例代码://单例+缓存---没有控制池大小public class A { //1创建一个单例的池(private即把池...
    99+
    2023-05-31
    java 多例 ava
  • Java特性之设计模式【策略模式】
    一、策略模式 概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随...
    99+
    2023-10-18
    策略模式 java 设计模式
  • Java设计模式的基本概念和分类
    这篇文章主要介绍“Java设计模式的基本概念和分类”,在日常操作中,相信很多人在Java设计模式的基本概念和分类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java设计模式的基本概念和分类”的疑惑有所帮助!...
    99+
    2023-06-16
  • springdataJPA中的多属性排序方式
    目录spring data JPA的多属性排序第一步,引包第二步,service方法代码spring data JPA排序问题(order by)spring data JPA的多属...
    99+
    2024-04-02
  • Java多线程如何使用Guarded Suspension设计模式
    这篇文章主要介绍“Java多线程如何使用Guarded Suspension设计模式”,在日常操作中,相信很多人在Java多线程如何使用Guarded Suspension设计模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-25
  • web设计模式有哪些类
    这篇文章主要讲解了“web设计模式有哪些类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web设计模式有哪些类”吧!足够简单的类上述设计在输出内容简单的时候没有什么问题,当输入内容比较复杂的...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作