SQL 反模式 第三章:单纯的树 使用闭包集解决问题的疑问
最近在看SQL 反模式这本书 其中有节单纯的树 感觉挺有意思
书中部分摘要
第三章:单纯的树
目标:分层存储和查询 案例:文章和评论 每篇文章有多篇评论,每个评论可以引用另外的评论。
反模式: 最简单的解决方案就是在同一张表中存储该评论id的父节点id(parent_id) 但是这样只能查询两层的数据。如果需要三级,四级,则必须使用更多的邻接表,这种查询当然就无法直接树的无限级扩展了。查询一棵完整的树数据或者评论总数之类的会导致查询数据库的冗余数据。使用邻接表增加更新非常方便,但是删除就涉及到级联了
.....................
3.闭包集:重新用一张treepath表来存储树中所有节点的关系。里面有两个字段(ancestor,descendant)来存储祖先-后代关系,包括不是直接的父子关系信息。
select * from treepath t where not exists
(
select 1 from treepath where Ancestor<>t.Ancestor and Descendant=t.Descendant
)