ответ

21

Лучший вариант зависит от ваших требований. Вот несколько решений (я предполагаю, что вы используете Python, так как вы не указали):

  1. Если вам нужно сделать транзакционные обновления на все дерево, и вы не будете иметь больше чем примерно 1QPS постоянных обновлений для любого дерева, вы можете использовать встроенную поддержку хранения гериархия. При создании объекта вы можете передать атрибут «parent», чтобы указать родительский объект или ключ, а при запросе вы можете использовать метод .ancestor() (или «ANCESTOR IS» в GQL для извлечения всех потомков данного объекта
  2. Если вам не нужны транзакционные обновления, вы можете реплицировать функциональные возможности групп объектов без проблем с конкуренцией (и безопасности транзакций): добавьте db.ListProperty (db.Key) в вашу модель под названием «предки» и заполнить его списком предков объекта, который вы вставляете. Затем вы можете легко получить все, что происходит от данного предка, с помощью MyModel.all(). filter ('ancestors =', parent_key).
  3. Если вы Вам нужны транзакции, и вам нужно только получить прямые дочерние объекты сущности (не все потомки), используйте описанный выше подход, но вместо ListProperty ju st использует ссылочный объект для родительского объекта. Это называется списком смежности.

Существуют и другие подходы, но эти три должны охватывать наиболее распространенные случаи.

+0

Точка (2) отвечает на мой запрос! Благодарю. – MathOldTimer

+2

Кажется, что (2) и (1) делают то же самое, но что (1) будет намного дешевле. Мне кажется, что список ключей довольно дорогой с точки зрения стоимости хранения, что только ухудшится по мере того, как дерево станет глубже. Кроме того, не будет (1) привести к хорошей местности? –

+3

Встроенная поддержка предков использует ту же технику, что и 2 - она ​​хранит список предков внутри страны. Преимущество 2 заключается в том, что у вас нет ограничения скорости транзакции. Местность не является проблемой. –

2

Ну, вы должны попытаться сохранить ваши данные как можно более линейными. Если вам нужно быстро запросить древовидную структуру данных, вам придется либо хранить ее в масле в базе данных (или, если хотите, JSON-кодировку), если это возможно для ваших данных, либо вам придется генерировать индексы дерева, которые могут чтобы быстро запросить кусок древовидной структуры. Однако я не знаю, как Google App Engine будет работать при обновлении этих индексов.

Когда дело доходит до Google App Engine, ваша главная задача должна заключаться в сокращении числа запросов, которые вам нужно выполнить, и что ваши запросы возвращаются как можно меньше строк. Операции дороги, но хранения нет, поэтому избыточность не должна рассматриваться как плохая вещь.

Вот некоторые мысли по этому вопросу я нашел прибегая к помощи (хотя для MySQL, но вы можете получить общее представление от него): Managing Hierarchical Data in MySQL

Ах и вот обсуждение на Google App Engine: Modeling Hierarchical Data

0

Один из способов - использовать родительский атрибут модели. Затем вы можете использовать функции query.ancestor() и model.parent().

Я думаю, это зависит от того, какие операции вы хотите делать с этими данными, которые определят, как лучше всего это представлять.

+2

Это не очень хорошая идея. Группы объектов должны использоваться только тогда, когда это требуется для транзакций. Из документации: «Используйте только группы объектов, когда они необходимы для транзакций. Для других отношений между объектами используйте свойства ReferenceProperty и значения Key, которые могут использоваться в запросах». – Blixt

+0

Также помните: родитель объекта нельзя изменить, но ReferenceProperty может! – Trevor