8

以下に説明する単純なシステムを実現するためのデータモデルを構築するための効率的な方法について、誰かが概念的なアドバイスを提供するのではないかと考えています。非リレーショナルな方法で考えるのは少し新しいので、明らかな落とし穴を避けてみてください。基本的な原則は、正規化されたRDBMSの場合のように、「ストレージは安価で、データの重複を心配しないでください」ということだと理解しています。

モデル化したいのは次のとおりです。

0-nタグを付けることができるブログ記事。多くのブログ記事が同じタグを共有できます。データを取得するときに、タグに一致するすべての記事を取得できるようにします。多くの点で、stackoverflowでここで採用されているアプローチと非常によく似ています。

私の通常の考え方は、タグとブログ記事の間に多対多の関係を作成することです。しかし、GAEのコンテキストでは、これが行われている例を見てきましたが、これは費用がかかると考えています。

おそらく、記事エンティティの一部として各タグを含むListPropertyと、タグが追加および削除されたときにタグを追跡するための2番目のデータモデルを使用しますか?このように、関係は必要なく、ListPropertyは、一致するリスト要素が結果を返すクエリを引き続き許可します。

GAEでこれに取り組む最も効率的な方法に関する提案はありますか?

4

4 に答える 4

7

ご提案いただきありがとうございます。次のように(最初の繰り返し)実装しました。それが最善のアプローチであるかどうかはわかりませんが、機能しています。

クラス A = 記事。リスト要素でクエリできる StringListProperty があります

クラス B = タグ。タグごとに 1 つのエンティティで、各タグを使用する記事の合計数の現在のカウントも保持します。

A のデータ変更には、B のメンテナンス作業が伴います。事前に計算されていると考えるのは、読み取りが多い環境では適切なアプローチです。

于 2008-11-21T03:22:38.600 に答える
2

counts を事前に計算することは実用的であるだけでなく、 count() 関数が最大 1000 を返すため必要です。書き込み競合が問題になる可能性がある場合は、シャード カウンターの例を確認してください。

http://code.google.com/appengine/articles/sharding_counters.html

于 2009-04-06T21:41:10.937 に答える
1

多対多は合理的に聞こえます。実際に高額かどうかは、まずは試してみてはいかがでしょうか。

GAE の良い点は、使用しているサイクルが多すぎる場合に通知されることです。プロファイリング無料!

于 2008-11-20T02:31:29.140 に答える
1

考えられる方法の 1 つはExpando、次のようなタグを追加する方法です。

setattr(entity, 'tag_'+tag_name, True)

次に、次のようなタグを使用してすべてのエンティティをクエリできます。

def get_all_with_tag(model_class, tag):
    return model_class.all().filter('tag_%s =' % tag, True)

もちろん、適切な Python 識別子になるようにタグをクリーンアップする必要があります。私はこれを試していないので、本当に良い解決策かどうかはわかりません。

于 2008-11-20T23:43:15.813 に答える