7
在关系数据库中存储分层数据有哪些选择?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 10个月前关闭。 好的概述 一般来说,您需要在快速读取时间(例如,嵌套集)或快速写入时间(邻接列表)之间做出决定。通常,您最终会得到以下最适合您的选项的组合。以下内容提供了一些深入的阅读: 嵌套间隔与邻接列表的另一比较:邻接列表,物化路径,嵌套集和嵌套间隔的最佳比较。 分层数据模型:幻灯片,其中对折衷和示例用法进行了很好的解释 在MySQL中表示层次结构:特别是对嵌套集的很好概述 RDBMS中的分层数据:我见过的最全面,组织最完整的链接集,但解释方式不多 选件 我知道的和一般功能: 邻接表: 列:ID,ParentID 易于实现。 廉价节点移动,插入和删除。 昂贵的查找级别,祖先和后代,路径 通过支持它们的数据库中的公用表表达式避免N + 1 嵌套集(又名修改后的预排序树遍历) 列:左,右 廉价祖先,后裔 O(n/2)由于易失性编码,非常昂贵的移动,插入,删除 桥接表(又名闭包表/ w触发器) 使用单独的联接表,并带有:祖先,后代,深度(可选) 便宜的祖先和后裔 写入O(log n)用于插入,更新,删除的成本(子树的大小) 标准化编码:适合联接中的RDBMS统计和查询计划程序 每个节点需要多行 沿袭列(又名物化路径,路径枚举) 栏:沿袭(例如/ parent / child / grandchild / etc ...) 通过前缀查询的廉价后代(例如LEFT(lineage, #) = '/enumerated/path') 写入O(log n)用于插入,更新,删除的成本(子树的大小) 非关系:依赖于数组数据类型或序列化的字符串格式 嵌套间隔 类似于嵌套集,但具有实数/浮点数/十进制数,因此编码不会不稳定(廉价的移动/插入/删除) …