关于无限级分销的数据库设计

2020-08-15  本文已影响0人  生命的点点滴滴

起始

最近公司要搞分销,涉及到数据库的表设计没有好的思路,故上网搜索,发现了一篇比较好的文章,故记录一下 ==》无限级分销文章。

数据库的表设计

看过文章后选择的策略是闭包模式, 创建两张表:

  1. 用户表
CREATE TABLE `sys_member` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '姓名' ,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
  1. 关系表
CREATE TABLE `sys_member_relation` (
    `ancestor_id` BIGINT(20) UNSIGNED NOT NULL COMMENT '祖先ID' ,
    `descendant_id` BIGINT(20) UNSIGNED NOT NULL COMMENT '子孙ID' ,
    `level` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' COMMENT '扩展等级表' ,
    PRIMARY KEY (`ancestor_id`, `descendant_id`),
    INDEX `i_sys_member_relation_descendant_id` (`descendant_id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;

添加测试数据

  1. 用户表为了区分层级,姓名做了处理,如下图:


    sys_member.png
  2. 用户关系表的数据如下:


    relation.png

表的操作

添加操作

用户表添加了 李四_3, 关系表的添加操作如下:

INSERT INTO sys_member_relation (ancestor_id, descendant_id, LEVEL) SELECT ancestor_id, 7, level + 1 FROM sys_member_relation  WHERE descendant_id = 2 UNION ALL SELECT 7, 7, 0;

查询操作

  1. 查询某个关系的所有数据
SELECT m.*  FROM  sys_member_relation r JOIN sys_member m ON m.id = r.descendant_id WHERE r.ancestor_id = 2 ;
  1. 查询所有下线
SELECT m.*  FROM  sys_member_relation r JOIN sys_member m ON m.id = r.descendant_id WHERE r.ancestor_id = 2 AND r.level > 0;
  1. 查询 李四_2_1 的所有上线
SELECT m.*  FROM  sys_member_relation r JOIN sys_member m ON m.id = r.ancestor_id WHERE r.descendant_id = 6 AND LEVEL > 0;
上一篇下一篇

猜你喜欢

热点阅读