0

我使用嵌套集模型将分层数据(类别)存储在 mySql 数据库中。

一切正常,只有我现在需要能够向任何节点(force_to_top)添加属性,这会将节点设置为暂时强制到其兄弟节点的顶部,而且我不能 100% 确定如何在不物理更改的情况下执行此操作lftrgt价值观。

打开节点force_to_top属性时,我不想将原始值lftrgt值存储在其他位置,更改lftrgt值以将节点移动到正确位置,然后在删除属性后重置它们的原始值lftrgt值。force_to_top我认为这会进一步导致严重的问题,而且这似乎是一种非常迂回的做事方式?(如果这实际上是最简单的方法,请纠正我!但我想找到另一个,最好只使用 sql 不更新数据库中的任何值)

我想知道是否有可能根据force_to_top属性以某种方式操纵 sql 的输出?

例如,如果我们有以下结构

        Cars
        |
-----------------
|       |       |
Audi    Ford    VW

这将具有以下 lft/rgt/force_to_top 值:

node    lft    rgt  force_to_top
Cars    1      8    false
Audi    2      3    false
Ford    4      5    false
VW      6      7    false

当我们输出“Cars”的子节点时,我们会得到:

Audi
Ford
VW

但是假设节点'VW'的force_to_top属性设置为true,我真正需要的是'Cars'的子节点的输出现在是:

VW
Audi
Ford

正如我所提到的,我考虑过存储原始值lft和值并在删除属性rgt后重置它们。force_to_top不这样做的好处是关闭force_to_top属性的速度,这意味着除了实际将force_to_topfalse再次设置为之外没有数据操作,并且节点将立即回落到其原始位置。并且也意味着我不需要为每个节点的原始值lft和值创建存储区域/额外的表/额外的字段。rgt

在获取结果后,我也考虑过在 php 中执行此操作,但对于大型数据集可能会真正减慢速度。

我最初必须将force_to_top节点设置为所有内容的顶部,这非常简单ORDER BY force_to_top, lft,但是现在只强制到其兄弟节点的顶部要复杂得多,因为节点可能位于庞大层次结构的中心。

任何建议或正确方向的观点将不胜感激。

4

1 回答 1

0

以防万一有人在这里遇到类似的问题(非常不可能!):

最后,我能找到实现此功能的唯一方法是存储类别的当前值parent_id以及nearest_sibling_id何时将其force_to_top值设置为 true。

这样,我可以通过更新其lftrgt值将类别移动到其父级的顶部,然后当force_to_top被删除时,我可以检查nearest_sibling_id仍然存在,并且它仍然在原始parent_id. 如果是这样,请将类别移回其nearest_sibling_id;旁边。如果不是,只需将类别移至其原始类别的底部,parent_id因为我们无法确定它最初的真正位置,因为我们的nearest_sibling_id值已过时。

于 2012-11-01T11:01:24.503 回答