文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

mysql多级分类设计

2023-09-03 21:36

关注

简介

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

解决方案

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

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

数据表结构

CREATE TABLE categories (    id INT PRIMARY KEY,    name VARCHAR(255),    parent_id INT,    level INT);

数据插入

在向分类表中插入数据时,我们可以根据父级分类的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;

层级字段方法的优缺点

优点:
缺点:

二. 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。
这些多出来的字段就是为了定义树的结构和层级。下面我们就来分析一下,每个字段的作用是什么

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

在这里插入图片描述

查询

新增

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

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

删除

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

更新

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

MPTT预排序算法优缺点

优点:
缺点:

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

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯