4

親左と親右とは何ですか?

Openerpでどのように機能しますか?

ありがとう

4

2 に答える 2

8

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を効率的に維持できます。

于 2012-08-08T15:29:17.790 に答える
3

これらは、入れ子集合モデルのフィールドです。SQLでバインドされていない深さの階層データ構造を管理します。MySQLでの階層データの管理の記事では、SQLの例を使用してこのモデルの詳細を説明しています。

OpenERPは、入れ子集合モデルを使用して、勘定科目表や倉庫の場所などのツリーを管理します。parent_leftおよび列は、上記の記事のおよび列parent_rightと同等です。rightleft

于 2012-08-08T09:54:53.467 に答える