美文网首页
关于无限级分销的数据库设计

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

作者: 生命的点点滴滴 | 来源:发表于2020-08-15 15:45 被阅读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;
    

    相关文章

      网友评论

          本文标题:关于无限级分销的数据库设计

          本文链接:https://www.haomeiwen.com/subject/cmeadktx.html