2012-03-06 9 views
0

おそらく数百万以上のエントリを持つMOdelAと、おそらくデータストアに300000個以上のエントリを持つModelBを持っています。AppEngineデータストアの2つの巨大コレクション間の関係をマップする方法

私は(1周り - 100秒)MODELAのために、主に新しいエントリを作成しますMODELAの各エンティティは、私はすべてを照会できるようにする必要がありますModelB

によって記述のいずれかのカテゴリに属しますModelBエンティティの1つに属するModelAエンティティ(作成時にソート)。

私の問題は、関係をマップする方法がわかりません。私は気をつけません。道を進むと、ModelAが属しているかもしれないMOdelCがあるので、親を使うだけです。

AppEngineでマップする方法はありますか?

通常のSQLデータベースでは、ModelAをModelBにマッピングし、後でModelAをModelCにマッピングする別のピボットテーブルにピボットテーブルを作成します。それからピボットテーブルに問い合わせて、例えばModelB id 5と言うことができるすべてのModelAsを教えてください。

ありがとうございました!

UPDATE:

私は私の問題を説明するための最良の方法は、私が何をしようとしている例になると思います。

メッセージとシティエンティティがあるとします。各メッセージは市についてのユーザーによって投稿されます(これらは私のModelAとModelBです)。これで、ユーザーは好きなだけ多くの都市を自分の好きな場所に追加できます。

私は、自分がお気に入りに持つ都市(日付でソートされた都市)についてユーザーにメッセージが表示されるようにデータモデルを設計する必要があります。したがって、Sean Fujiwaraが提案した例はうまくいかないでしょう。

私はこのような何かを照会しなければならないでしょう:

db.GqlQuery("SELECT * FROM Message WHERE city IN (1, 2, 3, 4, ....)

これを都市お気に入りに追加の利用者が多くを持っている可能性があるため、拡張することはできません。 AppEngineのドキュメントでは、

を含む単一のクエリは、30個以下のサブクエリに限定されています。クエリで

と各IN(...)にそれぞれの条件に対して複数の==クエリを生成

は、任意の提案をありがとう!

答えて

1

あなたはリレーショナルデータベースのスキーマについて考えています。 Google Datastoreはマップベースのデータベースなので、テーブルを標準化し直す必要があります。これは、データベースやモデルの宣言ではなく、アプリケーションコードによってスキーマが強制されることを意味します。

この記事では、それをうまく説明:それはあなたが何をしたいかのように聞こえる http://highscalability.com/how-i-learned-stop-worrying-and-love-using-lot-disk-space-scale

+0

非常に興味深いの読み取りは、どうもありがとうございました。残念ながら、私の問題は解決しません。私の質問への更新を見てください。ありがとう! – Ralphz

+0

私はあなたがUser.favoriteCities [City.key、City.key ...]のようなキーのリストを保存しなければならないかもしれないと思う。次に、一度に30都市のメッセージのクエリを実行する必要があります。これは制限ですが、何らかの形でdbに複数の非同期要求を実行して速度を上げることができます。 – aglassman

0

非常に簡単です:あなたが所有していない双方向の関係を望むよう

class ModelA(db.Model): 
    b = IntegerProperty() 
    creation_time = DateTimeProperty(auto_add_now = True) 

class ModelB(db.Model): 
    category_name = StringProperty() 

b_id = 5 

query = db.Query(ModelA) 
query.filter('b =', b_id) 
query.order('creation_time') 
rows = query.fetch(100) 
+0

お返事ありがとうございました。私は私の質問に更新を加えました。あなたの例は残念ながら私の問題を解決しません:( – Ralphz

+0

私は 'IN'演算子を使用して複数のクエリがApp Engineでこれを行う最良の方法だと考えています。データストアではすべて基本的に事前計算セットが必要です。 –

+0

残念ながら、GAEのドキュメントには次のようなことが書かれています:等しくない演算子またはIN演算子を含む単一のクエリは30個以下のサブクエリに限定されます。 ユーザのお気に入りリストが長ければ30個の要素でクエリが中断する http://code.google.com/appengine/docs/python/datastore/queries.html#Overview – Ralphz

0

ですね。あなたがこれを行うことができる1つの方法は、それぞれの側にキーのリストを作成することです。 JPAのようなものを使っているのであれば、基本的にはUsersとCitiesの間にManyToMany関係があります。ユーザーとメッセージのOneToMany関係。そして都市とメッセージのOneToMany関係。

メッセージを取得するには、基本的にユーザーに参加するメッセージの一覧を照会します。あなたの好きな都市のリストをあなたのユーザーから返すことで、好きな都市にあるメッセージから都市を引き出すことができます。

Datanucleusも同様に未所有関係を提供します。

http://datanucleus.blogspot.com/

関連する問題