Какая разница между родительским и ссылочным свойством в Google App Engine?

Из того, что я понимаю, родительский атрибут db.Model(обычно определенный/переданный в вызове конструктора) позволяет вам определять иерархии в ваших моделях данных. В результате это увеличивает размер группы объектов. Однако мне не очень понятно, почему мы хотели бы это сделать. Это строго для соответствия ACID? Я хотел бы видеть сценарии, где каждый лучше всего подходит или более уместен.

Ответ 1

Существует несколько отличий:

  • Все объекты с одним и тем же предком находятся в одной группе сущностей. Транзакции могут влиять только на объекты внутри одной группы сущностей.
  • Все записи в одну группу объектов сериализуются, поэтому пропускная способность ограничена.
  • Родительский объект устанавливается на создание и фиксируется. Ссылки могут быть изменены в любое время.
  • С помощью ссылочных свойств вы можете запрашивать только прямые отношения, но с родительскими свойствами вы можете использовать фильтр .ancestor(), чтобы найти все (прямо или косвенно) от определенного предка.
  • Каждый объект имеет только один родительский элемент, но может иметь несколько ссылочных свойств.

Ответ 2

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

Я предлагаю вам перечитать раздел "Группы ключей и сущностей" в документах, мне потребовалось всего несколько раз прочитать эту идею.

Также смотрите эти разговоры, среди прочего, они обсуждают транзакции и группы сущностей: