树状结构表结构和功能设计
在我们开发过程中经常会遇到各种组织树结构,比如我们的公司人员结构,权限资源的管理,等等。而我们这些数据落到表里面是以一条条数据构成的,我们存储资源时按照一条条存储是非常简单的,但是在操作资源构建树的时候往往会碰到很多问题,下面我们以一条实例来探讨组织树资源的表结构设计和功能点。
表结构设计(以mysql为基础)
我们要设计一个树状结构的数据存储,第一反应是在表里面加一个parent_id
这肯定没有错,我们通过数据的id和parent_id就能组装成整个的树结构,但是比如我们的需求往往不是这么简单,比如我需要关注节点的状态,根据状态去做图标的显示和功能的限制,那么我们就需要添加一个status字段
同时我们的树不可能无限制构建,递归是一个非常消耗资源的事情,所以我们需要限制树的高度,这里我们可以通过加入一个level字段去控制树的层级
也可能我们有这样的需求,我们关心节点之间的顺序,于是我们又要添加一个order_num来控制排序
综合上述,我们得出一张这样的表结构
字段名称 | 字段类型 | 字段描述 | 是否唯一 | 是否非空 |
---|---|---|---|---|
id | int(11) | 主键 | 是 | 是 |
parent_id | int(11) | 父id | 否 | 是 |
level | tinyint(2) | 层级 | 否 | 是 |
parent_path | varchar(640) | 当前节点在树节点中的路径,以/分割,如0/1/2/ | 否 | 是 |
name | varchar(255) | 名称 | 否 | 否 |
status | tinyint | 是否启用 | 否 | 是 |
order_num | int(5) | 顺序 | 否 | 是 |
字段的用途大家都应该明白,但是这里有个parent_path有点迷糊,在树结构的环境下往往有这么个需求,查找某个节点的所有子节点,如此,按照一般思路我们需要递归去查询,对数据库造成的性能损失
这里我们引入了parent_path字段,每次需要查询子节点的时候,只需要执行sql:
SELECT id from tree_test where path like '0/1/2/%'
当然还有一种思路是path按照逗号分割(0,1,2),这样我们可以直接使用mysql的内置函数FIND_IN_SET
SELECT id from tree_test where FIND_IN_SET('1',path);
但是,通过我们查看执行计划,like的方式可以走索引,而FIND_IN_SET不会走,所以我们选择like的方式。
你以为到这里就结束啦,当然没有,节点的顺序除了同节点间的交换插入,可能从其他层级进入当前层级,或者从当前层级扩散到其他层级,万物都是一把双刃剑,parent_path给我们带来方便的同时,我们每次在节点移动的时候需要变更这个path,增加了一定的工作量。
那么我们在挪动节点的时候,顺序是怎么维护的呢?
功能设计
我整理了一个图,其中x表示元素的起始顺序,y表示元素的目标顺序,当我们在节点进行变更时需要按照一下规则维护order_num字段
以上就是我针对树状数据开发过程中可能遇到的点,如果还有需要解决的问题欢迎在评论区留言。
树状结构表结构和功能设计相关推荐
- ExtJs4(5)——左边树,右边表结构
先上图: 这部分没什么好说的,直接上代码吧 PageVar.js var pageVar={}; //----------------------------------------与tree相关的参 ...
- java导出数据库的结构 表结构 字段信息 主键
工作之余,用java写了一个导出数据库结构的小工具,附上核心代码 Table.java package org.dev.livvy.db; import java.util.List; /** * C ...
- 树状结构大数据类型的高效支持
树状结构大数据类型的高效支持 陈世敏 中国科学院计算技术研究所,北京 100190 摘要:传统的关系数据模型难以满足大数据应用日益丰富的数据表达和处理的需求,因此实践中涌现了多种非传统的大数据类型.其 ...
- oracle ebs hr模块表,oracle ebs常用表结构及分类模块.doc
oracle ebs常用表结构及分类模块 Oracle application 表结构 表结构,WHO字段来实现 通过菜单HELP 下的HISTORY 来找表 2. 通过LAST_QUERY来判断所使 ...
- 列名 userid 不明确。 表结构_SQL-Server(三)表的创建和操作
3.1表结构和数据类型 3.1.1表和表结构 表结构.组成表的各列的名称及数据类型,统称为表结构. 记录.每个表包含了若干行数据,它们是表的"值",表中的一行称为一个记录.因此表是 ...
- mysql查询数据库结构_mysql查询数据库下的表结构
mysql查询数据库下的表结构 方法:1.使用DESCRIBE命令以表格的形式展示表结构,语法"DESCRIBE 表名;":2.使用"SHOW CREATE TABLE& ...
- SQL数据库修改表结构
修改表结构 表结构是构建一张表的字段数量,类型与排序 1.添加字段 如果添加字段的表是空表,则可以给字段设置非空约束.如果是有数据的表,不能添加非空约束. alter table 表名 add 字段名 ...
- 简单の暑假总结——树状数组
2.1 树状数组 树状数组,顾名思义,长得像树的数组,用于处理一些单点修改以及区间查询的问题.其时间复杂度为 O(log2n)O(\log _2n)O(log2n) .如过我们使用一些一般的数据结 ...
- sql 树状结构中知道 父节点与孙节点_集群环境中使用Zookeeper实现分布式幂等控制...
一.什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理.分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功 ...
最新文章
- 盖尔-沙普利算法_盖尔定律-及其与初创企业的关系
- 需要更换手机了:由 TensorFlow Lite 构建无人驾驶微型汽车
- Xamarin Android SDK无法更新的解决办法
- Memcached原理深度分析详解
- RDA8955的新版本SDK串口接收数据的问题记录
- JAVA8 Stream方法使用详解reduce、IntStream(二)
- IntelliJ IDEA搭建一个web项目含配置tomcat
- IntelliJ IDEA 14.x 创建工作空间与多个Java Web项目
- oracle 对象管理 07_PLSQL基础与异常
- Linux有问必答:如何在树莓派上安装USB网络摄像头
- C++ 一维高斯积分的实现
- 如何搭建百度局域网离线地图服务器
- Spy++ —— 窗口、消息查看分析利器
- 七牛云视频转码 php,学习猿地-我的扩展包分享 - 七牛云视频转码
- ssm+vue企业员工考勤请假网上办公OA自动化系统java
- NoSQLBooster for MongoDB延长使用时间
- pandas DataFrame 直接生成plot图片 pandas.DataFrame.plot()
- NPDP第三章:新产品流程
- 重读《纳瓦尔宝典》精彩语录及感悟篇(一)
- Cephx认证及rbd的使用
热门文章
- 联想一体机DNS服务器未响应,本地诊断dns服务器未响应怎么解决 处理电脑本地诊断dns服务器未响应的方法...
- Ubuntu 经验 —— Fcitx专题:安装Fcitx
- NNDL 实验八 网络优化与正则化(3)不同优化算法比较
- c语言打印空心数字图形,(完整word版)C语言编写打印实心和空心菱形【源码】
- 第三篇web前端面试自我介绍(刚毕业的菜鸟)
- 顾维灏谈百度地图数据采集:POI自动处理率达90%
- 计算机与统计知识点,2017年计算机一级《MS Office》1-3章知识点集锦
- python 执行命令,并获取结果及执行状态(os.popen、subprocess.Popen、os.system)
- 镇魂街qlv格式怎么转换成mp4格式
- vite配置别名,并处理报错:找不到模块“xxx”或其相应的类型声明