【MySQL】無限層級數據表設計

需求:

用戶A介紹B入會,B成爲A的下線,B再發展C、D等下線,C、D也允許發展下線,不限制層級,但是沒個人只允許有一個上線;

類似“傳銷”;

典型的樹結構;

 問題:

快速查詢某人的所有上線;

快速查詢某人的所有下線;

快速爲某人增加一個下線;

方案有以下四種,各自的定義和利弊請看:前輩的文檔

一、鄰接表:依賴父節點

二、路徑枚舉

三、嵌套集

四、閉包表

現在,只針對 “閉包表” 設計,實現以上需求

-- 會員信息表
-- 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');

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章