另一个选择是既存储节点的深度,又保留每个节点的完整路径的标识符,并将这两个都用作准则。
我将XML节点存储在关系数据库中的方式如下:
SELECT id,value FROM element e1
INNER JOIN element e2 ON (e2.id=e1.parent_id AND name='friend')
WHERE e1.depth>4 AND e1.path like 'root[1]/users[1]/user:dana[1]/public[1]%'
在此示例中,我在树中的每个级别上都有一个节点名称字段和一个方括号括起来的重复符,该重复节点具有相同的节点名称。
当您插入每个节点时,您必须通过跟随父节点到根节点(parent_id IS NULL)来计算完整路径,将每个级别附加到数组上,同时存储路径的深度。
在数据库中存储的任何类型的层次结构中,始终具有可视化的表示形式并易于访问任何路径总是一件好事,因为在每个请求上遵循树都可能代价高昂,尤其是对于没有任何直接递归SQL语法的mysql而言。
在我看来,将节点存储在层次结构中的左/右方案(嵌套集邻接表)在我看来太危险了,这种方案可能会出错,因为它管理起来非常复杂。