Пожалуйста, помогите мне понять иерархии сущностей в хранилище данных GAE

Хранилище данных Google App Engine позволяет каждому объекту иметь родительский объект, по сути, способ формирования иерархии объектов. Например, Employee можно рассматривать как:

Company#521/Department#5/Employee#3

Идентификатор объекта уникален только среди объектов с одним и тем же родителем, поэтому для его уникальной адресации требуется полный путь к объекту.

Все идет нормально.

Но когда мне следует смоделировать отношения родитель-потомок таким образом, а не полагаться на базовое свойство ссылки в сущности, как в традиционной базе данных?

Единственная причина, по которой я могу придумать, - обойти отсутствие объединений в запросе к хранилищу данных. Я могу фильтровать запрос только по свойствам от объекта, вид которого я получаю, и по любому объекту, являющемуся родителем на любом уровне в иерархии объекта.

Любая другая причина использовать эту функцию?

В документации хранилища данных говорится, что объекты, принадлежащие к одной и той же иерархии, рассматриваются как группа объектов, и что объекты в одной и той же группе объектов имеют сериализованный доступ для записи. Что именно это означает? Означает ли это, что если одна нить моего приложения обновляется Department#5другой поток, который пишет в Employee#3 придется ждать окончания обновления?

Спасибо!

2 ответа

Решение

Вы должны использовать группы объектов только там, где это необходимо для определения транзакционных доменов. В App Engine транзакции могут изменять только объекты в одной группе объектов, то есть объекты с одним и тем же родителем. Если вам не нужна целостность транзакций между двумя объектами, они не должны находиться в одной группе объектов.

Если вам абсолютно необходимы глобальные транзакции, вы можете осуществить их самостоятельно - см. Пример в моем блоге на эту тему. На самом деле, относительно небольшая часть приложений действительно нуждается в глобальных транзакциях.

Типичное использование родительской функции вместо ReferenceProperties для транзакций.
Google App Engine позволяет проводить транзакции только с объектами в одной группе объектов, то есть с набором объектов с одним и тем же родителем.

Другие вопросы по тегам