相关疑难解决方法(0)

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

好的概述

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

选项

我知道和一般的功能:

  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万
查看次数

如何从平面结构有效地建造树木?

我有一堆扁平结构的物体.这些物体具有IDParentID属性,因此它们可以排列在树木中.它们没有特别的顺序.每个ParentID属性不一定与ID结构中的a 匹配.因此它们可能是从这些物体中出现的几棵树.

您将如何处理这些对象以创建生成的树?

我不是一个解决方案,但我确信它远非最佳...

我需要创建这些树,然后按正确的顺序将数据插入数据库.

没有循环引用.当ParentID == null或在其他对象中找不到ParentID时,Node是RootNode

language-agnostic algorithm tree

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

MySQL"WITH"子句

我正在尝试使用MySQL创建一个带有"WITH"子句的视图

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname
Run Code Online (Sandbox Code Playgroud)

但似乎MySQL并不支持这一点.

我认为这是非常标准的,我确信Oracle支持这一点.反正强制MySQL使用"WITH"子句吗?我用MyISAM和innoDB引擎试过了.这两个都不起作用.

mysql sql common-table-expression

89
推荐指数
5
解决办法
18万
查看次数

如何在SQL中表示数据树?

我正在编写一个由Tree和TreeNode组合而成的数据树结构.树将包含数据的根和顶级操作.我正在使用UI库以窗体形式呈现树,我可以将树绑定到TreeView.

我需要在DB中保存这个树和节点.保存树并获得以下功能的最佳方法是什么:

  1. 直观的实施.
  2. 轻松绑定.很容易从树移动到DB结构并返回(如果有的话)

我有两个想法.第一种是将数据序列化为表格中的单行.第二种是保存在表中,但是当移动到数据实体时,我将在更改的节点上松开表上的行状态.

有任何想法吗?

sql tree hierarchical-data

44
推荐指数
6
解决办法
4万
查看次数

树结构的优化SQL

如何从具有最佳性能的数据库中获取树结构数据?例如,假设您在数据库中有一个文件夹层次结构.folder-database-row具有ID,NameParentID列的位置.

您是否会使用特殊算法一次性获取所有数据,最大限度地减少数据库调用量并在代码中处理它?

或者你会使用多次调用数据库并直接从数据库中获取结构?

也许根据x数据库行数,层次结构深度或其他什么有不同的答案?

编辑:我使用Microsoft SQL Server,但其他观点的答案也很有趣.

sql sql-server tree-structure

35
推荐指数
5
解决办法
3万
查看次数

将项目列表转换为树的好的和通用的方法

我有类别列表:

??????????????????????????????????
? Id ? Name        ? Parent_id   ?
??????????????????????????????????
? 1  ? Sports      ? 0           ?
? 2  ? Balls       ? 1           ?
? 3  ? Shoes       ? 1           ?
? 4  ? Electronics ? 0           ?
? 5  ? Cameras     ? 4           ?
? 6  ? Lenses      ? 5           ?
? 7  ? Tripod      ? 5           ?
? 8  ? Computers   ? 4           ?
? 9  ? Laptops     ? 8           ?
? 10 ? Empty       ? 0           ? …
Run Code Online (Sandbox Code Playgroud)

.net c# algorithm

35
推荐指数
4
解决办法
2万
查看次数

文件系统中目录的分层/树数据库

我想将存在于磁盘上的目录存储到数据库中,同时保持其层次结构/树结构.

这是一个无花果,

                         (ROOT)
                       /        \ 
                    Dir2        Dir3
                   /    \           \
                 Dir4   Dir5        Dir6
                 /          
               Dir7

我正在使用SQLite数据库.

  • 请建议我在SQLite数据库中存储上述结构的sql查询.

  • 和一个查询,以便在我选择一个目录时检索目录的完整路径.

即假设我选择Dir6然后我会得到像ROOT/Dir2/dir3/dir7这样的完整路径

sql sqlite tree path hierarchical-data

32
推荐指数
1
解决办法
1万
查看次数

如何在db中表示树状结构

我正在开始一个项目,我正处于设计阶段:即,我还没有决定我将使用哪个db框架.我将拥有创建"森林"结构的代码.也就是说,许多树,每棵树都是标准的:节点和边.在代码创建这些树之后,我想将它们保存在db中.(然后最终将它们拉出来)

在db中表示数据的天真方法是具有两个表的关系数据库:节点和边.也就是说,节点表将具有节点id,节点数据等.而边表将是节点id到节点id的映射.

有更好的方法吗?或者给出(有限的)假设我给出的这是最好的方法?如果我们添加树相对较小的假设怎么样 - 将整个树保存为db中的blob会更好吗?在这种情况下我应该使用哪种类型的数据库?请评论速度/可扩展性.

谢谢

database tree hierarchical-data data-structures

30
推荐指数
1
解决办法
3万
查看次数

如何存储经常改变DB位置的订购商品

我需要能够在DB中存储大量订购商品.到目前为止,这是直截了当的:

ID Position OtherFields
 1     45      ...
 2   4736      ...
 3    514      ...
 ...
Run Code Online (Sandbox Code Playgroud)

在查询中,我总是需要获得一些项目(基于OtherFields过滤),但顺序正确.也很容易,在位置上放置一个索引并使用"按位置排序".

现在问题是:项目经常更改其位置,而不仅仅是1或2.如果ID 2将位置从4736更改为2000,我需要更新其位置和旧位置2000和4735之间所有元素的位置,添加1在每一行.并且不仅每个事务更改一个ID而且还有一些ID,并且在短时间内可以有许多事务.

我认为处理更新问题最优雅的方法是使用链接列表而不是位置列,我可以通过将其前任链接到其后继者,然后通过在其之间链接将其插入其他位置,从而将ID 2从其旧位置移除新的前任和继任者.这将是每个职位变更的持续和少量更新,它也是我处理变更的首选方式(在我的案例中是Java).然而,这引起了N + 1问题查询正确的顺序-甚至几元,我不得不通过整个名单在最坏的情况下找出正确的顺序.

所以我的问题是:您建议在必要的更新和查询性能之间取得良好的平衡?

到目前为止,我看到两个有希望的方

  1. 是否存在DBMS(理想情况下是OpenSource),它不仅可以处理链接列表,而且还可以处理具有良好性能的链接列表,例如通过使用链接元素的内部索引?

  2. 也许只有一个BLOB可以选择存储整个链接列表!这样的链接列表有多大/它在数据库中使用了多少内存,并且当获取时让我们说1.000.000条目?我正在使用Java + Hibernate以防万一.我想在获取BLOB后处理内存中的整个列表应该非常快!

但当然也欢迎其他想法!

sql indexing recursion linked-list data-structures

28
推荐指数
2
解决办法
4023
查看次数

如何为树结构开发数据库模式(定向非循环图)

我正在使用下面的树结构并计划为下面的开发数据库模式.

在此输入图像描述

我到目前为止的发展如下,

在此输入图像描述

我遇到的问题是如果我搜索Y,应该生成树下面.

在此输入图像描述

我正在使用的逻辑是,Y有两个交叉引用X,Z,这两个节点应该在图中,父节点一直到起始父节点.

鉴于我正在使用PHP使用mysql db表生成此树,如上所示.DB结构可以改变.我在谷歌搜索了类似的树结构,但我找不到任何帮助.

注意

不是要求你为我编写代码.所有我要问的是如何做到这一点的指导.

我发现下面有帮助,但仍然与我的情况不同

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

如何在db中表示树状结构

如果有人可以请告诉我应该使用什么PHP库来生成树,以及使用什么是合适的数据库结构?

php mysql tree database-design nodes

16
推荐指数
3
解决办法
3592
查看次数