正如Raphael Collet在他关于OpenERP Server的回答中解释的那样:
parent_left和parent_right是与parent_id字段相关的特殊字段.这些字段的目的是使层次结构中的查询有效执行:使用parent_left和parent_right,您可以检索节点的所有后代而无需进行递归查询.
考虑层次结构中的两个节点A和B. 例如,A和B可以是合作伙伴类别.它们的整数字段parent_left和parent_right是这样的:
Run Code Online (Sandbox Code Playgroud)B is a descendant of A in the hierarchy (defined by parent_id)当且仅当
Run Code Online (Sandbox Code Playgroud)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查询检索Customers的所有子类别.请注意,值1和10是Customers的parent_left和parent_right; 它们可以作为查询本身的一部分进行检索.
Run Code Online (Sandbox Code Playgroud)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.