Использование предков или ссылочных свойств в Google App Engine?

В настоящее время многие из моего кода широко используют предков для размещения и извлечения объектов. Тем не менее, я хочу изменить кое-что.

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

У меня есть пользовательский объект и множество других объектов, например, комментарии, теги, друзья. Пользователь может создавать много комментариев, тегов и друзей, и поэтому всякий раз, когда пользователь делает это, я устанавливаю предок для всех этих вновь созданных объектов как пользователя.

Поэтому, когда я создаю комментарий, я устанавливаю предка как пользователя:

comment = Comment(aUser, key_name = commentId)

Теперь единственная причина, по которой я это делаю, - это строго для запросов. Я думал, что это будет быстрее, когда я захочу получить все комментарии определенного пользователя, чтобы просто получить комментарии к общему предку, а не запрашивать все комментарии, где authorEmail = userEmail.

Поэтому, когда я хочу получить комментарии от определенного пользователя, я:

commentQuery = db.GqlQuery('SELECT * FROM Comment WHERE ANCESTOR IS :1', userKey)

Итак, мой вопрос: хорошо ли это использование предков? Должен ли каждый комментарий ссылаться на объект User, создавший комментарий, и ссылаться на него?

(Кроме того, я думал, что использование предков вместо индексированного ReferenceProperty сэкономит на расходах на запись. Я ошибаюсь здесь?)

Ответ 1

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

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

- Добавление комментария Nick ---
Каждый объект с одним и тем же родителем будет находиться в одной и той же группе сущностей, а записи в группы сущностей сериализуются, поэтому использование предков здесь замедлит работу, если вы пишете несколько объектов одновременно. Поскольку все объекты в группе принадлежат "пользователю", который формирует корень группы в вашем экземпляре, однако это не должно быть проблемой - и на самом деле то, что вы делаете, на самом деле является рекомендуемым шаблоном проектирования.