php三级分销思路 数据库设计_分销系统的用户关系,用户与推广链接的数据库设计。设计思路...
简单点说二三级分销系统,
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数据
/***
*@paramid
*@return
*/
public JSONArray searchSubCustomer(intid) {/*** 这里只查询用户下一级的子用户。
* 有数据情况下,遍历其子用户,
* 当如果该用户没有子用户,即返回为null时,直接返回null并且结束这个方法,可在for循环中看到逻辑处理*/// 这部分sql查询,按照自己的方法数据库查询,这个查询是调用JFinal框架的ActiveRecordPlugin 这个插件进行数据库查询
List 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= newJSONObject();if (temp == null) {//没有下级,直接放自己
jsonObject.put("self", customer);
jsonArray.add(jsonObject);
}else{//有下级,放自己的同时,另起一个subUser为key放所有下级
jsonObject.put("self", customer);
jsonObject.put("subUser", temp);
jsonArray.add(jsonObject);
}
}returnjsonArray;
}
获得的结果类似于下面结构,如果没有下级直接返回空,即[ ]
只有一个下级则会返回下级本身,即 [ {self:下级对象} ]
如果下级还有下级,则结构为 [ {self:下级对象自身},subUser:[ 下级集合数组 ] ]
[
{slef:object},
{self:object,
subUser:[
{self:object,
subUser:[]
},
{...}
]
},
{self:object}
]
可能我的数据量比较小,感觉用着速度还是很快了。可能数据量比较大的场景不适合,要使用sql的存储过程来提高查询速度。
能用就好吧!
用户与推广链接的关系,直接使用逻辑上(不加外键约束)外键连接即可,进行分润时候,直接使用List存储父子关系,反向进行分润即可。
可参考数据库代码:
php三级分销思路 数据库设计_分销系统的用户关系,用户与推广链接的数据库设计。设计思路...相关推荐
- mysql好友关系数据表设计_社交系统中用户好友关系数据库设计
基础分析 第一步,有一张用户表,表内包含用户的基本信息,比如账号.姓名.性别等信息.这里用tb_user表示用户信息表. ID用户名 1张三 2李四 3王五 4赵六 第二步,需要将用户与用户直接建立好 ...
- tde数据库加密_如何将TDE加密的用户数据库添加到Always On可用性组
tde数据库加密 SQL Server Transparent Data Encryption, also known as TDE, is a "data at rest" en ...
- 支付退款流程设计_【系统架构】如何设计一个简单灵活的收银系统?看这里!(1)...
在电商项目中,收银系统是一个不可或缺的功能,因为你不仅要通过它来进行收款.退款,而且也要通过它进行财务的对账.报税等.因此,如何设计一个简单灵活的收银系统,对于开发电商项目来说非常重要. 那如何设计一 ...
- feed mysql表设计_微博系统动态feed数据库设计。
推方式 推方式,是发生在用户触发行为(发布新的动态,关注某个人,点赞)的时候.在触发时,用户的自身行为会记录到对应的行为表中,其次用户的行为也会记录到自己的粉丝对应动态表中. 这里写图片描述 用户A发 ...
- java 操作日志设计_日志系统新贵 Loki,确实比笨重的ELK轻
本文同步Java知音社区,专注于Java 作者:linkt1234http://blog.csdn.net/Linkthaha/article/details/100575278 最近,在对公司容器云 ...
- 金仓数据库字段_技术干货 | 超实用!详解人大金仓MPP数据库并行查询技术
什么是MPP数据库? 人大金仓MPP数据库的 并行查询技术原理是什么? 如何实现并行查询?性能如何? 且听以下详细分解~ 01 什么是人大金仓MPP数据库? KingbaseAnalyticsDB(简 ...
- 阿拉伯语排版设计_针对说阿拉伯语的用户的测试和设计
阿拉伯语排版设计 Let me start off with some data to put things into perspective "Why?" 让我从一些数据入手,以 ...
- 响应式网站设计_通过这个免费的四小时课程,掌握响应式网站设计
响应式网站设计 This video tutorial from Kevin Powell teaches you to build responsive websites from scratch. ...
- python下俄罗斯方块的游戏设计_[源码和文档分享]基于Python的PyGame的俄罗斯方块游戏设计与实现...
摘 要 近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序用Python语言编写俄罗斯方块,左侧显示正在运行的游戏,右边显示 ...
最新文章
- 浏览器URL地址里一堆%或者6E616D6531之类的是啥?编码
- 十七、深入Python异常处理
- c++11-decltype
- Azure Lambda Function创建失败 - 400 bad request和成功 - 201 Created
- ssl2348-连接格点【图论,最小生成树,并查集】
- 深度学习 —— 使用 gensim 实现 word2vec
- 惊!微信可以转发语音了?!
- 《iOS移动开发从入门到精通》图书连载2:如何成为一名iOS开发者
- 控制反转 vs 依赖注入
- vue异常报错解决 Missing ref owner context. ref cannot be used on hois 或者是 Cannot read property ‘refs‘ of n
- 正确的选择大于努力_选择正确技术的11个注意事项
- 对话框程序, 在 OnInitDialog的最后 showWindow(SW_HIDE),不管用的原因
- 英语日常用语900句(3)
- 机器人学中雅可比矩阵求导计算(Angeles法)
- 计算机主机箱工作电流,计算机主板上所用到的电压标准
- nodeJS Express 删除 x-powered-by
- 数据库 物化视图详解
- 日语二级语法汇总(part5/16)
- 23个设计模式的简明教程
- windows之nslookup命令