需求:
用戶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');