我有以下代码:
$treeObject = Doctrine_Core::getTable('Category')->getTree();
$rootColumnName = $treeObject->getAttribute('rootColumnName');
foreach ($treeObject->fetchRoots() as $root) {
$options = array( 'root_id' => $root->$rootColumnName );
foreach($treeObject->fetchTree($options) as $node) {
$parent_id = $node->getNode()->getParent()->getId();
echo $parent_id;
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但getparent()调用为每个节点执行查询.是在那里检索父ID而不运行数百个额外的查询.
我使用嵌套集来表示我的应用程序中的层次结构,并且想知道放置索引(聚簇或其他)的最佳位置.我正在使用Microsoft SQL Server 2008.
操作:
我玩弄了左右两个聚集索引(大多数时候,它会用a来查询val BETWEEN @left AND @right.但是左右聚类是正确的方法吗?
非常感谢任何比我更有SQL索引经验的人!
架构原样
_id INT IDENTITY NOT NULL
_idParent INT IDENTITY NULL
_name NVARCHAR(64)
_left INT NOT NULL
_right INT NOT NULL
Run Code Online (Sandbox Code Playgroud) 我正在使用嵌套集将数据库存储在数据库中.表的字段是id,lft,rgt和name.
给定一个节点ID,我需要找到它们本身就是叶节点的所有直接子节点(不是孙子节点).
我在一个层次结构中有一组对象.有一个顶级"根"节点,它有子节点,后面又有子节点等.我试图使用嵌套集模型将这个结构保存到数据库中,每个节点的每个"边"都编号为定义层次结构,如在MySQL中管理分层数据:

(来源:mysql.com)
我的问题是计算左右值.我通常使用RecursiveIteratorIterator迭代层次结构,但我无法计算如何计算数字而不诉诸通过引用解析索引变量的递归函数.
有任何想法吗?
它可能没用,但这是我目前拥有的(不正确的)代码:
$iterator = new RecursiveIteratorIterator(
new Node_List(array($root)),
RecursiveIteratorIterator::SELF_FIRST);
$i = 0;
foreach ($iterator as $node) {
$node->left = ++$i;
$node->right = ++$i;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,会产生这样的结果:
Node
Node
Node
Run Code Online (Sandbox Code Playgroud)
左右值:
Node (1, 2)
Node (3, 4)
Node (5, 6)
Run Code Online (Sandbox Code Playgroud)
什么时候他们应该:
Node (1, 6)
Node (2, 3)
Node (4, 5)
Run Code Online (Sandbox Code Playgroud) 我希望在我即将开展的项目中使用这个概念.
更多信息:在MySQL中管理分层数据.
请通过示例分享您的经历好坏.
我正在添加更多信息以使其更广泛:
我有可以拥有多个父项的子项(例如:用户可以属于city,还有一个名为UserDefinedRegion的组),这是典型的层次模型不支持的,无论是邻接列表还是嵌套集.
为清楚起见,我在这里粘贴用例:
背景:目前系统具有固定的层次结构,即State-> County-> City-> User
销售经理登录系统并创建一个新组,该组可以与城市或县处于同一级别.
销售经理登录系统并创建一个新组,该组可以位于州和县或县和市之间.
销售经理创建组后,他应该能够在他的仪表板中查看第二天汇总的所有必要报告.
如您所见,第二点可以通过嵌套集轻松完成,但不是第一点,它将为同一子节点引入新的父节点.
到目前为止,stackOverflow用户提出了以下解决方案:
我肯定在寻找一个RDBMS解决方案.在现实生活中看起来没有多少人在层次数据模型中遇到过多个父节点.
使用此插件时是否有一种简单的方法来显示整个嵌套集?我想要做的是显示一个无序的根节点列表,每个子节点中还有另一个无序列表,其中也包含子节点等等?
任何建议表示赞赏
谢谢.
我有任务和用户.当用户完成任务时,我创建一个完成,其中有一个字段供用户指示他们花了多长时间.我需要一个表单,显示所有具有完成状态和time_spent属性的任务.在提交时,应更新已存在的完成,并应创建新的完成.如果可能的话,我想在Formtastic中这样做,但我会对基本的Rails 3解决方案感到满意.
class Completion < ActiveRecord::Base
belongs_to :task
belongs_to :user
# attribute time_spent
end
class User < ActiveRecord::Base
has_many :completions
has_many :tasks, :through => :completions
end
class Task < ActiveRecord::Base
belongs_to :milestone
has_many :completions
has_many :users, :through => :completions
end
Run Code Online (Sandbox Code Playgroud)
另一个方面是我想要显示一组特定任务,例如那些属于里程碑的任务.我应该在里程碑控制器上有一个表格发布到完成控制器吗?
class Milestone < ActiveRecord::Base
has_many :tasks
has_many :completions, :through => :tasks
end
Run Code Online (Sandbox Code Playgroud)
更新 我现在已经找了几天,我发现了很多 死路 一条.Rails表单中的这个Multiple对象很接近,但它要求所有链接对象都已存在.
让这个问题与众不同的是,有些链接尚不存在,并且没有单一的模型可以嵌套链接.例如,使用Ryan Daigle的嵌套对象形式帖子)我已经将这个工作以一种形式进行编辑所有可能的用户完成,但我需要在一个表单中编辑可能的完成的子集.我是否需要制作一个冗余对象MilestoneCompletions即has_manyCompletions和belongs_toUser?可以使用ActiveModel has_many吗?
我刚刚开始使用Ancestry而不是awesome_nested_set,我想创建一个嵌套表单,以便我可以在一个表单中创建一个父帐户和许多子帐户.问题似乎是Ancestry不允许你为新的父母创建一个孩子.
在awesome_nested_set中,我可以在rails控制台中执行此操作
a = Account.new
a.children.build
Run Code Online (Sandbox Code Playgroud)
当我输入a.children时,即使我的帐户父项尚未创建,我也可以在那里看到新的孩子.这允许我显示一个包含父帐户和一些空白孩子的表单,然后在提交时我会忽略任何空白孩子并创建整个批次.
如果我尝试使用祖先做同样的事情,我会收到以下错误:
a=Account.new
a.children
Ancestry::AncestryException: No child ancestry for new record. Save record before performing tree operations.
from /home/map7/.rvm/gems/ruby-1.9.2-p180/gems/ancestry-1.2.4/lib/ancestry/instance_methods.rb:62:in `child_ancestry'
from /home/map7/.rvm/gems/ruby-1.9.2-p180/gems/ancestry-1.2.4/lib/ancestry/instance_methods.rb:132:in `child_conditions'
from /home/map7/.rvm/gems/ruby-1.9.2-p180/gems/ancestry-1.2.4/lib/ancestry/instance_methods.rb:136:in `children'
from (irb):8
from /home/map7/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.7/lib/rails/commands/console.rb:44:in `start'
from /home/map7/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.7/lib/rails/commands/console.rb:8:in `start'
from /home/map7/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.7/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Run Code Online (Sandbox Code Playgroud)
这是祖先的限制吗?我有不同的方式可以使用祖先创建嵌套表单?
我想知道是否存在某种插件来管理实体框架4.2中的嵌套集数据库设计
http://en.wikipedia.org/wiki/Nested_set_model
我要处理分层数据,在我看来,嵌套集是更有效的处理方式。
我知道Php原则(ORM)中有某些东西,希望EF中也有类似的东西。
谢谢。
我正在使用stof/StofDoctrineExtensionsBundle(Atlantic18/DoctrineExtensions 的捆绑包装器)来实现嵌套集(树)实体。该实体已配置并正常工作,但我无法弄清楚如何在单个查询中检索所有子项(完整树)的所有根音符。我目前有完整的集合返回,但它延迟加载所有子项,这意味着执行了大量查询。
谢谢你的帮助。
nested-sets doctrine-orm doctrine-extensions stofdoctrineextensions
nested-sets ×10
nested-forms ×2
sql ×2
activerecord ×1
doctrine ×1
doctrine-orm ×1
indexing ×1
iterator ×1
php ×1
recursion ×1
sql-server ×1
tree ×1