Хранить иерархические данные в хранилище данных Google App Engine?

StackOverflow https://stackoverflow.com/questions/1011814

Вопрос

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

Это было полезно?

Решение

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

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

    Другие советы

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top