我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql多级分类设计

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql多级分类设计

简介

在数据库设计中,经常会遇到需要存储多级分类信息的情况,如商品分类、地区分类等。本文将详细介绍如何在MySQL中设计和管理多级分类数据

解决方案

一. 层级字段(Hierarchy Field)方法

层级字段方法是最常见和简单的多级分类设计方法之一。它通过在分类表中添加一个表示层级关系的字段来实现。每个分类记录包含一个字段来表示其父级分类的ID

数据表结构

CREATE TABLE categories (    id INT PRIMARY KEY,    name VARCHAR(255),    parent_id INT,    level INT);
  • id:分类ID,作为主键
  • name:分类名称
  • parent_id:父级分类的ID
  • level:分类所处的层级

数据插入

在向分类表中插入数据时,我们可以根据父级分类的ID来设置相应的层级字段和层级信息。

例如,插入三级分类数据的示例:

INSERT INTO categories (id, name, parent_id, level) VALUES(1, '电子产品', NULL, 1),(2, '手机', 1, 2),(3, '平板电脑', 1, 2),(4, '苹果手机', 2, 3),(5, '华为手机', 2, 3),(6, 'iPad', 3, 3),(7, '安卓平板', 3, 3);

查询分类

使用层级字段方法,可以轻松地进行分类的查询。例如,要获取所有二级分类的手机列表,可以执行以下查询:

SELECT * FROM categories WHERE level = 2 AND parent_id = 1;

层级字段方法的优缺点

优点:
  • 简单直观,易于理解和实现
  • 查询和操作单个层级的分类很高效
缺点:
  • 难以处理复杂的层级关系,如循环引用或动态变化的层级
  • 查询多级分类和递归操作时,性能可能受到影响
  • 从根节点进行递归查询,时间复杂度是 O(n)

二. MPTT预排序算法

什么是MPTT算法?

MPTT算法是一种用于处理树状结构数据的算法,其中MPTT代表Modified Preorder Tree Traversal(修改的先序遍历树遍历)。它通过为树中的每个节点分配一个预排序值来组织和表示树的结构。这种预排序值允许我们以一维的方式存储和操作树,同时保持树的层次结构和父子关系。
MPTT 正是为了解决多层级关系数据的查询效率问题,它的时间复杂度竟然能高效到一个常量,即 O(1)

MPTT算法的原理

MPTT算法的原理很简单,它通过以下几个步骤来为树节点分配预排序值:

  1. 初始化左值和右值为1
  2. 对树进行深度优先搜索(DFS)的先序遍历
  3. 遍历到一个节点时,将该节点的左值设为当前左值,并将当前左值加1
  4. 递归处理节点的每个子节点
  5. 当处理完所有子节点后,将节点的右值设为当前左值,并将当前左值加1

通过这个过程,我们可以为每个节点分配唯一的左值和右值,从而形成树的预排序遍历结构。

MPTT分析

以下是django-mptt模块定义的一个部门

from mptt.models import MPTTModel, TreeForeignKeyclass Department(MPTTModel):    """组织"""    name = models.CharField("组织名称", max_length=255)    # 部门标识,不同于自增 id,多数情况存储各个公司组织架构系统的id, 非必须    code = models.CharField("组织标识", null=True, blank=True, unique=True, max_length=64)    parent = TreeForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, related_name="children")    order = models.IntegerField("顺序", default=1)    profiles = models.ManyToManyField(Profile, blank=True, related_name="departments", verbose_name="成员")    enabled = models.BooleanField("是否启用", default=True)    extras = JSONField("额外信息", default={})    category_id = models.IntegerField("用户目录ID", null=True, blank=True)    class Meta:        ordering = ["id"]        verbose_name = "组织表"        verbose_name_plural = "组织表"        index_together = [            ["tree_id", "lft", "rght"],            ["parent_id", "tree_id", "lft"],        ]

在上述代码中,在进行数据库迁移后,数据库里面额外多出了 5个字段,分别是: lft、rgt、level、tree_id、parent_id。
这些多出来的字段就是为了定义树的结构和层级。下面我们就来分析一下,每个字段的作用是什么

  • tree_id:树的 id,用来区分数据库中众多树的某一颗树。
  • level:一颗标准的树会有高度、深度、层级,根节点的层级是 1,子节点的层级是父节点层级加 1
  • parent_id:父 id,节点的父级 id,根节点没有父节点,所以值为 NULL
  • lft:节点左值
  • rgt:节点右值。

树结构如下:
在这里插入图片描述

在这里插入图片描述

查询

  • 遍历整棵树:
    遍历整棵树只需要查找 tree_id 等于 1 的条件即可

  • 某节点下所有的子孙节点:
    查找节点 4 的所有子孙节点,以 4 作为参考点。左值大于 6 且右值小于 11 的所有子孙节点,就是节点 4 的所有子孙节点。

  • 找到某节点下所有的子节点
    查找节点 1 的所有子节点,以 1 作为参考点。tree_id 等于 1 且 level 等于 2

  • 查找某节点的路径
    查找节点 9 的所有上级路径,以 9 作为参考点。左值小于 14 且右值大于 15 的所有节点,就是节点 ``9的路径。结果是:1 -> 7 -> 8 -> 9`。

新增

MPTT 在遍历的时候很快,但是其他的操作就会变得很慢,所以使用 MPTT 要尽量避免查询之外的其他操作,这是因为节点在插入、更新(移动)、删除会破坏树的平衡。所以在做这些操作的时候需要对数进行调整,达到新的平衡

以新增节点操作为例,算法可分解为以下几个步骤:

  • 如果要在不存在的树中新增节点,即要创建一颗新树。那么它是没有 parent_id 的,所以 parent_id 值为 NULL,level 是 1,tree_id 是根据已有树的最大 tree_id 加 1
  • 如果要在已存在的树中新增节点。那么它的 parent_id 是父节点的 id,level 是父节点的 level 加 1,tree_id 和父节点保持一致。
  • 修复被破坏平衡的其他节点的左值。大于 parent_id 右值的所有节点的左值加 2
  • 修复被破坏平衡的其他节点的右值。大于等于 parent_id 右值的所有节点的右值加 2

删除

和增加类似,只不过删除一个节点以后对左值和右值进行相反的操作,即减 2

更新

更新(移动)其实就是删除一个老节点,再新增一个新节点,具体算法参考上面的例子

MPTT预排序算法优缺点

优点:
  • 查询操作较多的场景,查询的效率不受分类层级的增加的影响,为o(1)
缺点:
  • 随着数据的增多,每增删数据,都要同时操作多条受影响数据,执行效率逐渐下降

来源地址:https://blog.csdn.net/qq_40861391/article/details/131001468

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql多级分类设计

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

asp.net多级分类统计列表怎么实现

本篇内容介绍了“asp.net多级分类统计列表怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!aspx页面部分代码:
2023-06-17

MySql树形结构(多级菜单)查询设计方案

目录背景三级查询(层级固定,层级数少)多级查询(层级不固定/层级很深)遍历整个树:节点搜索(查找出这个节点所在的整个分支)总结背景又android很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护工作中(尤其是
2023-03-03

MySQL中买菜系统的分类表设计技巧

MySQL中买菜系统的分类表设计技巧引言:在购买食品的过程中,分类是十分重要的。对于一个买菜系统来说,分类表的设计是十分关键的一步。本文将介绍在MySQL中设计买菜系统的分类表的技巧,并提供具体的代码示例。一、分析需求在设计分类表之前,我们
MySQL中买菜系统的分类表设计技巧
2023-11-01

软考中级软件设计师分数怎么算?多少分算过

软考中级软件设计师的分数计算方式及合格标准,是考生备考过程中需要重点关注的内容。软考中级软件设计师分数怎么计算的呢?考生考到多少分算过呢?具体请见下文。
软考中级软件设计师分数怎么算?多少分算过
2024-08-23

SpringBoot项目多层级多环境yml设计详解

这篇文章主要为大家介绍了SpringBoot项目多层级多环境yml设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-01

软件设计师多少分及格?

  软件设计师多少分及格?只有考试合格才能拿到软件设计师的资格证书,那么软件设计师及格分数线到底是多少呢?  软件设计师多少分及格?  软件设计师属于软考中级,近几年的合格标准基本稳定在各个科目45分以上(含45分)。如果按照这个分数线的标准,那么软件设计师考试的两个科目都达到了45分的话就能通过考试了。  软考的合格
软件设计师多少分及格?
2024-04-18

软件设计师满分是多少

  软件设计师包含两个考试科目,各科目满分均为75分。软件设计师合格标准基本上稳定在各科目45分合格,单科及格成绩不保留,也不能转到下次考试时使用。今天编程学习网小编来为大家说说。  软件设计师属于软考中级资格考试,软件设计师考试包含基础知识与应用技术,各科目满分均为75分,合格标准基本上稳定在45分,单科及格成绩不保留,
软件设计师满分是多少
2024-04-18

多媒体应用设计师多少分合格

  45分及格。软考多媒体应用设计师包含两个考试科目,各科目及格分数线基本上稳定在45分。多媒体应用设计师需要在一次考试中各科目都及格才算合格,单科及格的成绩不保留。  多媒体应用设计师属于软考中级资格考试,多媒体应用设计师考试包含基础知识与应用技术两个科目,各科目及格分数线基本上稳定在45分。软考多媒体应用设计师考试
多媒体应用设计师多少分合格
2024-04-18

软考软件设计师多少分算过?满分是多少分

软考软件设计师考试是软考(计算机技术与软件专业技术资格(水平)考试)的一个级别,用于评估考生在软件设计方面的专业能力。软考软件设计师多少分算过?满分是多少分呢?具体请见下文。
软考软件设计师多少分算过?满分是多少分
2024-08-18

Springboot 多级缓存设计与实现方案

Springboot多级缓存设计与实现方案旨在提高应用程序性能。其策略涉及在不同层使用缓存:一级缓存(L1):内存中,速度快、容量小。二级缓存(L2):SSD,速度稍慢、容量较大。三级缓存(L3):磁盘中,速度最慢、容量最大。Springboot通过CacheManager和Cache接口实现多级缓存,允许开发人员在方法或类上启用缓存并指定缓存名称和属性。多级缓存的好处包括提高性能、减少延迟和提高可扩展性。通过遵循最佳实践,如使用合理的缓存大小和evict策略,开发人员可以优化缓存行为并提供更好的用户体验
Springboot 多级缓存设计与实现方案
2024-04-02

多媒体应用设计师是不是计算机几级

  多媒体应用设计师不是计算机几级,因为多媒体应用设计师不属于计算机等级考试,而属于软考。软考属于职业资格考试,又是职称资格考试,有了软考证书,也就具备了聘任相应级别的职称资格。  多媒体应用设计师属于软考,软考全称计算机技术与软件专业技术资格(水平)考试,既是职业资格考试,又是职称资格考试,与计算机等级考试属于两者不
多媒体应用设计师是不是计算机几级
2024-04-19

多媒体应用设计师是不是计算机一级

  不是。多媒体应用设计师不是计算机一级,也不属于计算机等级考试。多媒体应用设计师属于软考,软考既是职业资格考试,又是职称资格考试,它主要是针对有一定计算机技术水平、从事计算机行业以及要评职称等人群。  软考多媒体应用设计师并不是计算机等级考试,软考全称计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保
多媒体应用设计师是不是计算机一级
2024-04-19

多媒体应用设计师是不是计算机二级

  不是。多媒体应用设计师不是计算机等级考试,两者考试性质也不相同。多媒体应用设计师属于软考,软考既是职业资格考试,又是职称资格考试,它主要是针对有一定计算机技术水平、从事计算机行业以及要评职称等人群。  软考包含多个级别的资格考试,而多媒体应用设计师属于软考其中一个级别的资格考试,软考全称计算机技术与软件专业技术资格
多媒体应用设计师是不是计算机二级
2024-04-19

多媒体应用设计师是不是计算机四级

  不是。多媒体应用设计师不是计算机等级考试,多媒体应用设计师属于软考,软考既是职业资格考试,又是职称资格考试,它主要是针对有一定计算机技术水平、从事计算机行业以及要评职称等人群。  多媒体应用设计师属于软考,软考全称计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部(原人事部)、工业和信息化部(原
多媒体应用设计师是不是计算机四级
2024-04-19

编程热搜

目录