Когда использовать группы объектов в хранилище данных GAE
Вслед за моим предыдущим вопросом, касающимся иерархии объектов GAE Datastore, я все еще смущен тем, когда следует использовать группы лиц.. p >
Возьмем этот простой пример:
- Каждый
Company
имеет один или несколько объектов Employee
-
Employee
нельзя переместить в другой Company
, и пользователи, имеющие дело с одним Company
, никогда не смогут увидеть Employee
другого Company
Это похоже на случай, когда я мог бы сделать Employee
дочерний объект Company
, но каковы практические последствия? Это улучшает масштабируемость, повышает масштабируемость или не влияет?
Каковы другие преимущества/недостатки использования или отсутствия использования иерархии сущностей?
( Группы сущностей включить транзакции, но предположим для этого примера, что мне не нужны транзакции).
Ответы
Ответ 1
Ник четко заявил, что вы не должны делать группы большими, чем необходимо, Рекомендации по написанию масштабируемых приложений./p >
Используйте группы объектов, когда вам нужны транзакции. В примере, который вы дали, ReferenceProperty для сотрудника достигнет аналогичного результата.
Помимо транзакций, группы объектов могут быть полезны, потому что ключевые выборки и запросы могут быть исключены из родительского объекта. Тем не менее, вы можете рассмотреть multitenancy для этих типов прецедентов.
В конечном итоге группы больших групп могут повредить масштабируемость, объекты внутри группы объектов хранятся в одном планшете. Чем больше материалов вы втискиваете в одну группу сущностей, тем больше вы сокращаете объем работы, которую можно выполнять параллельно - ее нужно выполнять поочередно.
Ответ 2
Если вам не нужны транзакции, не используйте группы сущностей. В некоторых случаях они замедляют работу и никогда ничего не ускоряют. Их единственная выгода заключается в том, что они позволяют совершать транзакции.
Насколько я могу судить, лучше всего использовать группы сущностей - это данные, которые вряд ли будут доступны многим пользователям одновременно, и которые вы часто захотите включить в транзакцию. Таким образом, если вы сохранили содержимое корзины покупок, которое, вероятно, будет иметь только владелец этой тележки, это может быть полезно для группы сущностей - было бы неплохо иметь возможность использовать транзакцию для этих данных когда вы добавляете или обновляете объект, и вы не блокируете кого-либо из них, когда вы это делаете.