什么是左父母和右父母?
它在Openerp中是如何工作的?
谢谢
正如 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 可以有效地维护。
这些是嵌套集模型的字段。在 SQL 中管理具有无限深度的分层数据结构。在 MySQL 中管理分层数据一文通过 SQL 示例解释了此模型的详细信息。
OpenERP 使用嵌套集模型来管理诸如会计科目表和仓库位置之类的树。parent_left
和parent_right
列相当于上述文章中的right
和列。left