Когда использовать группы объектов в хранилище данных GAE

Вслед за моим предыдущим вопросом, касающимся иерархии объектов GAE Datastore, я все еще смущен тем, когда следует использовать группы лиц.. p >

Возьмем этот простой пример:

  • Каждый Company имеет один или несколько объектов Employee
  • Employee нельзя переместить в другой Company, и пользователи, имеющие дело с одним Company, никогда не смогут увидеть Employee другого Company

Это похоже на случай, когда я мог бы сделать Employee дочерний объект Company, но каковы практические последствия? Это улучшает масштабируемость, повышает масштабируемость или не влияет? Каковы другие преимущества/недостатки использования или отсутствия использования иерархии сущностей?

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

Ответ 1

Ник четко заявил, что вы не должны делать группы большими, чем необходимо, Рекомендации по написанию масштабируемых приложений./p >

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

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

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

Ответ 2

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

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