большой стол родитель-ребенок - PullRequest
2 голосов
/ 06 декабря 2010

если у меня есть pojo, как categoryA -> subcategoryA -> book отношения. подкатегория A является дочерним элементом родительской категории A. книга является дочерью подкатегории A в этом случае все находится внутри одной и той же группы лиц

если мне нужно переместить 'book' в другую подкатегорию-B. мне нужно удалить подкатегорию A и категорию A, и воссоздать категорию A -> подкатегория A -> без книги? и воссоздайте категорию b -> subcategoryb -> book, other-book, other-book3?

1 Ответ

1 голос
/ 06 декабря 2010

Если 'book is child of subcategoryA' и вы смоделировали это, добавив ключ subcategoryA к ключевому пути книги, вам нужно либо удалить / воссоздать книгу, либо вам нужно создать subcatagoryB с тем же ключом, что и у subcatagoryA первоначально,Это повлияет на все другие книги, которые были дочерними для subcatagoryA.

Это происходит потому (цитирует appengine docs: «Полный ключ назначается, когда сущность создается в хранилище данных, и ни одна из его частей не может измениться».).

Оба решения кажутся мне довольно сложными, и я предлагаю вам пересмотреть свой дизайн.Например, вы можете хранить ключ subcatagoryA как отдельное поле внутри отдельного свойства.Это также имеет и обратные стороны, которые вы можете частично решить, денормировав свои данные и сохранив (частично) данные подкатегории A непосредственно внутри книги.

[РЕДАКТИРОВАТЬ]

В ответ на ваш вопрос:Недостатком небольших групп объектов является то, что вы не можете использовать транзакции.Является ли это проблемой, зависит от ... действительно ли вам нужны транзакции с книгами + ((под) категориями. Большая проблема денормализации возникает, когда вы хотите изменить что-то из ваших денормализованных данных. Для этого вы можете придуматьСхема, подобная этой:

  • хранить каждую категорию как сущность со свойствами. Сохраните категорию KEY + (некоторые из) других свойств с вашими книгами.
  • Если категорияизменяет, обновляет все денормализованные данные всех книг, относящихся к этой категории (для хранения этих книг использовался сохраненный «внешний» ключ)
  • Используйте задание cron для проверки согласованности в фоновом режиме (т. е. для случаев, когда предыдущее заданиена середине пути).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...