标签: tree

在关系数据库中存储分层数据有哪些选项?

好的概述

一般来说,您要在快速读取时间(例如,嵌套集)或快速写入时间(邻接列表)之间做出决定.通常,您最终会得到最适合您需求的以下选项组合.以下提供了一些深入阅读:

选项

我知道和一般的功能:

  1. 邻接清单:
    • 列:ID,ParentID
    • 易于实施.
    • 便宜节点移动,插入和删除.
    • 昂贵的找到水平,血统和后代,路径
    • 在支持它们的数据库中通过公用表表达式避免使用N + 1
  2. 嵌套集(又名修改的预订树遍历)
    • 列:左,右
    • 便宜的血统,后代
    • 非常昂贵的O(n/2)移动,插入,由于易失性编码而删除
  3. 桥表(又名闭包表/ w触发器)
    • 使用单独的连接表:祖先,后代,深度(可选)
    • 廉价的血统和后代
    • 写入O(log n)插入,更新,删除的成本(子树的大小)
    • 规范化编码:适用于连接中的RDBMS统计信息和查询规划器
    • 每个节点需要多行
  4. 谱系列(又名物化路径,路径枚举)
    • 专栏:血统(例如/父母/孩子/孙子/等......)
    • 廉价后代通过前缀查询(例如LEFT(lineage, #) = '/enumerated/path')
    • 写入O(log n)插入,更新,删除的成本(子树的大小)
    • 非关系型:依赖于Array数据类型或序列化字符串格式
  5. 嵌套间隔
    • 像嵌套集一样,但是使用实数/浮点数/小数,这样编码就不易变(廉价的移动/插入/删除)
    • 有实/浮/十进制表示/精度问题
    • 矩阵编码变体为"自由"添加了祖先编码(物化路径),但增加了线性代数的诡计.
  6. 平表
    • 修改的Adjacency List,为每条记录添加Level和Rank(例如排序)列.
    • 便宜迭代/分页
    • 昂贵的移动和删除
    • 好用:线程讨论 - 论坛/博客评论
  7. 多个谱系列
    • 列:每个谱系级别一个,指向根目录的所有父级,从项目级别向下的级别设置为NULL
    • 便宜的祖先,后代,水平
    • 便宜的插入,删除,移动的叶子 …

sql database tree relational-database hierarchical-data

1281
推荐指数
7
解决办法
23万
查看次数

将平台解析成树的最有效/优雅的方法是什么?

假设您有一个存储有序树层次结构的平面表:

Id   Name         ParentId   Order
 1   'Node 1'            0      10
 2   'Node 1.1'          1      10
 3   'Node 2'            0      20
 4   'Node 1.1.1'        2      10
 5   'Node 2.1'          3      10
 6   'Node 1.2'          1      20
Run Code Online (Sandbox Code Playgroud)

这是我们所拥有的图表[id] Name.根节点0是虚构的.

                       [0] ROOT
                          /    \ 
              [1] Node 1          [3] Node 2
              /       \                   \
    [2] Node 1.1     [6] Node 1.2      [5] Node 2.1
          /          
 [4] Node 1.1.1

您将使用什么简约方法将其输出为HTML(或文本,就此而言)作为正确排序,正确缩进的树?

进一步假设你只有基本的数据结构(数组和散列图),没有带有父/子引用的花哨对象,没有ORM,没有框架,只有你的双手.该表表示为结果集,可以随机访问.

伪代码或普通英语是可以的,这纯粹是一个概念性的问题.

额外问题:在RDBMS中存储这样的树结构是否有根本更好的方法?


编辑和补充

回答一个评论者(Mark Bessey的)问题:根节点不是必需的,因为它永远不会被显示.ParentId = 0是表示"这些是顶级"的惯例.Order列定义了如何对具有相同父节点的节点进行排序.

我所谈到的"结果集"可以被描绘成一组哈希图(保留在该术语中).因为我的例子意味着已经存在.有些答案会加倍努力并首先构建它,但那没关系.

树可以任意深.每个节点可以有N个子节点.不过,我并没有考虑到"数百万条目".

不要将我选择的节点命名('Node 1.1.1')误认为是依赖的东西.节点同样可以称为"Frank"或"Bob",不暗示命名结构,这只是为了使其可读. …

sql algorithm tree recursion hierarchical-data

508
推荐指数
8
解决办法
11万
查看次数

Java树数据结构?

是否有一个良好的可用(标准Java)数据结构来表示Java中的树?

具体来说,我需要代表以下内容:

  • 任何节点上的树都可以有任意数量的子节点
  • 每个节点(在根之后)只是一个String(其子节点也是字符串)
  • 给定一个表示给定节点的输入字符串,我需要能够获得所有子节点(某种列表或字符串数​​组)

是否有可用的结构或我是否需要创建自己的结构(如果是这样的实现建议会很好).

java tree data-structures

485
推荐指数
14
解决办法
67万
查看次数

无法在终端中显示Git树

Killswitchcollective.com的旧文章,2009年6月30日,有以下输入和输出

git co master
git merge [your_branch]
git push

upstream    A-B-C-D-E            A-B-C-D-E-F-G
                 \        ---->               \
your branch       C-D-E                        G
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是如何在终端中获得提交树的视图,而不使用OS/X中的Gitk或Gitx.

你怎么能在终端获得树状的提交视图?

git terminal console tree revision-history

403
推荐指数
6
解决办法
30万
查看次数

为什么C++ STL不提供任何"树"容器?

为什么C++ STL不提供任何"树"容器,而最好使用什么?

我想将对象的层次结构存储为树,而不是使用树作为性能增强...

c++ tree stl

362
推荐指数
13
解决办法
19万
查看次数

二叉树和二叉搜索树之间的区别

任何人都可以用一个例子解释二叉树二叉搜索树 之间的区别吗?

tree binary-tree binary-search-tree data-structures

315
推荐指数
10
解决办法
21万
查看次数

树深度和高度有什么区别?

这是算法理论中的一个简单问题.
它们之间的区别在于,在一种情况下,您可以计算根节点和具体节点之间最短路径上的节点数和其他边数.
哪个是哪个?

algorithm tree terminology nodes data-structures

215
推荐指数
6
解决办法
20万
查看次数

Google Chrome以树形式显示JSON AJAX响应,而不是纯文本

我找不到这个答案:

我的AJAX调用返回JSON数据.在Google Chrome开发者工具>资源> XHR中,当我单击左侧的资源,然后单击"内容"选项卡上时,我将JSON字符串视为字符串,而不是Firebug和Firebug Lite所做的树.

如何强制Chrome将其作为树显示.是否有我的PHP文件必须具有的Content-type?

我很乐意知道答案!

谢谢Stefanos

ajax tree json google-chrome view

200
推荐指数
4
解决办法
15万
查看次数

段树,间隔树,二叉索引树和范围树之间有什么区别?

在以下方面,段树,间隔树,二进制索引树和范围树之间有什么区别:

  • 关键思想/定义
  • 应用
  • 更高维度/空间消耗的性能/订单

请不要只给出定义.

algorithm tree interval-tree graph-algorithm segment-tree

183
推荐指数
2
解决办法
3万
查看次数

如何在Python中实现树?Python中是否有类似Java的内置数据结构?

我正在尝试构建一个通用树.Python中是否有内置的数据结构来实现树?

python tree data-structures python-3.x

164
推荐指数
13
解决办法
31万
查看次数