Хранить иерархические данные в хранилище данных Google App Engine? - PullRequest
24 голосов
/ 18 июня 2009

Может кто-нибудь проиллюстрировать, как я могу хранить и легко запрашивать иерархические данные в хранилище данных механизма приложений Google?

Ответы [ 3 ]

21 голосов
/ 18 июня 2009

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

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

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

3 голосов
/ 18 июня 2009

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

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

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

А вот и обсуждение для Google App Engine: Моделирование иерархических данных

0 голосов
/ 18 июня 2009

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

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

...