背景:

由于近期一个项目要开发一个多层级用户体系,并且还要支持部分链条的可移动性,经过初步构思,已经有了一个初步的思路,今天在这里简单分享一下。

要求:

1. 用户结点数要支持百万级,层级理论上支持无限级扩展
2. 支持节点动态插入(不支持删除,通常也不会有这种需求,需要的话采用节点状态来处理)
3. 支持叶子节点可移动(中间节点不可以移动)
4. 支持一级节点可替换(也就是说可以把某个一级节点下面的所有节点迁移到另外一个一级节点下面)

实现方式:

1. 采用mysql单表设计
2. 采用redis实现分布式锁  (本篇暂不讨论实现)

表设计:

说明:
id: 主键,自增
bid:  节点业务id(独立唯一索引,bid不允许重复)
layer: 节点所处层级,一级节点为1,二级节点为2,依此类推
parent_bid: 当前节点的上级节点业务 id
top_bid: 当前节点所属一级节点的 bid (独立索引)

初始数据:

初始结构:

操作:

1. 新增节点

1) 新增一级节点

         layer = 1, parent_bid = 0 , top_bid = 0, 通过 top_bid = 0 可以查询出所有一级节点,别忘了 top_bid 有独立索引。

2) 新增非一级节点

首先找到上级节点(parent),然后 cur(layer) = parent(layer)+1;  cur(parent_bid) = parent(bid);

cur(top_bid) =  parent为一级节点?  parent(bid) : parent(top_bid)

2. 移动节点

1) 移动叶子节点

       cur(layer) = target(layer)+1;  cur(parent_bid) = target(bid);  cur(top_bid) = target为一级节点?target(bid) : target(top_bid)

2) 替换一级节点

       比如,把 bid_1 下面整个子链条迁移到 bid_5的下面,用target表示 bid_5节点。
       2.1) bid_1 的直接下级要修改 parent_bid = target(bid)
2.2)  bid_1整个子链条节点的新的top_bid:   new_top_bid = target为一级节点?  target(bid) : target(top_bid),
       用sql表示为 update tree set top_bid = new_top_bid where top_bid = "bid_1"

3. 查询

       如果要查询节点的话,目前只能是一级一级的查看,不支持查看一个节点的整个下级网络

安全修改

       在新增和移动节点的过程当中,如果有并发操作的话,容易把数据弄乱,而且不可恢复,那
将是灾难性的后果。考虑到跨多个jvm,单纯的java锁是解决不了问题的,所以这里必须使用
分布式锁。
1) 可以使用分布式读写锁,由于多个新增操作不会有冲突,所以新增操作可以使用读锁;
所有的移动操作都是互斥的,所以可以使用写锁; 分布式读写锁自己实现的话会比较麻烦,
如果系统并发量不是很大,可以考虑使用2)中的方式。
2) 使用普通的分布式锁,相当于实现一个跨jvm的同步操作,可以使用redis简单实现一个
分布式锁,以后有时间再单独写一篇来介绍如何实现。

安全日志:

       如果你的实现有bug,比如移动节点代码写的有问题,导致整个层级结构错乱了,该怎么办?
可以创建一张 log表,按时间顺序 ,记录下每一个新增操作和移动操作,修改用户名、手机之类
的不需要记录,如果层级出现错误了,以后还可以写个脚本执行log中的所有操作命令,还是
有机会重建出整个层级树出来的。

其它:

       需求的变化是无止境的,一个模型适应不了所有的需求,有时候,是需要商务去引导客户的。
基于以上模型也是有缺陷的,比如,不可以随便移动任意节点,不能简单就可以查看一个用户
所有下级网络等。 但也是有替代方案的,比如,查询下级用户的话,一层一层来查询; 任意移
动节点的话,由于操作肯定很少,真有需求,可以考虑找出所有相关节点,一个一个update,放
在一个事务中。

后话:

       多层级的设计是非常灵活多变的,要看场景和需求,以及多大的扩展能力和数据大小,没有最好,只有最适合。

一个多层级节点用户树的设计构思相关推荐

  1. 一个权限树的设计与实现

    如图,实现如下功能: 1,加载自动读出当前权限,自动展开(基本功能) 2,有一个选择/取消全部的功能(之前设计成独立的按钮,最后改成一个根目录的形式,如上图) 3,任何父级与子级的全选关系动态关联,具 ...

  2. 如何设计一个支持1亿用户使用的系统

    高可用架构设计最核心的就是两点:解耦和冗余.解耦包括业务状态分离(无状态架构设计).分库分表等.冗余包括缓存.CDN.主从备份.主主备份.GeoDNS 等.一个好的架构设计需要在产品迭代的不同阶段选择 ...

  3. 设计一个可扩展的用户登录系统

    在Web系统中,用户登录是最基本的功能.如何设计一个可扩展的用户登录系统呢?本文结合实际案例对用户登录系统设计进行多维度的讲解,帮助各设计者在应用中将复杂变得简单. 来源:廖雪峰的官方网站,作者:廖雪 ...

  4. 如何设计一个支持一亿用户的系统,心中有方案遇事不慌!

    要设计一个支持数亿用户的系统并不容易.对于软件架构师来说,这总是一个很大的挑战(但是读完我的文章

  5. java 039 s rule_Java开发架构篇:DDD模型领域层决策规则树服务设计

    沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅仅只是从一个简单的分层结构上依然没法理解DDD以及如何去开发 ...

  6. 千人千面、用户画像的设计、技术选型与架构实现

    用户画像的目的是为产品筛选出目标客户 目前,越来越多的企业,在大数据应用上,都会选择用户画像这一主题,为什么呢?因为用户画像相对于做推荐以及机器学习等简单容易的多,做画像,更多是就是对用户数据的整合, ...

  7. DDD专题案例二《领域层决策规则树服务设计》

    前言介绍 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅仅只是从一个简单的分层结构上依然没法理解DDD以及如何去开发这样的微服务.另外往往按照这样分层后依然感觉和 ...

  8. 亿级用户中心的设计与实践

    -     前言    - 用户中心是互联网最为基础的核心系统,随着业务和用户的增长,势必会带来不断的挑战.如何在亿级的情况下保证系统的高可用,高性能以及高安全,本文能够给你一套实践方案. 注1:本文 ...

  9. 用户运营平台产品设计指南

    本文由作者 WiseWong 发布于社区 "用户画像"."用户标签"."大数据"这些名词是我们近些年来常听的词,可是这些词却很难直接的产生价 ...

最新文章

  1. MyCAT-1.4-RC性能测试(初步施工)
  2. 常用函数式接口之Consumer
  3. Android使用Retrofit2.0和RxJava2.0处理网络请求
  4. 新CalendarFX视图:MonthGridView!
  5. input复选框checkbox默认样式纯css修改
  6. Lecture_2_4 线性回归中的系数,衡量了什么?
  7. [Ynoi2012]D1T3
  8. 代码混淆后如何快速定位错误
  9. 【日常折腾】Y7000P拆机-更换触控板
  10. Android仿华为watch睡眠,华为watch2pro怎么查看睡眠状态
  11. 操作系统实验七:动态分区分配方式的模拟
  12. Android 获取手机型号,版本号等。
  13. psql屏幕输出全部结果_液晶电视无法开机,是电源板问题还是屏幕问题,自己动手维修...
  14. Hero鹏——只为挖坑而生
  15. 化模糊为清晰的图片清晰术:动手尝试修复模糊老照片
  16. webview显示flv远程文件
  17. 如果你不了解 python 的学习体系?来看看这篇博客吧 ,特邀嘴强擦哥做点评|Python技能树测评
  18. AndroidStudio|读取SD卡中的sqlite数据
  19. C#微信开放平台开发——1、序言
  20. 绿城离职员工万言书全文,不看你后悔!当今很少有此类文言文!

热门文章

  1. matlab谐波电流测量,基于MATLAB的谐波电流检测方法的建模与仿真
  2. 环境工程原理知识点总结
  3. git 删除文件 、只删除远程仓库文件、更换远程仓库
  4. java 百亿计算器_java面试题--实现一个百亿的计算器
  5. 湖北出台禁犬令PHP 新闻,湖北省拟出台最严禁狗令,禁止饲养包括中华田园犬在内的多种狗狗...
  6. hp服务器性能测试,较新架构服务器用CPU性能对比测试
  7. 由asn1编码引发对sm2签名长度思考
  8. 搭建hadoop 集群,出现 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
  9. python股票数据分析_用Python进行股票数据分析
  10. 一个工作三年的新手菜鸟