相关疑难解决方法(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万
查看次数

如何在数据库中存储目录/层次结构/树结构?

如何在数据库中存储目录/层次结构/树结构?即MSSQL Server.

@olavk:看起来你没看过我自己的答案.我使用的方式比递归查询更好:)

pps 这是要走的路!

sql-server database-design sql-server-2005 tree-structure

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

存储树数据的快速关系方法(例如文章的线程注释)

我有一个cms存储对文章的评论.这些注释可以是线程的,也可以是非线程的.虽然技术上它们是相同的,只是在没有线程的情况下,回复列留空.我的应用程序适用于sqlLite,MySQL和pgsql,所以我需要相当标准的SQL.

我目前有一个评论表

comment_id
article_id
user_id
comment
timestamp
thread (this is the reply column)
Run Code Online (Sandbox Code Playgroud)

我的问题是弄清楚如何最好地代表数据库中的线程注释.也许在一个单独的表中支持没有内容的树集和一个简单的表来保存文本?也许它已经是这样了?或许另一种方式?

如果注释是非线程的,我可以很容易地按时间戳排序.

如果他们是线程我就像这样

ORDER BY SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))
Run Code Online (Sandbox Code Playgroud)

正如您在ORDER BY中看到的那样,注释查询将不会使用索引,因为基于函数的索引实际上只存在于Oracle中.帮我快速点评评论页面.

sql tree database-design data-storage database-agnostic

15
推荐指数
2
解决办法
6117
查看次数