12

私には写真ギャラリーがあり、画像には100万以上のファンが潜在する可能性があるとします。どのndbデザインがより効率的ですか?GAE ndbデザイン、パフォーマンス、繰り返しプロパティの使用

class picture(ndb.model): 
    fanIds = ndb.StringProperty(repeated=True) 
    ... [other picture properties] 

または

class picture(ndb.model): 
    ... [other picture properties] 

class fan(ndb.model): 
    pictureId = StringProperty() 
    fanId = StringProperty() 

あなたはNDB繰り返しプロパティに追加することができ、繰り返し財産でアイテムを大量に保存すると、パフォーマンスのヒットがあるアイテムの数に制限はありますか?繰り返しプロパティーを使用することの効率が悪い場合は、その使用目的は何ですか?

+1

答えとは何もしませんが、クラス名 'CamelCase'とプロパティ名' lower_case_underscore'を継承することをお勧めします.. – Lipis

+0

また、 'pictureId'では' ndb.KeyProperty(kind = picture ) 'エンティティの処理を改善するために' StringProperty'の代わりに 'fanId = ndb.KeyProperty(kind = fan、repeated = True)'を使用します。 – Lipis

答えて

31

100-1000を超える値がある場合は、繰り返しプロパティを使用しないでください。 (1000は既にそれを押しているでしょう)。そのような用途のために設計されたものではありません。

+0

別の質問からこの答えにジャンプします:(stackoverflow.com/questions/26740505)。 10以上の要素に繰り返しプロパティを使用しないでください。したがって、繰り返しキーを使用することで関係を回避する必要があります。正しい? – EsseTi

+0

@Guidoこのような種類のバルクデータストレージにはどうすればよいですか? – Napolean

+0

@Napolean私は[NDB PickleProperty](https://cloud.google.com/appengine/docs/python/ndb/properties#types)があなたが探しているものだと思います。 – cjlallana

5

一般に、v1はもっと安いでしょう。

読み込み/書き込みコストでは、エンティティごとにフェッチ/書込みが行われるため、エンティティの数を減らしたいとします。バージョン1は安くなります。あなたが写真を取ってくるたびにすべてのファンを取ってくるとかなり安いです。

ただし、各エンティティは1MBに制限されています。ファンが100万人以上いる場合は、fanIdのサイズに応じてその上限に達する可能性があります。それはあなたの他の画像データを数えていないので、あなたはその1MBの限界を打つことができます。オーバーフローケースを処理するために、より複雑なコードを追加する必要があります。

大きなエンティティは、小さなエンティティよりもフェッチするのに時間がかかります。一度にすべてのファンを一度に取得しようとするならば、v1はより良いでしょう。いずれかのポイントで5人のファンを呼び出すだけであれば、v2はもっと速いかもしれません(たぶん)。一方、100万のファンエンティティを引き出そうとすれば、それは永遠に続くでしょう。

関連する問題