2012-08-08 59 views
3

父级左侧和父级右侧是什么?openerp中的父级左侧和父级右侧

它是如何工作的Openerp

感谢

+0

仔细查阅链接给出下它有大约家长留下了非常好的解释和父权 http://www.serpentcs.com/serpentcs-openerp-parent_left-parent_right-explained – 2012-09-06 12:22:27

回答

5

拉斐尔科莱解释his answer about OpenERP Server

parent_left和parent_right是涉及 的PARENT_ID领域特殊领域。这些字段的目的是使查询 有效地执行:使用parent_left和parent_right,您可以检索节点的所有后代,而不使用 进行递归查询。

考虑层次结构中的两个节点A和B.例如,A和B可以是合作伙伴 类别。他们整场parent_left和 parent_right是这样的:

B is a descendant of A in the hierarchy (defined by parent_id) 

当且仅当

A.parent_left < B.parent_left and 
    A.parent_left < B.parent_right and 
    B.parent_left < A.parent_right and 
    B.parent_right < A.parent_right 

所以,想象一下,你有六个合作伙​​伴类别如下图所示。您可以通过遍历树来指定parent_left和parent_right,并且 。结果 显示在每个节点旁边的括号内。请注意, 的值是最优的;在实践中,你可以在数字上留下空白。

  • 客户(1,10)
    • 消费者(2,3)
    • 伙伴(4,9)
      • 基本伙伴(5,6)
      • 金牌合作伙伴(7, 8)
  • 供应商(11,12)

您可以使用单个SQL 查询检索客户的所有子类别。请注意,值1和10是Customers的parent_left和parent_right;它们可以作为查询 本身的一部分进行检索。

SELECT id FROM partner_category 
    WHERE parent_left > 1 AND parent_left < 10 

的最后一句话是,parent_left和parent_right可以在不遍历整个层次结构进行更新 。删除节点不需要 需要任何更改。为了添加一个节点,你可以使用两个UPDATE查询修改parent_left 和parent_right:一个用于在新节点祖先的parent_left和parent_right之间“创建一些空间” ,另一个用于移动新节点的parent_left和parent_right跟随兄弟姐妹及其后代的 。所以parent_right和parent_right可以被有效地维护。

+1

不错的副本从https://answers.launchpad.net/openobject-server/+question/186704 – 2012-08-09 05:06:43

+0

你能看到评论“感谢Raphael Collet(OpenERP)的好解释。”我给了它的合适人选。在评论阅读完整答案之前。 – user1576199 2012-08-09 05:49:06

+2

您的确需要更明确一点,而不仅仅是感谢发布您在答案中复制的所有内容的人。我已经编辑了答案,以说明如何引用和引用其他来源的材料,以便明确信用到期的位置。该材料符合CC Attribution许可证,因此您必须非常明确地表明署名。 – 2012-08-09 15:19:26

3

这些是Nested Set Model领域。在SQL中用未绑定深度管理分层数据结构。文章Managing Hierarchical Data in MySQL用SQL中的示例解释了这个模型的细节。

OpenERP使用嵌套集模型来管理帐户和仓库位置等树木。 parent_leftparent_right列等于上述文章中的rightleft列。

+0

能详细解释一下吗? – user1576199 2012-08-08 10:09:38

+0

答案中的文章链接具有非常明确的示例和图表的所有细节。虽然标题说'在MySQL中',但这些信息与任何特定的SQL数据库都没有关系。 – 2012-08-08 10:44:19

+0

感谢穆罕默德阿里 – user1576199 2012-08-08 15:26:43