【MySQL】无限层级数据表设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_33261247/article/details/91492396

需求:

用户A介绍B入会,B成为A的下线,B再发展C、D等下线,C、D也允许发展下线,不限制层级,但是没个人只允许有一个上线;

类似“传销”;

典型的树结构;

 问题:

快速查询某人的所有上线;

快速查询某人的所有下线;

快速为某人增加一个下线;

方案有以下四种,各自的定义和利弊请看:前辈的文档

一、邻接表:依赖父节点

二、路径枚举

扫描二维码关注公众号,回复: 6442305 查看本文章

三、嵌套集

四、闭包表

现在,只针对 “闭包表” 设计,实现以上需求

-- 会员信息表
-- level 字段说明:相对于第一个用户的等级。
-- 	譬如:用户A介绍B入会,B成为A的下线,由此用户A的等级是1,用户B的等级是2
CREATE TABLE IF NOT EXISTS `members` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',
	`uid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '用户id',
	`level` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '会员等级',
	`add_time` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间',
	PRIMARY KEY (`id`),
	KEY `uid` (`uid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='会员信息表';

-- 会员级别关联表
CREATE TABLE IF NOT EXISTS `member_relation` (
	`uid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '用户id',
	`puid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '阶梯等级上的用户id',
	UNIQUE KEY `uid` (`uid`,`puid`),
	KEY `uid_2` (`uid`),
	KEY `puid` (`puid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='会员级别关联表';

 需求分析

-- 快速查询某人的所有上线:
SELECT * FROM members WHERE uid IN (SELECT puid FROM member_relation WHERE uid = '用户ID');

-- 快速查询某人的所有下线:
SELECT * FROM members WHERE uid IN (SELECT uid FROM member_relation WHERE puid = '用户ID');

-- 快速为某人增加一个下线:
INSERT INTO `members`(`uid`, `level`, `add_time`) VALUES ('用户ID', '上级用户等级+1', UNIX_TIMESTAMP());
INSERT INTO `member_relation`(`uid`, `puid`) SELECT '用户ID' AS uid,puid FROM member_relation WHERE uid = '上级用户ID';
INSERT INTO `member_relation`(`uid`, `puid`) VALUES ('用户ID', '上级用户ID');

猜你喜欢

转载自blog.csdn.net/sinat_33261247/article/details/91492396