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

Версия Ruby, которую вы используете (2.4.1), не совместима с версией Rails, которую вы используете (3.2.22.5). Эта версия Ruby требует как минимум Rails 5. Попробуйте понизить версию до Ruby 2.3 или ниже. Вы можете использовать менеджер версий Ruby (то есть rvm, rbenv или chruby), чтобы контролировать, какой Ruby используется при запуске вашего приложения.

Редактировать

Только что заметил, что вы уже используете rbenv из вашей трассировки стека. Добавьте файл .ruby-version в каталог вашего приложения, содержащий следующую строку:

2.3.4

После повторного входа в этот каталог подтвердите версию с помощью:

[111]gt; ruby -v
ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-darwin16]

(или аналогичной версии ) до запуска рельсов.

24
задан Dan McGrath 2 September 2016 в 22:57
поделиться

3 ответа

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

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

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

Если вам нужны транзакции, и вы заботитесь только о получении прямых потомков сущности (не всех потомков), используйте подход, описанный выше, но вместо ListProperty просто используйте ReferenceProperty для родительской сущности. Это известно как список смежности.

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

Если вам нужны транзакции, и вы заботитесь только о получении прямых потомков сущности (не всех потомков), используйте подход, описанный выше, но вместо ListProperty просто используйте ReferenceProperty для родительской сущности. Это известно как список смежности.

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

21
ответ дан 29 November 2019 в 00:15
поделиться

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

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

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

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

3
ответ дан 29 November 2019 в 00:15
поделиться

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

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

0
ответ дан 29 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: