热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

请教问题:如何将树型结构数据存储在关系数据库里

小弟现在要在网页上做一个编号的目录树,树的层数没有限制,树上的每个父结点的子结点个数是随机的。对树上的结点可以进行如下操作:1.新增(插入):,新建一个结点,可以插在两个兄弟
小弟现在要在网页上做一个编号的目录树,树的层数没有限制,树上的每个父结点的子结点个数是随机的。

  对树上的结点可以进行如下操作:

  1. 新增(插入):,新建一个结点,可以插在两个兄弟结点之间,也可以插在某个结点之下做为子结点;
  2. 删除:删除某个结点及其子结点;
  3. 移动,相当于先删除某个结点,再将这个结点插入到别的地方;

  偶想要以树上的结点做为单位信息实体,将整颗树的存储在关系数据库里。

  偶的问题就是要怎样设计每个结点包含的信息(本结点与父结点,兄弟结点,子结点之间的关系),以达到以下四个目的:

  1. 能完整地重现整颗树;(这个比较容易实现)
  2. 因为是在网页上进行操作,所以插入和移动的位置要以列表选择的方式确定;
  3. 在进行以上三个操作时,对数据库的操作,也就是要修改信息的结点数是最少的;
  4. 能对结点进行信息统计,例如有几个子结点;

  开始我是使用直接编号的方式,后面发现不太现实,结点有变动的话,排序在其后的兄弟结点都要受影响;

  随后我使用双向链表结构,前后兄弟之间有双向关联,父结点与第一个子结点之间也有双向关联,在进行操作时还是比较麻烦;而且这种结构不利于做结点信息的统计工作;

  偶现在已经头大啦,实在想不出什么好的结构来存放,555555555555

  各位有没有什么好的建议,或有什么项目实现了类似的功能的也请明示一下。

11 个解决方案

#1


表中,ID,parentID,两个关键字段就可以描述出一棵出来,

#2


试下XML~~就是树型结构的

#3


To leasa(暴暴):
  要描述一棵树不困难,困难的是这是一棵目录树,我要在树上,以基于编号的方式进行新建,删除,移动等操作。

  To lixiaoxue85(蛮野蛮):
  我必须将树存储在关系数据库里。

#4


http://gcdn.grapecity.com/cs/forums/thread/2183.aspx
树形结构的数据库设计

#5


对算法一向没研究

#6


To leasa(暴暴):
  要描述一棵树不困难,困难的是这是一棵目录树,我要在树上,以基于编号的方式进行新建,删除,移动等操作。

id parentid name 
1  0        父节点
2  1        子节点1
3  1        子节点2

添加
4  1        子节点3

移动
子节点的排序依赖ID,要移动更换ID,也可以重新定义排序的字段,

删除

#7


To: wantsong(WantSong)
  我看了一下你给的文章,里面第二种存储结构在进行插入、删除和移动操作时要修改的结点还是比较多。不是很适合我的情况。
To: leasa(暴暴)
  子节点的排序依赖ID,那要插入的话部分子节点的ID岂不是都要改变。

呵呵,依然期待ing..........

#8


结贴。
没能找到合适的解决方法。

#9


mark!

#10


加一个序号字段,用来表示这个节点在父节点下的位置。
每次插入新节点,就对其父节点下面的所有子节点重新编号。删除则可以不管。移动的话把插入的一边重新编号即可。

#11


To: leasa(暴暴)
  子节点的排序依赖ID,那要插入的话部分子节点的ID岂不是都要改变。

为什么要改???!!!

这里的ID是用来确定节点记录的(表的Primary Key),应当(SHOULD, not MUST)和业务无关,你所说排序依据,或者其他业务上的字段,请自己加字段

推荐阅读
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
author-avatar
mobiledu2502890213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有