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