4

什么是左父母和右父母?

它在Openerp中是如何工作的?

谢谢

4

2 回答 2

8

正如 Raphael Collet 在他对 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 是客户的 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_left 和 parent_right 可以有效地维护。

于 2012-08-08T15:29:17.790 回答
3

这些是嵌套集模型的字段。在 SQL 中管理具有无限深度的分层数据结构。在 MySQL 中管理分层数据一文通过 SQL 示例解释了此模型的详细信息。

OpenERP 使用嵌套集模型来管理诸如会计科目表和仓库位置之类的树。parent_leftparent_right列相当于上述文章中的right和列。left

于 2012-08-08T09:54:53.467 回答