親左と親右とは何ですか?
Openerpでどのように機能しますか?
ありがとう
RaphaelColletがOpenERPサーバーについての彼の答えで説明しているように:
parent_leftとparent_rightは、parent_idフィールドに関連する特別なフィールドです。これらのフィールドの目的は、階層内のクエリを効率的に実行することです。parent_leftとparent_rightを使用すると、再帰クエリを実行せずにノードのすべての子孫を取得できます。
階層内の2つのノード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
したがって、以下のような6つのパートナーカテゴリがあると想像してください。ツリーをトラバースすることで、parent_leftとparent_rightを割り当てることができます。結果は、各ノードの横の括弧内に表示されます。そこにある値が最適であることに注意してください。実際には、数字にギャップを残すことができます。
- 顧客(1、10)
- 消費者(2、3)
- パートナー(4、9)
- 基本的なパートナー(5、6)
- ゴールドパートナー(7、8)
- サプライヤー(11、12)
1つのSQLクエリでCustomersのすべてのサブカテゴリを取得できます。値1と10は、Customersのparent_leftとparent_rightであることに注意してください。クエリ自体の一部として取得できます。
SELECT id FROM partner_category WHERE parent_left > 1 AND parent_left < 10
最後の注意点は、parent_leftとparent_rightは、階層全体をトラバースせずに更新できるということです。ノードを削除するのに変更は必要ありません。ノードを追加するために、2つのUPDATEクエリを使用してparent_leftとparent_rightを調整できます。1つは新しいノードの祖先のparent_leftとparent_rightの間に「スペースを作る」ためのもので、もう1つは新しいノードの後続の兄弟のparent_leftとparent_rightをシフトするためのものです。彼らの子孫。したがって、parent_leftとparent_rightを効率的に維持できます。
これらは、入れ子集合モデルのフィールドです。SQLでバインドされていない深さの階層データ構造を管理します。MySQLでの階層データの管理の記事では、SQLの例を使用してこのモデルの詳細を説明しています。
OpenERPは、入れ子集合モデルを使用して、勘定科目表や倉庫の場所などのツリーを管理します。parent_left
および列は、上記の記事のおよび列parent_right
と同等です。right
left