树形结构数据存储方案

Adjacency List:每一条记录存parent_id
Path Enumerations:每一条记录存整个tree path经过的node枚举
Nested Sets:每一条记录存 nleft 和 nright
Closure Table:维护一个表,所有的tree path作为记录进行保存。

各种方法的常用操作代价见下图

 
一般来说,数据量小,采用适合邻接表存储设计,简单灵活,而大部分情况下都不会有太大的数据,主要用于种类树、菜单树。

邻接表再程序中的使用:直接查询所有,然后构建树形结构数据。有序数据构建树,层级之间是有序的。可通过sql查询排序。

java list转tree

TreeNode接口

package klg.common.tree;

import java.io.Serializable;
import java.util.List;
/**
*
* @author klguang
*
* @param <ID>
*/
public interface TreeNode<ID extends Serializable> { public ID getId();
public ID getParentId(); public <T extends TreeNode<ID>> void setChildren(List<T> children); }

  

TreeHelper工具类

package klg.common.tree;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author klguang
*
*/
public class TreeHelper { /**
*
* @param parentID
* null 为根节点
* @param nodeList
* @param sort
* @return
*/
public static <ID extends Serializable,T extends TreeNode<ID>> List<T> buildTree(ID parentID, List<T> nodeList) {
// 根节点列表
List<T> list = new ArrayList<>();
// 顺序遍历节点列表,如果之前是有序的,那么构建树后同层级之间有序
for (int i=0; i<nodeList.size(); i++) {
T node = nodeList.get(i);
//递归入口, String.valueOf防止null值
if (String.valueOf(node.getParentId()).equals(String.valueOf(parentID))) {
// parentID作为入口
List<T> children = buildTree(node.getId(), nodeList);
node.setChildren(children);
list.add(node);
}
} return list;
}
}

  

案例easyui tree

package klg.common.tree;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient; /**
*
* @author klguang
*
*/
@MappedSuperclass
@Access(AccessType.FIELD)
public abstract class EasyUITreeNode<ID extends Serializable> implements Serializable, TreeNode<ID> { private static final long serialVersionUID = 850845227481354764L; @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private ID id; @Column(name = "parent_id")
private ID parentId; @Column(name = "name", nullable = false)
private String name; @Column(name = "icon_cls")
private String iconCls; @Column(name = "state")
private String state; @Column(name = "order_num")
private Integer orderNum; @SuppressWarnings("rawtypes")
@Transient
List children = new ArrayList<>(); /**
* easyui treegrid 需求格式
*
* @return
*/
public String getText() {
return this.name;
} public ID getId() {
return id;
} public void setId(ID id) {
this.id = id;
} public ID getParentId() {
return parentId;
} public void setParentId(ID parentId) {
this.parentId = parentId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getIconCls() {
return iconCls;
} public void setIconCls(String iconCls) {
this.iconCls = iconCls;
} public String getState() {
return state;
} public void setState(String state) {
this.state = state;
} public Integer getOrderNum() {
return orderNum;
} public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
} @SuppressWarnings("unchecked")
public <T extends TreeNode<ID>> List<T> getChildren() {
return children;
} public<T extends TreeNode<ID>> void setChildren(List<T> children) {
this.children = children;
} }

  

使用方法

easyui tree实现类

public class Permission extends EasyUITreeNode<Long> {
//fields
}

构建树

    public List<Permission> findAll(){
Sort sort = new Sort(Direction.ASC,"orderNum");
List<Permission> listData=permissionService.findList(sort); return TreeHelper.<Long,Permission>buildTree(null, listData);
}

树形结构数据存储方案的选择和java list转tree的更多相关文章

  1. 【MySQL疑难杂症】如何将树形结构存储在数据库中(方案一、Adjacency List)

    今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢? 像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数据,但是遇到像树形结构这样有深度的人,就很难驾驭了. 举个栗子:现在有一 ...

  2. 【java基础 5】树形结构数据加载的思考

    前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...

  3. Hadoop小文件存储方案

    原文地址:https://www.cnblogs.com/ballwql/p/8944025.html HDFS总体架构 在介绍文件存储方案之前,我觉得有必要先介绍下关于HDFS存储架构方面的一些知识 ...

  4. Github 29K Star的开源对象存储方案——Minio入门宝典

    对象存储不是什么新技术了,但是从来都没有被替代掉.为什么?在这个大数据发展迅速地时代,数据已经不单单是简单的文本数据了,每天有大量的图片,视频数据产生,在短视频火爆的今天,这个数量还在增加.有数据表明 ...

  5. Redis百亿级Key存储方案(转)

    1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...

  6. MongoDb gridfs-ngnix文件存储方案

          在各类系统应用服务端开发中,我们经常会遇到文件存储的问题. 常见的磁盘文件系统,DBMS传统文件流存储.今天我们看一下基于NoSQL数据库MongoDb的存储方案.笔者环境 以CentOS ...

  7. MySQL 5.7:非结构化数据存储的新选择

    本文转载自:http://www.innomysql.net/article/23959.html (只作转载, 不代表本站和博主同意文中观点或证实文中信息) 工作10余年,没有一个版本能像MySQL ...

  8. Redis百亿级Key存储方案

    1 需求背景 该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperi ...

  9. 【Tree 3】树形结构数据加载的思考

    前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...

随机推荐

  1. MySQL replace into 用法

    讨人喜欢的 MySQL replace into 用法(insert into 的增强版) 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果 ...

  2. cocos2d-x与ISO内存管理(转)

    一,IOS与图片内存 在IOS上,图片会被自动缩放到2的N次方大小.比如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的.图片占用内存大小的计算的公式是:长*宽*4.这样 ...

  3. spring 发布 Jax-Ws Service (一)

    1.maven依赖: <dependency> <groupId>org.springframework.ws</groupId> <artifactId&g ...

  4. 搜索引擎根据原Sphider的脚本修正后的 Sphider-plus 2.2

    搜索引擎根据原Sphider的脚本修正后的 Sphider-plus 2.2 标签: 搜索引擎脚本search数据库authorizationjavascript -- : 1412人阅读 评论() ...

  5. private继承的作用

    这里有个demo,里面的Stack<T*> : private Stack<void *>,作者对此的解释如下 The partial specialization for o ...

  6. ubuntu时钟不显示的解决方法

    原文链接:http://muzi.info/articles/529.html 有时候我们会看到我们电脑的状态栏那里并没有显示时间,一个原因是日期时间指示器没有工作,另一个可能的原因是用户禁用了时间显 ...

  7. FreeRtos——单任务

    原创(当然借鉴了官网资料^_^): 在之前的移植工作准备好之后,我们需要调用freertos提供给我们的API函数实现操作系统地运行.首先,第一个函数: 任务函数任务是由 C 语言函数实现的.唯一特别 ...

  8. 一款基于jQuery的带文字标题上下切换焦点图

    今天给大家分享一款很实用的jQuery焦点图插件,它的最大特点就是使用非常方便,而且实现相对比较简单.焦点图的图片下方悬浮文字链接,鼠标滑过文字时即可切换至相应的图片,在图片切换的过程中出现淡入淡出的 ...

  9. SenCha Touch HTML 5 应用程序缓存

    http://www.cnblogs.com/qidian10/p/3292876.html https://developer.mozilla.org/zh-CN/docs/HTML/Using_t ...

  10. Netty中的那些坑

    Netty中的那些坑(上篇) 最近开发了一个纯异步的redis客户端,算是比较深入的使用了一把netty.在使用过程中一边优化,一边解决各种坑.儿这些坑大部分基本上是Netty4对Netty3的改进部 ...