1

親がない(ルートエンティティである)のに、同じ種類のエンティティが暗黙的に同じエンティティグループに含まれないのはなぜですか?たとえば、MySQLからHRDにデータを書き込むバッチ操作を実行したい場合は、次のようになります。

db.put([Person(name=person.name) for person in cursor.execute("SELECT * FROM person")])

そして私はこの理由でトランザクションを使用する必要があります:

注:db.put()またはdb.delete()のバッチ呼び出しは、一部のエンティティでは成功する可能性がありますが、他のエンティティでは成功しない可能性があります。呼び出しが完全に成功するか完全に失敗することが重要な場合は、トランザクションを使用する必要があり、影響を受けるすべてのエンティティは同じエンティティグループに属している必要があります。

ソース:https ://developers.google.com/appengine/docs/python/datastore/entities#Batch_Operations

トランザクションの目的でのみ実際のエンティティとして存在しない共通のルート親キーを作成する必要がありますか?

parent_key = db.Key.from_path('Human', 'human')
db.put([Person(parent=parent_key, name=person.name) for person in cursor.execute("SELECT * FROM person")])
4

2 に答える 2

2

同じ種類のエンティティは、ほとんどのユースケースで一般的にひどいパフォーマンスをもたらすため、暗黙的に同じエンティティグループに含まれることはありません。

完全に正確というわけではありませんが、エンティティグループはシャーディングを制御する方法と考えることができます。同じグループ内のエンティティは、物理的に近接して(つまり、同じサーバー上に)格納されるため、すべてのエンティティをトランザクションで操作できますが、そのエンティティグループのパフォーマンスも制限されます。エンティティグループ内の親の関係は種類に制限されていません。親エンティティは子と同じ種類である必要はありません。

ほとんどの場合、エンティティグループには、トランザクションがグループに基づく傾向があるため、論理的に一緒に属するさまざまな種類のさまざまなエンティティが含まれます。たとえば、アカウントが一連のトランザクションの親である場合や、BlogPostが一連のコメントの親である場合があります。

種類のすべてのエンティティを同じ親の下に置くと、実際にトランザクションを実行する必要がある他の操作のために、それらを適切に親にすることができなくなります。

あなたの場合、トランザクションで操作を実行せず、失敗した場合を処理するための追加のコードを用意する方がおそらく良いでしょう。

于 2013-01-16T03:59:23.850 に答える
1

いいえ、種類と親はキーの2つの異なる部分です。完全なキーは、実際にはアプリケーションID(暗黙的に設定)、名前空間ID、親キー(ルートへのすべての親キー)、および名前またはIDで構成されます。

親を省略すると、エンティティはエンティティグループのルートになり、このエンティティグループ内の唯一のエンティティになります。

あなたの場合、エンティティのバッチはPerson1つのエンティティグループを作成しませんが、すべてPersonが(トランザクションの観点から)独自のエンティティグループに含まれます。したがって、バッチプットはアトミックではありません。

注:エンティティグループは、「このすべてのエンティティを同じマシンに配置しましょう」の名前です。

注2:5つの異なるエンティティグループ間でトランザクションを実行できる新しいクロスグループトランザクションがあります。

于 2013-01-15T23:59:10.387 に答える