1

質問と回答のコメント アプリケーションがあります (stackoverflow に似ています)。質問とそれに関連する回答およびコメントは、App Engine Docsで定義されているエンティティ グループの一部を論理的に形成します。

エンティティ グループ/祖先パスを使用してエンティティをグループ化したい理由は 2 つあります。

  1. 質問と回答のエンティティを物理的にまとめて格納することで、クエリの効率を向上させます
  2. 祖先クエリを実行できるようにするため、質問エンティティ (関係) に回答キーを保存する必要がなくなります

最終的に競合が発生するため、強い一貫性は必要ありません。

App Engine はエンティティ グループを更新時に常にロックしますか?それともトランザクションで更新が行われている場合にのみロックしますか? 言い換えれば、エンティティ グループは、トランザクションで強制的に更新を行うのか、それとも単にトランザクションを使用するオプションを提供するのか?

4

1 に答える 1

3

祖先ベースのアプローチを選択する最初の理由について-データストア内の物理的な場所に関して、何らかの約束を見たことはないと思います-そのような制約は、その高いスケーラビリティと衝突すると思います. 私はそれについて心配しません。私見では、そのような効率の最適化による利益は、あったとしてもごくわずかです。

競合は (強い) 一貫性に直接関係していないことに注意してください (一貫性は、実際にはクエリ結果の正確さに帰着します)。

ただし、競合は、書き込みだけでなく、読み取り操作であっても、同じエンティティ グループに同時にアクセスすることに直接関係しています。「 Google App Engine での競合の問題」を参照してください。祖先ツリー内のすべてのエンティティが同じエンティティ グループに属しているため、祖先を使用するとさらに悪化します。

2 番目の理由 (目標を正しく理解している場合) では、 Answer キーを Question エンティティに保存したり、祖先を使用したりする必要はありません。質問キー (またはキー ID) を Answer エンティティに格納すると、一致する質問キー/ID を使用して Answer エンティティに対して通常の (祖先ではない) クエリを実行することにより、質問に対する回答を取得できます。

エンティティ グループの「ロック」は、トランザクションでのみ表示されます (いいえ、トランザクションは強制されませんが、トランザクションの外部に書き込もうとする前によく考えてください - 意図しない上書きが発生します)。ただし、このようなロックは、競合する書き込み操作に対する保護としてのみ有効であり、競合に対しては有効ではないことに注意してください。

于 2019-09-24T03:18:48.027 に答える