邻接列表模型的一个主要问题是我们需要为每个节点运行一个查询以获取层次结构的路径.
在嵌套集模型这个问题不存在,但是对于每个添加的节点有必要给一个MySQL更新所有其他左和右值.
我的分层数据不是静态数据,例如电子商务的产品类别.是否按层次顺序注册用户.
在我的应用程序中,虽然有许多常量用户注册,但我还需要获取分层路径,直到到达层次结构中的第一个节点.
分析我的情况,两种替代方案中的哪一种最适合我的应用?
我最近一直在使用嵌套模型中的垃圾.我很高兴为几乎所有有用的操作和视图设计查询.我坚持的一件事是如何选择节点的直接子节点(并且只选择子节点,而不是其他后代!).
说实话,我知道一种方法 - 但它涉及无法管理的SQL数量.我确信有一个更直接的解决方案.
我一直在研究Adjacency List和Nested Set Model来找到最优的树解决方案.
到目前为止,我认为嵌套集模型的一个主要优点是我可以使用一个SQL查询和一些代码来获得完整的树.但是更新/插入节点很复杂,整个树很容易被破坏.
然后我偶然发现了这两个帖子:
http://www.sitepoint.com/forums/showthread.php?t=570360
以下代码允许我使用一个SQL查询使用Adjacency List.在我看来,Adjacency List更容易更新,不太可能破坏整棵树.
您对此代码有何看法?
生成多维数组以反映树结构
$nodeList = array();
$tree = array();
$query = mysql_query("SELECT id, title, page_parent FROM categories ORDER BY page_parent");
while($row = mysql_fetch_assoc($query)){
$nodeList[$row['id']] = array_merge($row, array('children' => array()));
}
mysql_free_result($query);
foreach($query AS $row){
$nodeList[$row['id']] = array_merge($row, array('children' => array()));
}
foreach ($nodeList as $nodeId => &$node) {
if (!$node['page_parent'] || !array_key_exists($node['page_parent'], $nodeList)) {
$tree[] = &$node;
} else {
$nodeList[$node['page_parent']]['children'][] = &$node;
}
}
unset($node);
unset($nodeList);
Run Code Online (Sandbox Code Playgroud)
使用嵌套节点准备无序列表
function printMenu …Run Code Online (Sandbox Code Playgroud) 嗨,我需要使用嵌套集模型来管理我的网站上的产品类别.你是否知道一些用于处理MySQL中嵌套集的好的预构建PHP库?
让我们马上挖掘主要问题,我有这样的输入
$category = array(
'A' => array('left' => 1, 'right' => 8),
'B' => array('left' => 2, 'right' => 3),
'C' => array('left' => 4, 'right' => 7),
'D' => array('left' => 5, 'right' => 6),
'E' => array('left' => 9, 'right' => 10),
);
Run Code Online (Sandbox Code Playgroud)
我希望输出是这样的
$tree = array(
array('A', 'B'),
array('A', 'C', 'D'),
array('E'),
);
Run Code Online (Sandbox Code Playgroud)
哪一个是通过输入数组循环并创建输出结果的最佳和快速函数?
这是嵌套集模型的"添加节点"SQL查询
LOCK TABLE mytestdb.tbltree WRITE;
SELECT @myRight := rgt FROM mytestdb.tbltree
WHERE name = 'apples';
UPDATE mytestdb.tbltree SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE mytestdb.tbltree SET lft = lft + 2 WHERE lft > @myRight;
INSERT INTO mytestdb.tbltree(name, lft, rgt)
VALUES('beans', @myRight + 1, @myRight + 2);
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
并映射到jOOQ
Record record = create.select(Tbltree.RGT)
.from(Tbltree.TBLTREE)
.where(Tbltree.NAME.equal("apples"))
.fetchOne();
int myright = record.getValue(Tbltree.RGT);
create.update(Tbltree.TBLTREE).set(Tbltree.RGT, Tbltree.RGT.add(2))
.where(Tbltree.RGT.greaterThan(myright)).execute();
create.update(Tbltree.TBLTREE).set(Tbltree.LFT, Tbltree.LFT.add(2))
.where(Tbltree.LFT.greaterThan(myright)).execute();
TbltreeRecord record2 = (TbltreeRecord) create
.insertInto(Tbltree.TBLTREE, Tbltree.NAME, Tbltree.LFT, Tbltree.RGT) …Run Code Online (Sandbox Code Playgroud) 使用MySQL,我遇到了嵌套集模型的问题.我可以插入,删除,移动子树到另一个父,一切正常.
但我无法弄清楚如何订购兄弟姐妹.例如,我有这些兄弟姐妹:
A,B,C,D,E
我希望在D之后移动B,获得这个:
A,C,D,B,E
我发现大量的存储过程用于插入,删除等,但没有一个用于订购兄弟姐妹.我发现的唯一一个是交换兄弟姐妹的程序,但这不是我想要实现的.
我试着写自己的一个,但它似乎很复杂,并不适用于所有情况.
如果你知道如何在他的一个兄弟姐妹之前或之后移动节点,那将非常感激.
我想要一个简单的谓词,它返回所有具有mode = 0的组和组中的注册模式= 0
确切地说,我需要一个谓词来访问嵌套对象属性.不知何故,谓词如下:
[NSPredicate predicateWithFormat:@"mode = 0 AND enrollments.Enrollment.mode = 0"]
Run Code Online (Sandbox Code Playgroud)
上面的谓词是错误的,显然不起作用.
编辑:
我也给了下面的谓词,但是没有成功.
[NSPredicate predicateWithFormat:@"mode = 0 AND ALL ( SUBQUERY(enrollments,$varEnrollment,$varEnrollment.mode = 0))"]
Run Code Online (Sandbox Code Playgroud)
我需要包含所有活动组的结果(group.mode = 0)和所有活动的enrollee(enrolles.mode = 0),但对我来说这个谓词不起作用.

core-data filter nested-set-model nspredicate nsfetchrequest