Подтвердить что ты не робот

Какова цель предков в хранилище движков Google?

Я недавно общался с движком Google и его хранилищем данных и создал datamodel и отношения, используя ссылочные свойства.

Однако я не совсем понимаю концепцию предков в хранилище данных. Какова их цель и почему я должен их использовать? Как они относятся к ссылочным свойствам объектов хранилища данных?

4b9b3361

Ответ 1

Другим преимуществом групп сущностей/предков является создание островов с сильной консистенцией (в отличие от возможной последовательности).

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

Однако с предками вы получаете сильную консистенцию. Таким образом, вместо простого внешнего ключа от задачи к проекту вы делаете проект предком для задач проекта. Теперь, при запросе задач, вы делаете его предком, также предоставляя ключ проекта. Результат будет строго согласован, и задача, которую вы только что закрыли, никогда не будет частью результата.

Ответ 2

Обычно используемый пример - автор и их книги.

Каждая книга хранится в хранилище данных как отдельная сущность, с ее именем и автор хранится как поля в модели.

Если вы хотите знать все книги одного автора, вы можете запустить запрос таким образом, чтобы

book.author == desired_author

Но с предками вы также можете сохранить каждую книгу и установить модель (новую модель автора) в качестве родителя (ее предка).

Итак, теперь вы можете просто сказать: "Покажите мне все книги, в которых этот автор является родителем".

Или, скорее, "покажи мне всех детей этого предка", и все книги этого автора вернутся.

Возможно, это не так полезно в этом примере, но если вы представляете вместо "автора" у вас есть "пользователь", а вместо "книги" у вас есть "сообщение с сообщением" и десятки тысяч сообщений, и вдруг это становится очень удобно, чтобы иметь возможность находить все сообщения от пользователя (например, показывать мне свои сообщения).

https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_ancestor

ancestor (ancestor)
Adds an ancestor filter to the query. The query will return only entities with the specified ancestor.

Есть также преимущества в расходах на поиск каждой записи, которую я ожидаю.

Ответ 3

Предоставление предка делает вашу (новую) сущность частью той же самой группы объектов, что и предок. Следовательно, все сущности с общим корневым объектом как предком будут храниться в одном хранилище данных node, эта "локальность" позволяет выполнять множество действий для всех этих сущностей (в одной и той же группе объектов) в рамках транзакции. Затем к любому запросу, который содержит запрос предка (например, только возвращаемые сущности, являющиеся дочерними, являются общими корневыми сущностями), эти действия будут возникать одновременно (атомарно) или вообще не выполняться.

Ref: http://www2.mta.ac.il/~kirsh/download/MTA%20NoSQL%20Seminar/Lectures/GAE.pdf