質問

Google App Engineデータストアに階層データを保存し、簡単にクエリする方法を誰かが説明できますか?

役に立ちましたか?

解決

最適なオプションは要件によって異なります。以下にいくつかの解決策を示します(指定しなかったため、Pythonを使用していると仮定しています):

  1. ツリー全体でトランザクション更新を行う必要があり、1つのツリーに対して約1QPSを超える持続的な更新を持たない場合は、階層型ストレージの組み込みサポートを使用できます。エンティティを作成するときに、「親」を渡すことができます。属性を使用して親エンティティまたはキーを指定し、クエリを実行するときに、.ancestor()メソッド(またはGQLの「ANCESTOR IS」を使用して、特定のエンティティのすべての子孫を取得できます。
  2. トランザクションの更新が不要な場合は、競合の問題(およびトランザクションの安全性)なしにエンティティグループの機能を複製できます。「祖先」と呼ばれるモデルにdb.ListProperty(db.Key)を追加し、データを入力します挿入するオブジェクトの祖先のリストが含まれます。次に、MyModel.all()。filter( 'ancestors ='、parent_key)を使用して、指定された祖先から派生したすべてのものを簡単に取得できます。
  3. トランザクションが不要で、エンティティの直接の子(すべての子孫ではない)の取得のみが必要な場合は、上記のアプローチを使用しますが、ListPropertyの代わりに、親エンティティにReferencePropertyを使用します。これは、隣接リストと呼ばれます。

他にも利用可能なアプローチがありますが、これら3つは最も一般的なケースをカバーするはずです。

他のヒント

さて、データを可能な限り線形に保つようにしてください。データのツリー構造をすばやくクエリする必要がある場合は、データで可能であれば、それをデータベースにピクルス(または必要に応じてJSONエンコード)で保存するか、できるツリーインデックスを生成する必要がありますツリー構造の一部をすばやく照会するために使用されます。ただし、これらのインデックスを更新するときにGoogle App Engineがどのように動作するかはわかりません。

Google App Engineに関しては、作成する必要のあるクエリの数を減らし、クエリで返される行をできる限り少なくすることが主な関心事です。操作は高価ですが、ストレージはそうではないので、冗長性は悪いことと見なされるべきではありません。

グーグルで見つけたテーマに関するいくつかの考えを以下に示します(MySQLについてですが、一般的な考えはそこから得られます): MySQLでの階層データの管理

ああ、ここにGoogle App Engineの議論があります:階層データのモデリング

1つの方法は、モデルの親属性を使用することです。その後、query.ancestor()およびmodel.parent()関数を使用できます。

このデータをどのように表現したいかによって、最適な表現方法が決まります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top