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


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

      1、用户通过分享链接促成商品卖出,获取到一定比例的商品利润。

         2、用户促成交易获得一定比例的利润时,其上级用户也会获得一定比例的利润。

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

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

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

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

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

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

      比如,

    方法一、

      用一个tree字段存储字符串来表示上下级关系模式,比如A用户是B用户的上级,

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

    这样要数据库查找上下级关系的时候只需要SELECT * FROM user WHERE treelike "/A/%"

    如上面sql语句是查找出A的所有下级用户,使用一条简单的sql语句即可完成查找。

    如果要找到当前用户的所有上级用户也是用like关键字进行匹配,如查找C用户上级  ,  %是通配符,匹配任意多个字符串

    SELECT * FROM user WHERE treelike "%/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存储父子关系,反向进行分润即可。

     可参考数据库代码:

    分销系统数据库设计

  • 相关阅读:
    查询sql数据库中表占用的空间大小
    清理sql2012数据库日志
    完美解决distinct中使用多个字段的方法
    【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton
    关于ComponentOne For WinForm 的全新控件 – DataFilter数据切片器(Beta)
    “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
    【Visual Studio 扩展工具】使用ComponentOne中的GroupDefinition和SortDefinition属性保存和还原布局
    【Visual Studio 扩展工具】使用 ComponentOne迷你图控件,进行可视化数据趋势分析
    ComponentOne 产品经理:为什么要从C1Report迁移到FlexReport
    ActiveReports 大数据分析报告:贸易争端与中国企业数字化转型
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/9301097.html
Copyright © 2020-2023  润新知