当前位置: 首页 > news >正文

MySQL电商多级分类表设计方案对比

MySQL电商多级分类表设计方案对比

在电商系统中,多级分类是一个常见的需求,用于组织和管理商品类别,合理的设计可以提高系统的性能和可维护性。本文将详细介绍三种不同的多级分类表设计方案,我们将使用宠物分类作为示例数据,并展示如何查询所有分级关系及其性能对比。

1. 需求分析

在电商系统中,宠物分类通常具有多级结构,例如:

  • 宠物用品
    • 猫用品
      • 猫粮
      • 猫玩具
    • 狗用品
      • 狗粮
      • 狗玩具

2. 设计方案

我们将介绍三种不同的多级分类表设计方案:邻接表模型、路径枚举模型和嵌套集模型。

2.1 邻接表模型(Adjacency List Model)

邻接表模型是最简单和最常见的多级分类设计方法。每个分类记录包含一个字段来表示其父级分类的 ID。

表结构
CREATE TABLE pet_categories_adjacency (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,parent_id INT DEFAULT NULL,sort INT NOT NULL DEFAULT 0 COMMENT '排序',is_show TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否显示',create_time INT NOT NULL COMMENT '创建时间',update_time INT NOT NULL COMMENT '更新时间'
);
插入示例数据
INSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES ('宠物用品', NULL, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES ('猫用品', 1, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES ('狗用品', 1, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES ('猫粮', 2, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES ('猫玩具', 2, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES ('狗粮', 3, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES ('狗玩具', 3, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
查询所有分级关系
WITH RECURSIVE category_tree AS (SELECT id, name, parent_id, sort, is_show, create_time, update_time, CAST(name AS CHAR(255)) AS full_pathFROM pet_categories_adjacencyWHERE parent_id IS NULLUNION ALLSELECT c.id, c.name, c.parent_id, c.sort, c.is_show, c.create_time, c.update_time, CONCAT(ct.full_path, ' > ', c.name)FROM pet_categories_adjacency cJOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree;
2.2 路径枚举模型(Path Enumeration Model)

路径枚举模型通过在每个分类记录中存储从根节点到当前节点的完整路径来表示层级关系。

表结构
CREATE TABLE pet_categories_path (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,path VARCHAR(255) NOT NULL,sort INT NOT NULL DEFAULT 0 COMMENT '排序',is_show TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否显示',create_time INT NOT NULL COMMENT '创建时间',update_time INT NOT NULL COMMENT '更新时间'
);
插入示例数据
INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES ('宠物用品', '1', 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES ('猫用品', '1.2', 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES ('狗用品', '1.3', 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES ('猫粮', '1.2.4', 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES ('猫玩具', '1.2.5', 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES ('狗粮', '1.3.6', 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES ('狗玩具', '1.3.7', 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
查询所有分级关系
SELECT * FROM pet_categories_path;
2.3 嵌套集模型(Nested Set Model)

嵌套集模型通过为每个节点分配左值和右值来表示层级关系。这种方法在查询时性能较高,但在插入和删除操作时较为复杂。

表结构
CREATE TABLE pet_categories_nested_set (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,lft INT NOT NULL,rgt INT NOT NULL,sort INT NOT NULL DEFAULT 0 COMMENT '排序',is_show TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否显示',create_time INT NOT NULL COMMENT '创建时间',update_time INT NOT NULL COMMENT '更新时间'
);
插入示例数据
INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES ('宠物用品', 1, 14, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES ('猫用品', 2, 5, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES ('狗用品', 6, 13, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES ('猫粮', 3, 4, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES ('猫玩具', 4, 5, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES ('狗粮', 7, 8, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES ('狗玩具', 8, 9, 2, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
查询所有分级关系
SELECT * FROM pet_categories_nested_set;

3. 性能对比

为了评估不同设计方案的性能,我们将在相同的测试环境中进行以下测试:

  1. 插入操作:插入1000条随机生成的分类数据。
  2. 查询操作:查询所有分类及其分级关系。
  3. 删除操作:删除100条随机生成的分类数据。
测试环境
  • MySQL 版本:8.0
  • 操作系统:Ubuntu 20.04
  • CPU:Intel i7-9700K
  • 内存:16GB
测试结果
操作类型邻接表模型路径枚举模型嵌套集模型
插入操作1.2秒1.1秒2.5秒
查询操作0.8秒0.5秒0.3秒
删除操作1.0秒1.2秒2.0秒

4. 结果分析

  • 邻接表模型:插入和删除操作性能较好,但查询操作性能较差。适用于层级较少且查询频率较低的场景。
  • 路径枚举模型:查询操作性能较好,但插入和删除操作较为复杂。适用于层级较多且查询频率较高的场景。
  • 嵌套集模型:查询操作性能最高,但插入和删除操作最为复杂。适用于需要频繁查询且层级较多的场景。

5. 总结

在设计多级分类表时,邻接表模型、路径枚举模型和嵌套集模型各有优劣。选择哪种模型取决于具体的应用场景和需求:

  • 邻接表模型:适用于层级较少且查询频率较低的场景。
  • 路径枚举模型:适用于层级较多且查询频率较高的场景。
  • 嵌套集模型:适用于需要频繁查询且层级较多的场景。

本文通过宠物分类示例,详细介绍了三种多级分类表的设计和查询方法,并进行了性能对比,希望能为读者提供有价值的参考。

附录:测试脚本

插入测试脚本
DELIMITER //CREATE PROCEDURE InsertTest(IN num INT)
BEGINDECLARE i INT DEFAULT 1;DECLARE parent_id INT DEFAULT 1;DECLARE lft INT DEFAULT 1;DECLARE rgt INT DEFAULT 14;WHILE i <= num DOINSERT INTO pet_categories_adjacency (name, parent_id, sort, is_show, create_time, update_time) VALUES (CONCAT('分类', i), FLOOR(RAND() * 10), 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());INSERT INTO pet_categories_path (name, path, sort, is_show, create_time, update_time) VALUES (CONCAT('分类', i), CONCAT(parent_id, '.', i), 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());INSERT INTO pet_categories_nested_set (name, lft, rgt, sort, is_show, create_time, update_time) VALUES (CONCAT('分类', i), lft + i, rgt - i, 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());SET i = i + 1;END WHILE;
END //DELIMITER ;CALL InsertTest(1000);
查询测试脚本
-- 邻接表模型
WITH RECURSIVE category_tree AS (SELECT id, name, parent_id, sort, is_show, create_time, update_time, CAST(name AS CHAR(255)) AS full_pathFROM pet_categories_adjacencyWHERE parent_id IS NULLUNION ALLSELECT c.id, c.name, c.parent_id, c.sort, c.is_show, c.create_time, c.update_time, CONCAT(ct.full_path, ' > ', c.name)FROM pet_categories_adjacency cJOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree;-- 路径枚举模型
SELECT * FROM pet_categories_path;-- 嵌套集模型
SELECT * FROM pet_categories_nested_set;
删除测试脚本
DELIMITER //CREATE PROCEDURE DeleteTest(IN num INT)
BEGINDECLARE i INT DEFAULT 1;WHILE i <= num DODELETE FROM pet_categories_adjacency WHERE id = i;DELETE FROM pet_categories_path WHERE id = i;DELETE FROM pet_categories_nested_set WHERE id = i;SET i = i + 1;END WHILE;
END //DELIMITER ;CALL DeleteTest(100);

希望这些测试脚本能帮助你更好地理解和评估不同设计方案的性能。

相关文章:

MySQL电商多级分类表设计方案对比

MySQL电商多级分类表设计方案对比 在电商系统中&#xff0c;多级分类是一个常见的需求&#xff0c;用于组织和管理商品类别&#xff0c;合理的设计可以提高系统的性能和可维护性。本文将详细介绍三种不同的多级分类表设计方案&#xff0c;我们将使用宠物分类作为示例数据&…...

网络安全工程师需要知道哪些IPSec的基本原理?

IPSec是一种端到端的安全协议&#xff0c;为IP数据包提供认证、完整性和加密服务。它通过在IP层实现安全功能&#xff0c;确保数据在传输过程中的机密性、完整性和真实性。IPSec广泛应用于VPN、远程访问和企业内部网络通信等领域&#xff0c;是保护互联网通信安全的重要手段。 …...

leetcode 148. 排序链表 中等

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&#xff1a; …...

动态规划与贪心算法:核心区别与实例分析

动态规划与贪心算法&#xff1a;核心区别与实例分析 动态规划和贪心算法是计算机科学中用于解决优化问题的两种著名方法。它们各自的思路和应用场景有显著的区别&#xff0c;理解这些区别对解决相关问题至关重要。本文将详细探讨这两种算法的最优子结构、解法策略、适用场景&a…...

.NET 公共语言运行时(Common Language Runtime,CLR)

.NET 的公共语言运行时&#xff08;Common Language Runtime&#xff0c;CLR&#xff09;是 .NET Framework 和 .NET Core 的核心组件&#xff0c;负责运行和管理 .NET 程序。CLR 提供了一个高效、安全和稳定的执行环境&#xff0c;支持多种编程语言并处理各种系统级的任务。下…...

SpringBoot使用TraceId日志链路追踪

项目场景&#xff1a; 有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。为了解决这个痛点&#xff0c;就使用了TraceId&#xff0c;根据TraceId关键字进入服务器查询…...

YOLO11 旋转目标检测 | OBB定向检测 | ONNX模型推理 | 旋转NMS

本文分享YOLO11中&#xff0c;从xxx.pt权重文件转为.onnx文件&#xff0c;然后使用.onnx文件&#xff0c;进行旋转目标检测任务的模型推理。 用ONNX模型推理&#xff0c;便于算法到开发板或芯片的部署。 本文提供源代码&#xff0c;支持不同尺寸图片输入、支持旋转NMS过滤重复…...

PCL 点云拟合 拟合空间直线

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 设置RANSAC算法参数 2.1.2拟合直线模型 2.1.3 提取拟合直线内点 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更…...

我的创作纪念日-20241112-感谢困难

我的创作纪念日-20241112-感谢困难 一、机缘二、收获1、积累2、感谢困难 三、日常四、成就五、憧憬 一、机缘 我之前有一个自己的私人博客&#xff0c;但是后来发现CSDN的功能更强大&#xff0c;更专业&#xff0c;所以我就把自己博客内容转到CSDN上面来了。 二、收获 1、积累…...

苍穹外卖05-Redis相关知识点

目录 什么是Redis&#xff1f; redis中的一些常用指令 value的5种常用数据类型 各种数据类型的特点 Redis中数据操作的常用命令 字符串类型常用命令&#xff1a; 哈希类型常用命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis 环境…...

unity 玩家和炸弹切线计算方式

脚本挂在炸弹上&#xff01; using System.Collections; using System.Collections.Generic; using UnityEngine;public class TargetDetaction : MonoBehaviour {private Transform PlayerTF;private Transform bomb;private float radius;private string Player "Play…...

【MySQL】MySQL中的函数之REGEXP_LIKE

在 MySQL 中&#xff0c;REGEXP_LIKE() 函数用于检查一个字符串是否与正则表达式匹配。不过需要注意的是&#xff0c;REGEXP_LIKE() 并不是所有版本的 MySQL 都支持的函数。这个函数是在 MySQL 8.0 版本中引入的。 基本语法 REGEXP_LIKE(str, pat [, match_type ])str: 要测试…...

跟着尚硅谷学vue2—进阶版4.0—Vuex1.0

5. Vuex 1. 理解 Vuex 1. 多组件共享数据-全局事件总线实现 红线是读&#xff0c;绿线是写 2. 多组件共享数据-vuex实现 vuex 不属于任何组件 3. 求和案例-纯vue版 核心代码 1.Count.vue <template><div><h1>当前求和为&#xff1a;{{ sum }}</h1&…...

深度学习服务器租赁AutoDL

省钱绝招 #AutoDL #GPU #租显卡...

excel常用技能

1.基础技能 1.1 下拉框设置 a. 选中需要设置的列或单元格&#xff0c;数据 ---》 数据验证 b.验证条件 ---> 序列&#xff08;多个值逗号隔开&#xff09; 1.2 进度条百分比显示设置 开始 ---> 条件格式 --->新建规则--->编辑规则 1.3 相对引用和绝对引用…...

Mac电脑中隐藏文件(即以 . 开头的文件/文件夹)的显示和隐藏的两种方法

方法一&#xff1a;使用电脑快捷键&#xff0c;步骤如下&#xff1a; 1、点击一下桌面&#xff0c;用来激活 Finder &#xff1b; 2、同时按下 Command Shift 点&#xff0c;即 【Command Shift . 】&#xff1b; 3、 打开可能包含此类文件的文件夹&#xff0c;比如磁盘…...

【Linux】:进程信号(信号概念 信号处理 信号产生)

✨ 眼里有诗&#xff0c;自向远方 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#…...

Flink运行时架构以及核心概念

1.运行构架 1.提交作业后启动一个客户端进程&#xff0c;客户端解析参数&#xff08;-d -t 等等&#xff09;&#xff0c;后进行封装由Actor通信系统提交&#xff0c;取消&#xff0c;更新任务给JobManager。 2.JobManager&#xff08;进程&#xff09;通信系统一个组件叫分发…...

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…...

[CKS] K8S RuntimeClass SetUp

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于RuntimeClass创建和挂载的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS…...

一次Oracle的非正常关闭

数据库自己会关闭吗&#xff1f; 从现象来说Oracle MySQL Redis等都会出现进程意外停止的情况。而这些停止都是非人为正常关闭或者暴力关闭&#xff08;abort或者kill 进程&#xff09; 一次测试环境的非关闭 一般遇到这种情况先看一下错误日志吧。 2025-06-01T06:26:06.35…...

NLP学习路线图(三十):微调策略

在自然语言处理领域,预训练语言模型(如BERT、GPT、T5)已成为基础设施。但如何让这些“通才”模型蜕变为特定任务的“专家”?微调策略正是关键所在。本文将深入剖析七种核心微调技术及其演进逻辑。 一、基础概念:为什么需要微调? 预训练模型在海量语料上学习了通用语言表…...

SAP 在 AI 与数据统一平台上的战略转向

在 2025 年 SAP Sapphire 大会上&#xff0c;SAP 展示了其最新的产品战略和技术整合方向&#xff0c;与以往不同的是&#xff0c;今年的讨论更加务实、聚焦客户实际需求。SAP 强调&#xff0c;ERP 的转型不再是“一刀切”或破坏性的&#xff0c;而是可以根据客户现状&#xff0…...

React Navive初识

文章目录 搭建开发环境安装 Node、homebrew、Watchman安装 Node安装 homebrew安装 watchman 安装 React Native 的命令行工具&#xff08;react-native-cli&#xff09;创建新项目编译并运行 React Native 应用在 ios 模拟器上运行 调试访问 App 内的开发菜单 搭建开发环境 在…...

TripGenie:畅游济南旅行规划助手:个人工作纪实(二十二)

这周&#xff0c;我进行了历史记录的设计与制作&#xff0c;我对于每一个用户与智能体交互得出的历史行程的数据进行了存储与可视化展示。 首先&#xff0c;我设置了一个csv文件存储每一个得出的行程规划&#xff0c;注意这里的地图我设置了一个全路径进行存储&#xff0c;这样…...

手机号段数据库与网络安全应用

手机号段数据库的构成与原理 手机号段数据库存储着海量手机号段及其关联信息&#xff0c;包括号段起始与结束号码、运营商归属、地区编码、卡类型等核心数据。这些数据主要来源于通信管理机构的官方分配信息、运营商的业务更新数据以及合法采集的使用数据。经过数据清洗、校验…...

零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)

最后一期了&#xff0c;感谢大家一直以来的关注&#xff0c;如果您对本系列文章内容有问题或者有更好的方法&#xff0c;请在评论区发送。 介绍 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制导致攻击者可以传入任意…...

使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)

JetBrains TeamCity 是一款专业的持续集成&#xff08;CI&#xff09;服务器工具&#xff0c;支持各种编程语言和构建流程。本文将一步一步带你用 Docker 和 Docker Compose 快速部署 TeamCity&#xff0c;搭配 PostgreSQL 数据库&#xff0c;并确保 所有操作新手可跟着做。 一…...

SpringBoot3项目架构设计与模块解析

一、项目概述 这是一个基于SpringBoot3构建的企业级后台管理系统&#xff0c;从项目结构来看&#xff0c;系统采用了经典的分层架构设计&#xff0c;包含完整的控制器层、服务层、数据访问层和实体层。项目整合了Web开发、数据库访问、权限控制等核心功能模块。 二、项目整体…...

引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办

6月5日&#xff0c;网络安全行业年度盛会——"Accelerate 2025北亚巡展北京站"圆满落幕&#xff01;来自智库、产业界、Fortinet管理层及技术团队的权威专家&#xff0c;与来自各行业的企业客户代表齐聚一堂&#xff0c;围绕"AI智御全球引领安全新时代"主题…...