3

このようなエンティティがあるとしましょう。

postid=db.StringProperty()
comment=db.StringProperty()

投稿IDで識別される特定の投稿へのコメントを保存するため。コメントは何十億ものレコードにヒットする可能性があります。特定の投稿に属するすべてのコメントを取得したい場合は、

query=Comment.all()
query.filter('postid = ','id').

または、その代わりに、次のように投稿を定義できます

class Post(db.Model)
    commentids=db.StringListProperty()#store list of comment ids

このようにして、次のようにしてコメントを直接取得できます

comment=Comment.get_by_key_name('commentkey')

長期的には (コメントが数百万または数十億のマークに達した場合)、どちらがより効率的ですか。つまり、どちらがより適切かということです。

4

2 に答える 2

3

数十億のコメントを予定している場合は、自動キャッシングをサポートする最新のNDB APIの使用も検討してください。

それらをフィルタリングする代わりに、おそらくエンティティpostidの親を使用する必要があります。Comment以下に例を示します (DB を使用していますが、NDB を使用した場合も非常に似ています)。

このようなモデルがある場合:

class Post(db.Model):
  desc = db.StringProperty()

class Comment(db.Model):
  desc = db.TextProperty()

次のような投稿やコメントを作成できます。

post_db = Post(desc='Hello World')
post_db.put()

comment_db = Comment(parent=post_db, desc='Nice post')
comment_db.put()

post_db最後に、特定のエンティティからすべてのコメントを取得する場合:

comment_dbs = Comment.all().ancestor(post_db)
于 2012-09-07T17:47:05.510 に答える
0

エンティティのサイズは 1 MB に制限されています。また、エンティティは最大 5000 のインデックス エントリを持つことができるため、インデックスが作成されている場合commentids、最大サイズは 5000 エントリになります。

したがって、オプション 2 は、何百万ものコメントには適していません (投稿ごとに 100 万のコメントがあるサイトは見たことがありませんが、Reddit では、人気のある投稿で 5,000 を超えるコメントが得られます.

また、おそらくプログレッシブな方法 (ページング、プログレッシブ スクロール) でコメントを一覧表示する方法が必要になるでしょう。この場合、カーソルを介してコメントを段階的にリストでき、さまざまな基準 (時間、投票など) を介してプロパティを並べ替えることができるため、クエリを介したオプション 1 の方が適しています。

于 2012-09-07T21:53:20.353 に答える