Sql 分层数据的改进闭包表的风险和好处

Sql 分层数据的改进闭包表的风险和好处,sql,hierarchy,Sql,Hierarchy,我正在尝试用SQL存储分层数据,并已决定使用 一个对象表,其中所有主要数据都将 和一个闭包表,定义对象之间的关系。 经过相当多的研究,一个封闭表似乎很适合我的需要。然而,我一直在读的一件事是,如果您想查询特定节点的直接祖先/后代,那么您可以在闭包表中使用深度列,请参见上面链接中的幻灯片68。我需要这个深度栏来促进这种精确的查询类型。这一切都很好,但闭包表的一个主要吸引人之处首先是可以方便地查询和修改其中包含的数据。添加一个深度列似乎完全破坏了修改数据的简单性,可以想象添加一个新节点并偏移树的整个

我正在尝试用SQL存储分层数据,并已决定使用

一个对象表,其中所有主要数据都将 和一个闭包表,定义对象之间的关系。 经过相当多的研究,一个封闭表似乎很适合我的需要。然而,我一直在读的一件事是,如果您想查询特定节点的直接祖先/后代,那么您可以在闭包表中使用深度列,请参见上面链接中的幻灯片68。我需要这个深度栏来促进这种精确的查询类型。这一切都很好,但闭包表的一个主要吸引人之处首先是可以方便地查询和修改其中包含的数据。添加一个深度列似乎完全破坏了修改数据的简单性,可以想象添加一个新节点并偏移树的整个分支

因此,我正在考虑修改闭包表,以便只定义节点与其直接祖先/后代之间的关系。这使我仍然可以轻松地穿过这棵树。查询数据似乎相对容易。修改数据不像没有深度字段的原始闭包表那么容易,但要比有深度字段的闭包表容易得多。这似乎是一个公平的折衷方案,几乎介于闭包表和邻接列表之间


我是不是忽略了什么?我这样做是否失去了闭包表的一个关键优势?有人认为这样做有什么内在的风险,以后可能会困扰我吗

我认为您正在失去的关键优势是,如果您想知道一个节点的所有后代或祖先,您现在必须进行更多的遍历

例如,如果从以下简单树开始: A->B->C->D


要获得A的所有后代,您必须先执行A->B,然后执行B->C,然后执行C->D。因此,三次查询,而不是按照正常模式执行一次查询。

我认为您正在失去的关键优势是,如果您想知道一个节点的所有后代或祖先,您现在必须执行更多的遍历

例如,如果从以下简单树开始: A->B->C->D


要获得A的所有子代,您必须先执行A->B,然后执行B->C,然后执行C->D。因此,三个查询,而不是按照正常模式执行的单个查询。

因此,闭包表祖先和后代中没有两列,而是有三列?这个,祖先,后裔?这就是你的意思吗?@kristianp不。仍然有两个,但通常在闭包表中,对于每个节点,其所有祖先/后代关系(包括远祖/后代)。在这里,我建议只定义直接关系。在我看来,这相当于一个邻接列表,正如@ATrimeloni所说,这样做基本上失去了使用闭包表的优势。因此,闭包表祖先和后代中没有两列,而是有三列?这个,祖先,后裔?这就是你的意思吗?@kristianp不。仍然有两个,但通常在闭包表中,对于每个节点,其所有祖先/后代关系(包括远祖/后代)。在这里,我建议只定义直接关系。在我看来,这相当于邻接列表,正如@ATrimeloni所说的,这样做基本上失去了使用闭包表的优势。