分销系统的用户关系,用户与推广链接的数据库设计。设计思路

简单点说二三级分销系统,

  1、用户通过分享链接促成商品卖出,获取到一定比例的商品利润。
   2、用户促成交易获得一定比例的利润时,其上级用户也会获得一定比例的利润。

   对于本人所设计的分销系统,与二三级分销系统还是有很大的差别,

只要是上级用户,其下级或无线下级的用户一旦获取利润,其都可以获得一定利润比咧,而类似于微信的二三级分销系统,是只有连续的三级用户才可以获得利润。

这里只为解决这些需求所带来的技术难题,不做实际应用。

由上我们可以分析出一些内容

  数据库设计方面:用户表的设计,用户的上下级关系如何设计,推广链接的数据库存储,用户与推广链接的数据存储

  网上看到用户上下级关系有很多存储方式,

  比如:

方法一、

用一个tree字段存储字符串来表示该节点的父级关系,比如A用户是根节点,则tree字段存储的值为 "/" 

表示A根节点为空。

A是B用户的上级,则用户B的数据库中tree为 "/A/" , 

B用户的下级是C用户,则C的tree 是 "/A/B/"

这样要数据库查找A的所有子节点数据的时候sql语句为:

SELECT * FROM user WHERE tree like '/A/%'

将查询出来的数据进行递归遍历。

这样可以很简单的查询出A的子节点数据,大部分公司都是采用这种 id, parent_id, tree(或者叫字段:parent_ids) 方式进行树型数据设计

如果要找到当前用户的所有上级用户,如查找C用户上级  ,  则可以直接使用用户数据的tree字段,使用 / 分隔符进行分割,按照前后顺序,分割后的元素顺序就是C的父节点路径

 

这个查找上下级时间复杂度是O(n),但是新增一个下级用户,或删除下级用户时,这个操作可能会变了很复杂,要修改所有相关的tree字段

 

方法二、

  还有一种引入左右值数据的方法,也就是增加left和right字段

基于Tree的前序遍历的无递归查询、无限分组的左右值编码方法

图片来源链接

https://www.cnblogs.com/huey/archive/2015/05/21/4518979.html

 

左右值编码方法还不会使用,只能暂时放弃,看的头晕怎么破啊

资料来源:https://blog.csdn.net/monkey_d_meng/article/details/6647488

 

最后本人还是使用相对原始的方法,

方法三、

  继承关系,

设置一个Parent_id的方式进行树的存储,

用递归的方式进行遍历某个节点的子孙节点,获得节点的唯一一条父节点列表。

 

写的一个大概得代码描述,可以借鉴

补充下遍历下级用户的方法,但数据返回给前端后有点复杂,要js循环解析json数据

/**
     * 
     * @param id
     * @return
     */
    public JSONArray searchSubCustomer(int id) {

        /**
         * 这里只查询用户下一级的子用户。
         * 有数据情况下,遍历其子用户,
         * 当如果该用户没有子用户,即返回为null时,直接返回null并且结束这个方法,可在for循环中看到逻辑处理
         */

// 这部分sql查询,按照自己的方法数据库查询,这个查询是调用JFinal框架的ActiveRecordPlugin 这个插件进行数据库查询 List<Customer> customerList = Customer.dao .find("SELECT * FROM customer WHERE id IN (SELECT id FROM customer WHERE parent_id=?)", id); if (customerList == null) { return null; } JSONArray jsonArray = new JSONArray();//这个用来保存所有的数据集,嵌套使用 for (Customer customer : customerList) { //这个通过传递用户id,进行递归查找其所有下级用户。如果返回null,说明其没有下级,直接将 //它自己放进jsonArray数据中。 JSONArray temp = searchSubCustomer(customer.getInt("id")); JSONObject jsonObject = new JSONObject(); if (temp == null) { //没有下级,直接放自己 jsonObject.put("self", customer); jsonArray.add(jsonObject); } else { //有下级,放自己的同时,另起一个subUser为key放所有下级 jsonObject.put("self", customer); jsonObject.put("subUser", temp); jsonArray.add(jsonObject); } } return jsonArray; }

获得的结果类似于下面结构,如果没有下级直接返回空,即[ ]

只有一个下级则会返回下级本身,即 [ {self:下级对象} ]

如果下级还有下级,则结构为 [ {self:下级对象自身},subUser:[ 下级集合数组 ] ]

[
    {slef:object},
    {self:object,
     subUser:[
                {self:object,
           subUser:[]
          }, {...} ] }, {self:object} ]

 

可能我的数据量比较小,感觉用着速度还是很快了。可能数据量比较大的场景不适合,要使用sql的存储过程来提高查询速度。

能用就好吧!

 

用户与推广链接的关系,直接使用逻辑上(不加外键约束)外键连接即可,进行分润时候,直接使用List存储父子关系,反向进行分润即可。

 可参考数据库代码:

分销系统数据库设计

posted @ 2018-07-12 18:41  海绵般汲取  阅读(10331)  评论(2编辑  收藏  举报