10

Вслед за my earlier question regarding GAE Datastore entity hierarchies, я до сих пор путают о том, когда использовать группы объектов.Когда использовать группы объектов в Datastore GAE в

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

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

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

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

ответ

8

Ник четко заявил, что вы не должны делать группы большими, чем необходимо, Best practices for writing scalable applications имеет некоторое обсуждение, почему.

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

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

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

8

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

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

+8

Дух здесь определенно прав, и я могу немного пересмотреть технические детали. группы лиц могут повысить масштабируемость, поскольку записи сериализуются для каждой группы сущностей, а не потому, что их данные хранятся близко друг к другу. (пространственная локальность на самом деле часто хороша для кеширования и масштабирования, в зависимости от деталей реализации). Учитывая это, не беспокойтесь слишком много об объеме данных на группу сущностей. Главное беспокоиться о пропускной способности записи.как отмечено во многих других местах, вы не можете делать более 1-10 записей в секунду на группу сущностей. – ryan 2011-01-31 19:57:21