返回顶部
首页 > 资讯 > 数据库 >mysql多级分类设计
  • 607
分享到

mysql多级分类设计

mysql 2023-09-03 21:09:27 607人浏览 泡泡鱼
摘要

简介 在数据库设计中,经常会遇到需要存储多级分类信息的情况,如商品分类、地区分类等。本文将详细介绍如何在Mysql中设计和管理多级分类数据 解决方案 一. 层级字段(Hierarchy Field)方

简介

数据库设计中,经常会遇到需要存储多级分类信息的情况,如商品分类、地区分类等。本文将详细介绍如何在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

您可能感兴趣的文档:

--结束END--

本文标题: mysql多级分类设计

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

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

猜你喜欢
  • mysql多级分类设计
    简介 在数据库设计中,经常会遇到需要存储多级分类信息的情况,如商品分类、地区分类等。本文将详细介绍如何在MySQL中设计和管理多级分类数据 解决方案 一. 层级字段(Hierarchy Field)方...
    99+
    2023-09-03
    mysql
  • 多属性、多分类MySQL模式设计
    一、导读 这是来自B乎的一个问答。 当数据同时具备多个属性/分类时,改如何设计表结构和查询? 二、需求描述 我偶尔也会逛逛B乎,看到一些感兴趣的话题也会回复下。 有一次,看到这样的一个话题: 链接:https://www.zhihu.c...
    99+
    2019-04-17
    多属性 多分类MySQL模式设计
  • asp.net多级分类统计列表怎么实现
    本篇内容介绍了“asp.net多级分类统计列表怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!aspx页面部分代码:<asp:S...
    99+
    2023-06-17
  • 专业级Vue 多级菜单设计
    目录引言1. 路由设计1.1 菜单设计1.2 路由数据1.3 外链问题2. 菜单表3. 前端菜单展示4. 菜单接口引言 老生常谈了! 今天我想来和大家聊聊这个前端的动态菜单,要如何设...
    99+
    2024-04-02
  • MySQL的多表设计
    一、外键约束  保证数据的完整性。  定义外键约束:可以直接在create语句中定义外键 foreign key 当前表名(字段名) references&...
    99+
    2024-04-02
  • MySql树形结构(多级菜单)查询设计方案
    背景 又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护 工作中(尤其是传统项目中)经常遇到这种需要,就是树形结构的查询(多级查询),常见的场景有:组织架构(用户部门)查询 和 多级菜单查询 比如,菜单...
    99+
    2023-09-03
    mysql 数据库 java 程序人生 后端
  • MySql树形结构(多级菜单)查询设计方案
    目录背景三级查询(层级固定,层级数少)多级查询(层级不固定/层级很深)遍历整个树:节点搜索(查找出这个节点所在的整个分支)总结背景 又很久没更新了,很幸运地新冠引发了严重的上呼吸道感染,大家羊过后注意休息和防护 工作中(...
    99+
    2023-03-03
    MySql树形结构查询 MySql树形结构
  • MySQL 分区表设计
    MySQL 分区表设计 1、分区表设计方案 当设计 MySQL 分区表时,需要考虑以下几个方面:分区策略、分区字段、分区数量和分区函数。下面是一个详细的示例,展示了如何设计和执行分区表的增删改查操...
    99+
    2023-10-05
    mysql 数据库 分区表 sql
  • MySQL中买菜系统的分类表设计技巧
    MySQL中买菜系统的分类表设计技巧引言:在购买食品的过程中,分类是十分重要的。对于一个买菜系统来说,分类表的设计是十分关键的一步。本文将介绍在MySQL中设计买菜系统的分类表的技巧,并提供具体的代码示例。一、分析需求在设计分类表之前,我们...
    99+
    2023-11-01
    MySQL 买菜系统 分类表设计
  • SpringBoot项目多层级多环境yml设计详解
    目录需求场景想要达到的效果实现需求场景 基础设施模块中有一些通用固定的基础配置。例如:日志的配置,Spring本身的配置以及MyBatis Plus相关的固定配置等等。 这些配置往...
    99+
    2023-03-01
    SpringBoot项目多层级多环境yml设计 SpringBoot yml设计
  • Angular中的多级依赖注入如何设计
    本篇内容介绍了“Angular中的多级依赖注入如何设计”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多级依...
    99+
    2024-04-02
  • JavaScript高级程序设计之基本引用类型
    目录1、Date2、RegExp3、原始包装类型前言: 引用值(对象)都是某个特定的引用类型的实例对象,例如 Date类型、Function类型,RegExp 正则表达式类型等等。J...
    99+
    2024-04-02
  • javascript设计模式之鸭子类型和多态
    目录1.鸭子类型2.多态2.1 java多态2.2 js多态总结本文参考曾探编写的JavaScript设计模式与开发实践 设计模式的实现都遵循一条原则,即“找出程序中变化...
    99+
    2024-04-02
  • SpringBoot项目多层级多环境yml设计的方法是什么
    本篇内容介绍了“SpringBoot项目多层级多环境yml设计的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需求场景基础设施模块...
    99+
    2023-07-05
  • 《MySQL高级篇》九、数据库的设计规范
    文章目录 1. 为什么需要数据库设计2. 范 式2.1 范式简介2.2 范式都包括哪些2.3 键和相关属性的概念2.4 第一范式(1st NF)2.5 第二范式(2nd NF)2.6 第三范式...
    99+
    2023-09-12
    数据库 mysql 设计规范
  • mysql设计概念、多表查询和事务操作实例分析
    本篇内容介绍了“mysql设计概念、多表查询和事务操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • 软件工程(十一) 系统设计分类
    我们知道需求规格说明书(SRS)落地之后, 就要开始着手系统设计了,看一下这个系统该如何来设计,并且如何实现。学习系统设计之前,需要先了解系统设计有哪些分类。 系统设计的分类如下 界面设计 结构化设计 面向对象设计(最重要) 1、界面设计...
    99+
    2023-08-30
    软件工程
  • 多级树形分类存储结构最佳实践
    ...
    99+
    2016-10-09
    多级树形分类存储结构最佳实践
  • ssm垃圾分类系统设计与实现毕业设计-附源码221511
                                                          摘  要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各...
    99+
    2023-09-14
    java php spring boot idea vue.js
  • Java设计模式的基本概念和分类
    这篇文章主要介绍“Java设计模式的基本概念和分类”,在日常操作中,相信很多人在Java设计模式的基本概念和分类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java设计模式的基本概念和分类”的疑惑有所帮助!...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作