「本はsubcategoryAの子」であり、本のキーパスにsubcategoryAのキーを追加してこれをモデル化した場合は、本を削除/再作成するか、subcatagoryAが元々持っていたのと同じキーでsubcatagoryBを作成する必要があります。これは、subcatagoryAの子である他のすべての本に影響します。
これは、(appengineのドキュメントを引用:「エンティティがデータストアに作成されるときに完全なキーが割り当てられ、そのパーツは変更できない」ためです)。
私にとってはどちらの解決策も非常に難しいように思われるので、設計を再考することをお勧めします。たとえば、subcatagoryAのキーを別のプロパティ内の個別のフィールドとして保存できます。これには欠点もあります。これは、データを非正規化し、subcatagoryAのデータ(の一部)を本の中に直接保存することで部分的に解決できます。
[編集]
あなたの質問に答えて:小さなエンティティグループの欠点は、トランザクションを使用できないことです。これが問題であるかどうかは、本+((サブ)カテゴリでのトランザクションが本当に必要かどうかによって異なります。非正規化データの一部を変更したい場合、非正規化のより大きな問題が発生します。このために、このようなスキーム:
- 各カテゴリをプロパティを持つエンティティとして保存します。カテゴリKEY+(の一部)の他のプロパティを本と一緒に保存します。
- カテゴリが変更された場合は、そのカテゴリに属するすべての書籍の非正規化データをすべて更新します(これらの書籍を検索するために保存された「外部」キーを使用)
- cronジョブを使用して、バックグラウンドでの整合性をチェックします(つまり、前のジョブが途中で失敗した場合)。