16

この質問が単純すぎる場合は申し訳ありません。9年生になったばかりです。

NoSQL データベースの設計について学ぼうとしています。読み取り/書き込みの回数を最小限に抑える Google データストア モデルを設計したいと考えています。

これは、1 対多の関係でのブログ投稿とコメントのおもちゃの例です。すべてのコメントを StructuredProperty に格納するか、Comment モデルで KeyProperty を使用するか、どちらがより効率的ですか?

繰り返しますが、目的は、データストアへの読み取り/書き込みの数を最小限に抑えることです。次の仮定を行うことができます。

  • コメントは、それぞれのブログ投稿とは別に取得されません。(これにより、StructuredProperty が最も好ましいと思われます。)
  • コメントは、日付、評価、作成者などで並べ替えることができる必要があります (データストアのサブプロパティはインデックスを作成できないため、パフォーマンスに影響する可能性がありますか?)
  • ブログ投稿とコメントは、作成後に編集 (または削除) することができます。

構造化プロパティの使用:

from google.appengine.ext import ndb

class Comment(ndb.Model):
    various properties...

class BlogPost(ndb.Model):
    comments = ndb.StructuredProperty(Comment, repeated=True)
    various other properties...

KeyProperty の使用:

from google.appengine.ext import ndb

class BlogPost(ndb.Model):
    various properties...

class Comment(ndb.Model):
    blogPost = ndb.KeyProperty(kind=BlogPost)
    various other properties...

データストアへの読み取り/書き込みの数を最小限に抑えることに関して、1 対多の関係を効率的に表現することに関連するその他の考慮事項を自由に提起してください。

ありがとう。

4

3 に答える 3

14

私は間違っているかもしれませんが、私が理解していることから、StructuredProperty はエンティティ内の単なるプロパティですが、サブプロパティがあります。

これは、BlogPost とそのすべてのコメントを読むのに 1 回の読み取りしかかからないことを意味します。そのため、ページをレンダリングするときは、ページ全体に対して 1 つの読み取り操作のみが必要です。

書き込みもそれぞれ安くなります。BlogPost を取得するには 1 回の読み取り操作が必要です。インデックス付きのプロパティを更新しない限り、書き込み操作は 1 回だけです。

データストアからエンティティを読み取った後、独自にコメントの並べ替えを処理できます。

どちらも同じエンティティを変更しているため、コメントの更新/編集をトランザクションと同期して、1 つのコメントが別のコメントを上書きしないようにする必要があります。全員が同時に同じブログ投稿にコメントしたり編集したりすると、解決できない問題が発生する可能性があります。

ただし、コストの最適化では、エンティティの最大サイズが 1 MB という壁にぶつかります。これにより、ブログ投稿ごとに保存できるコメントの数が制限されます。

KeyProperty を使用すると、かなりコストがかかります。

ブログ投稿を取得するには 1 回の読み取りが必要です。さらに、コメントごとに 1 つのクエリと 1 つの小さな読み取り操作が必要です。

すべてのコメントは新しいエンティティであるため、少なくとも 4 回の書き込み操作が必要になります。ソート順のインデックスを作成すると、さらに多くの書き込み操作のコストがかかることになります。

プラス面としては、ブログ投稿ごとに無制限のコメントがあり、新しいコメントの同期について心配する必要はありません. コメントを編集するための同期について心配する必要があるかもしれませんが、編集を作成者に限定すれば、それは実際には問題になりません。自分でソートする必要もありません。

これは、コストと機能のトレードオフです。

于 2012-07-31T21:53:37.003 に答える
1

StructuredProperty を繰り返し使用する場合は、次の注意事項に注意してください。

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

GAE ndb の設計、パフォーマンス、繰り返しプロパティの使用でGuido の回答を参照してください。

したがって、StructuredProperty で 1 MB のエンティティ制限に達することはないかもしれませんが、100 ~ 1000 の提案された最大値に簡単に達する可能性があります。

于 2015-10-01T21:38:22.453 に答える