Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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