惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Check Point Blog
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Secure Thoughts
Recorded Future
Recorded Future
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
The Blog of Author Tim Ferriss
B
Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
Arctic Wolf
T
The Exploit Database - CXSecurity.com
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
AWS News Blog
AWS News Blog
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
T
Troy Hunt's Blog
I
InfoQ
L
LINUX DO - 热门话题
WordPress大学
WordPress大学
C
Cisco Blogs
G
GRAHAM CLULEY
The Register - Security
The Register - Security
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Schneier on Security
Schneier on Security
Project Zero
Project Zero
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Privacy & Cybersecurity Law Blog
Cloudbric
Cloudbric
H
Hacker News: Front Page
小众软件
小众软件
雷峰网
雷峰网
The Hacker News
The Hacker News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Tor Project blog
博客园 - 聂微东
N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
The GitHub Blog
The GitHub Blog
腾讯CDC
P
Palo Alto Networks Blog
Scott Helme
Scott Helme

博客园 - nuccch

在Cursor中读取飞书文档 使用GIMP去除水印的有效方法 如何基于VSCode打造Java开发环境 在IDEA中配置注释模板 在Windows中使用Linux系统 如何理解和认识设计模式 申请Let's Encrypt免费HTTPS证书的方法 为GIT仓库项目设置独立配置参数 DBeaver设置不断开连接 构建工具Gradle入门实践 如何在Maven中排除依赖传递 87键键盘的数字键对应快捷键含义 关于Java JSON库的选择 解决mybatis批量更新慢问题 解决Spring Cloud Gateway中使用CompletableFuture.supplyAsync()执行Feign调用报错 Spring Boot框架中在Controller方法里获取Request和Response对象的2种方式 解读Spring Boot框架中不同位置抛出异常的处理流程 探究Spring Boot框架中访问不存在的接口时触发对error路径的访问 Spring Cloud工程中使用Nacos配置中心的2种方式 Swagger开启账号验证访问
树形层级结构的数据库表设计方案
nuccch · 2026-02-27 · via 博客园 - nuccch

树形层级结构,在业务开发中经常碰到,比如部门组织,用户分组等等。
将这种带层级结构的数据保存到关系型数据库中时,如何设计表结构,才能满足高效率的查询需求,是一个常见的开发设计痛点。
如下是在实际开发中可以参考的一个数据表结构DDL定义:

-- 用户分组信息信息表
CREATE TABLE `user_group` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分组名称',
  `parent_id` bigint NOT NULL DEFAULT '0' COMMENT '组上级id',
  `level` tinyint NOT NULL DEFAULT '1' COMMENT '层级',
  `route` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '层级id列表',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0 否 1 是',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
);

parent_id等于0时为一级分组,level表示所在层级(1表示1级),route保存从一级分组到当前分组的id列表(层级分组id使用英文逗号分割,如:100,102,104),如此设计之后可以很方便地满足如下查询需求:

  1. 查询当前分组所在的一级分组信息时,直接从route字段就可以解析出对应的一级分组id,也可以很方便地从route字段中解析出当前分组的上级分组id。
  2. 使用递归方式查询指定分组节点及其所有子节点列表。
-- 查询id为404的分组节点及其所有子节点列表
SELECT DATA.* FROM (
SELECT @ids AS _ids,
(SELECT @ids := GROUP_CONCAT( id ) FROM user_group WHERE FIND_IN_SET( parent_id, @ids ) and is_deleted = 0) AS cids,
@l := @l + 1 AS level from user_group, ( SELECT @ids := 404, @l := 0 ) b
where @ids IS NOT null ) ID,
user_group DATA
WHERE FIND_IN_SET(DATA.id, ID._ids)
ORDER BY id

另外也需要注意:控制层级深度,比如最大层级深入为5层,如果无限制的话可能会影响查询效率。