MySQL树形结构设计

本文介绍了一种利用MySQL实现树形结构数据存储的方法。通过id、pid、path等字段的设计,实现了高效查询节点的上下级关系。适用于组织结构、产品分类等多种场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL树形结构设计

树形结构举例

假设要设计这样一个结构的数据库表

德源公司
	王某公司
		王XX负责人	
郫县打样店铺
	李XX店长
	值班人员1
代理商负责
	眉山邓总代理商
		眉山仁寿XX公司
			张XX业务员
		成都温江公司
			张XX业务
	邛崃房总代理区
		邛崃高新公司
			王XX负责人
			张XX技术员
		眉山XX公司
			李XX负责人
			何XX负责人

树形数据举例

表名t_manage_group,数据示例如下:

idpidpathnode_namenode_typenode_val
1/德源公司22001
21/1/王某公司22002
32/1/2王XX负责人33001
4/郫县打样店铺22003
54/4/李XX店长33002
64/4/值班人员133003
7/代理商负责1
87/7/眉山邓总代理商22008
98/7/8/眉山仁寿XX公司1
109/7/8/9/张XX业务员22010

字段说明:

  • id:当前记录的id
  • pid:当前记录的上级id(parent id的缩写)。
  • path:当前记录的路径(由id通过斜杠分隔组成,如:/1/2/)
  • node_name: 当前记录的名称 。
  • node_type: 当前记录中node_val的类型:1,仅名称(不需引用其它表);2,公司(node_val是其它表的id);3,人员(node_val是其它表的id)。
  • node_val: 当前记录需要关联到其它表时,使用的id。
--查询某个节点的直接下级,pid=xx就是id=xx的直接下级
select * from t_manage_group where pid=xx;

--查询某个节点的所有下级
select * from t_manage_group where path like "/xx/xx/%";

--查询某个节点的所有上级
select * from t_manage_group where path like "%/xx/xx/";

--查询某个节点的直接下级,并且类型为业务员(node_type=2)
select * from t_manage_group where pid=xx and node_type=2;

为什么这样设计

  • 顶层节点没有父节点id,填什么呢?不填,留空。
  • 顶层节点的路径(path),填什么?填“/”。
  • 有了pid字段,为什么还要路径(path)字段?用path字段,是为了方便查找某个节点的,所有直接上级或所有直接下级。
  • 路径(path)字段,为什么设计成以”/“开始也以”/“结尾?举个例就明白了:如果不以"/“结尾,查找”/1/10",结果”/1/1000"也会被命中,因为前面部分是一样的。
  • 这种树形结构设计单独用一张表,这样有什么好处?这样的好处是,要用树形时,加一张表,不用时去掉这张表,不影响其它功能。
  • 网上有很多树形结构,直接用id和pid来实现,没有用path,我加了path是为什么?为了直接使用path来找出上下级关系,数据库语句简单易懂,详见上在的sql查询示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值