Пожалуйста, помогите мне понять иерархии сущностей в хранилище данных GAE
Хранилище данных Google App Engine позволяет каждому объекту иметь родительский объект, по сути, способ формирования иерархии объектов. Например, Employee
можно рассматривать как:
Company#521/Department#5/Employee#3
Идентификатор объекта уникален только среди объектов с одним и тем же родителем, поэтому для его уникальной адресации требуется полный путь к объекту.
Все идет нормально.
Но когда мне следует смоделировать отношения родитель-потомок таким образом, а не полагаться на базовое свойство ссылки в сущности, как в традиционной базе данных?
Единственная причина, по которой я могу придумать, - обойти отсутствие объединений в запросе к хранилищу данных. Я могу фильтровать запрос только по свойствам от объекта, вид которого я получаю, и по любому объекту, являющемуся родителем на любом уровне в иерархии объекта.
Любая другая причина использовать эту функцию?
В документации хранилища данных говорится, что объекты, принадлежащие к одной и той же иерархии, рассматриваются как группа объектов, и что объекты в одной и той же группе объектов имеют сериализованный доступ для записи. Что именно это означает? Означает ли это, что если одна нить моего приложения обновляется Department#5
другой поток, который пишет в Employee#3
придется ждать окончания обновления?
Спасибо!
2 ответа
Вы должны использовать группы объектов только там, где это необходимо для определения транзакционных доменов. В App Engine транзакции могут изменять только объекты в одной группе объектов, то есть объекты с одним и тем же родителем. Если вам не нужна целостность транзакций между двумя объектами, они не должны находиться в одной группе объектов.
Если вам абсолютно необходимы глобальные транзакции, вы можете осуществить их самостоятельно - см. Пример в моем блоге на эту тему. На самом деле, относительно небольшая часть приложений действительно нуждается в глобальных транзакциях.
Типичное использование родительской функции вместо ReferenceProperties для транзакций.
Google App Engine позволяет проводить транзакции только с объектами в одной группе объектов, то есть с набором объектов с одним и тем же родителем.