Google App Engine データストアに階層データを保存して簡単にクエリを実行する方法を誰かが説明できますか?
3 に答える
最適なオプションは、要件によって異なります。ここにいくつかの解決策があります(指定しなかったので、Pythonを使用していると思います):
- ツリー全体でトランザクション更新を行う必要があり、1 つのツリーに対して約 1QPS を超える持続的な更新を行わない場合は、階層型ストレージの組み込みサポートを使用できます。エンティティを作成するときは、「parent」属性を渡して親エンティティまたはキーを指定できます。クエリを実行するときは、.ancestor() メソッド (または GQL では「ANCESTOR IS」) を使用して、特定のエンティティのすべての子孫を取得できます。 .
- トランザクションの更新が必要ない場合は、競合の問題 (およびトランザクションの安全性) なしでエンティティ グループの機能を複製できます。「先祖」と呼ばれるモデルに db.ListProperty(db.Key) を追加し、挿入するオブジェクトの祖先のリスト。次に、MyModel.all().filter('ancestors =', parent_key) を使用して、特定の祖先から派生したすべてのものを簡単に取得できます。
- トランザクションを必要とせず、エンティティの直接の子 (すべての子孫ではない) を取得することのみに関心がある場合は、上記のアプローチを使用しますが、ListProperty の代わりに、親エンティティへの ReferenceProperty を使用します。これは、隣接リストとして知られています。
他にも利用可能なアプローチがありますが、これらの 3 つは最も一般的なケースをカバーするはずです。
さて、あなたはあなたのデータをできるだけ線形に保つように努めるべきです。データのツリー構造をすばやくクエリする必要がある場合は、データで可能な場合はデータベースにピクルスで保存するか(または、必要に応じてJSONでエンコードして)、次のようなツリーインデックスを生成する必要があります。ツリー構造の一部をすばやくクエリするために使用されます。ただし、これらのインデックスを更新するときにGoogleAppEngineがどのように機能するかはわかりません。
Google App Engineの場合、主な関心事は、実行する必要のあるクエリの数を減らし、クエリが返す行をできるだけ少なくすることです。操作は高価ですが、ストレージは高価ではないため、冗長性を悪いものと見なすべきではありません。
これが私がグーグルで見つけた主題についてのいくつかの考えです(MySQLの場合ですが、それから一般的なアイデアを得ることができます):MySQLでの階層データの管理
ああ、これがGoogle App Engineのディスカッションです:階層データのモデリング
1 つの方法は、モデルの親属性を使用することです。その後、 query.ancestor() および model.parent() 関数を利用できます。
このデータに対してどのような種類の操作を行いたいかによって、それをどのように表現するのが最適かが決まると思います。