分销系统的用户关系,用户与推广链接的数据库设计。设计思路
简单点说二三级分销系统,
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存储父子关系,反向进行分润即可。
可参考数据库代码:
分销系统数据库设计
出处:https://www.cnblogs.com/gne-hwz/
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任