多层级树形结构数据库存储方式

要做一个多层级树形结构数据,后端数据如何存储,以怎样的形式给前端呢

方法1:Adjacency List存储相邻关系

id, parent_id以邻接表(Adjacency List)的形式进行存储在一张表中

这种方式在关系存储比较简单,查询的时候比较复杂。

比如查询部门下的所有子部门信息,因为表中只记录的上下级的部门及其子部门信息。需要遍历表中的信息

这有两种方式。

方式1:

在数据库中递归遍历数据表,这样只需要一次io就可以完成这个操作。降低的数据库连接数,缺点是占用数据库的cpu,在数据量大的时候会赞成数据库服务器宕机,甚至直接损坏

方式2:

在编程语言中进行遍历。for循环中通过parent_id遍历出部门下的下级子部门,放入到map中,如果没有查询到信息就返回null

具体代码参考分销系统的用户关系,用户与推广链接的数据库设计。设计思路 。这个需要频繁的进行数据库查询,在部门层级数不大于50的时候是可以适用的。

也可以把表中的所有数据查询下来,放到list中,通过递归遍历list数据方式进行数据查询。在数据表比较小的时候也可以适用。优点是只需要进行一次IO,缺点是当数据表数据很大时,数据库内存消耗会很大。

方法2:左右值编码存储关系。

如果层级数据不多,建议平级返回数据,客户端自己组合层级。
数据存储 一般是看你的需求,比如:
国家-城市-道路-母婴。这种差异较大的就是多个表关联存储

如果是很紧密的那就存储一个表就好,也可以使用NOSQL方式存储,这样筛查也是可以的。

如果数据量大那就分接口返回

比如查询1级接口。查询2级接口 3级接口....
依次的来,不要1~3级的全部返回了
就是购物的就可以啊
淘宝的筛选就类似,京东也是

原文地址:https://www.cnblogs.com/gne-hwz/p/10362047.html

时间: 2024-10-03 06:06:17

多层级树形结构数据库存储方式的相关文章

发现几种树结构数据库存储方案

最近在开发jSqlBox过程中,研究树形结构的操作,突然发现一种新的树结构数据库存储方案,在网上找了一下,没有找到雷同的(也可能是花的时间不够),现介绍如下: 目前常见的树形结构数据库存储方案有以下四种,但是都存在一定问题: 1)Adjacency List::记录父节点.优点是简单,缺点是访问子树需要遍历,发出许多条SQL,对数据库压力大. 2)Path Enumerations:用一个字符串记录整个路径.优点是查询方便,缺点是插入新记录时要手工更改此节点以下所有路径,很容易出错. 3)Clo

[开源]FreeSCADA的数据库存储方式(Archiver)探究[MySQL为例]

1.我们先新建一个FreeSCADA的工程实例,看下实际的存储效果: a) 建立几个数据通道作为数据源(Communication菜单编辑,Channels Tree下显示): b) 建立一个数据库存档(工具栏的Archiver Settings): c) 定义数据库连接属性(Project菜单下的Database settings子菜单): d) 编译项目,并运行,查看数据库存储结果: 2.存储过程探究(FreeSCADA2解决方案下的Archiver工程): 我们主要分析Archiver工程

数据库中树形结构的存储

上个星期的内容,今天来记一下.一棵树是可以存储在数据中的,方法也很多,在听张老师讲的过程中,说是邻接表和路径枚举是比较常用的方法. 邻接表:添加一个节点是很方便的,但是查询具体的某个节点很费时(树很高).数据量比较少时适合使用: 路径枚举:存储的数据有相同的前缀或后缀,使用比较方便(比如身份证就是有特定的前缀),但是要依赖高级程序来维护路径中的字符串,并且验证字符串的正确性的开销很大: 也可以考虑把两者结合起来使用. 下面是别人整理好的方法:http://www.cnblogs.com/kiss

***博客系统文章的数据库存储方式

在通常的博客系统中,我们发表文章的时候,在数据库中存储的一般不仅仅是文章的文字,还包括文章的样式,而且很多时候都是所见即所得的效果.这就要求我们以html+文字这样存进数据库中,通过查找资料,可以用专门的文字编辑器可以实现,使用方法如下: FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器.它志于轻量化,不需要太复杂的安装步骤即可使用.它可和PHP.JavaScript.ASP.ASP.NET.ColdFusion.Java.以及ABAP等不同的编程语言相结合.“FCK

ruby on rails4的session数据库存储方式

网上说的都是rake:db:sessions:create.但是对于rails4版本的就不起作用了. 如下是我自己针对rails4版本的操作. rails4的session数据表创建:请参考这个文献:http://www.cnblogs.com/heimirror/p/3536965.html. 1.找到项目的gemfile文件修改它: 添加gem 'activerecord-session_store' 保存退出,不需要后面的gitHub的url 2.在项目根路径下执行: rails gene

iOS狂暴之路---iOS中应用的数据存储方式解析

一.前言 前面一篇文章中已经介绍了iOS应用中的视图控制器知识点,而本文不会按照常理来介绍View的知识点,而是先介绍iOS中的数据存储知识点,因为关于View的知识点太多了,后面会连续详细介绍一下.这篇先来看一下iOS中的数据存储功能分析.每一个iOS应用和Android应用一样,都有其对应的沙盒存储自己的数据,但是iOS和Android有一个区别就在于没有SD卡的概念了,也就说在iOS中应用的数据只能保存到自己的沙盒中.这也可以看出来iOS为了应用的安全考虑. 在开发Android的时候都知

DDD开发框架ABP之本地化资源的数据库存储扩展

在上一篇<DDD开发框架ABP之本地化/多语言支持>中,我们知道,ABP开发框架中本地化资源存储可以采用XML文件,RESX资源文件,也提供了其他自定义的存储方式的扩展接口.ABP框架默认实现了前面两种方式,而数据库存储方式则需要自己扩展,大概是因为数据库存储涉及到了实体和仓储等方面的具体内容,不适合放在基本框架里面. 以数据库的方式存储本地化资源,一个最明显的好处就是方便修改,尤其是对于基于数据库的应用系统而言,可以提供统一的维护界面.接下来我们就来一步步地实现将本地化资源存储在数据库中.

大神分享BPM三大附件存储方式

[实例分享]如何配置附件上传位置? 问题: H3 BPM默认情况下附件是存储在数据库中的,长时间下去数据库会越来越大,备份起来也很麻烦,请问如何配置可以让附件直接存储在指定目录或别的文件服务器中? 解决方法: 可以把附件分离出来单独放一个数据库或者配置文件服务器. 下面我介绍下H3 BPM的三种附件存储方式. 文件存储是设置H3 BPM所有的附件存储方式,可支持网络文件夹.FTP和数据库三种方式,系统默认采用数据库存储方式. 添加文件服务器,如下图所示: 如果数据库存储,那么需要设置数据库的访问

【MySQL疑难杂症】如何将树形结构存储在数据库中(方案二 Path Enumeration)

今天来介绍把树形结构存入数据库的第二种方法--路径枚举法. 还是借用上一篇的栗子,为了方便大家查阅,我把图又原样搬过来了. 需要回答的问题依旧是这样几个: 1.查询小天的直接上司. 2.查询老宋管理下的直属员工. 3.查询小天的所有上司. 4.查询老王管理的所有员工. 方案二. Path Enumeration 路径枚举法,记录下根节点到每个子节点的路径. 先创建表: CREATE TABLE employees2( eid INT, ename VARCHAR(100), position V