Если 'book is child of subcategoryA' и вы смоделировали это, добавив ключ subcategoryA к ключевому пути книги, вам нужно либо удалить / воссоздать книгу, либо вам нужно создать subcatagoryB с тем же ключом, что и у subcatagoryA первоначально,Это повлияет на все другие книги, которые были дочерними для subcatagoryA.
Это происходит потому (цитирует appengine docs: «Полный ключ назначается, когда сущность создается в хранилище данных, и ни одна из его частей не может измениться».).
Оба решения кажутся мне довольно сложными, и я предлагаю вам пересмотреть свой дизайн.Например, вы можете хранить ключ subcatagoryA как отдельное поле внутри отдельного свойства.Это также имеет и обратные стороны, которые вы можете частично решить, денормировав свои данные и сохранив (частично) данные подкатегории A непосредственно внутри книги.
[РЕДАКТИРОВАТЬ]
В ответ на ваш вопрос:Недостатком небольших групп объектов является то, что вы не можете использовать транзакции.Является ли это проблемой, зависит от ... действительно ли вам нужны транзакции с книгами + ((под) категориями. Большая проблема денормализации возникает, когда вы хотите изменить что-то из ваших денормализованных данных. Для этого вы можете придуматьСхема, подобная этой:
- хранить каждую категорию как сущность со свойствами. Сохраните категорию KEY + (некоторые из) других свойств с вашими книгами.
- Если категорияизменяет, обновляет все денормализованные данные всех книг, относящихся к этой категории (для хранения этих книг использовался сохраненный «внешний» ключ)
- Используйте задание cron для проверки согласованности в фоновом режиме (т. е. для случаев, когда предыдущее заданиена середине пути).