де-нормализующая модель данных: django / sql -> app engine

#database #django #google-app-engine #data-modeling #denormalization

#База данных #django #google-app-engine #моделирование данных #денормализация

Вопрос:

Я только начинаю разбираться в нереляционных базах данных, поэтому я хотел бы попросить помощи в преобразовании этих традиционных моделей SQL / django в модели Google App Engine.

Примером являются списки событий, где каждое событие имеет категорию, принадлежит месту проведения, и к месту проведения прикреплено несколько фотографий.

В django я бы смоделировал данные следующим образом:

 class Event(models.Model)
    title = models.CharField()
    start = models.DatetimeField()
    category = models.ForeignKey(Category)
    venue = models.ForeignKey(Venue)

class Category(models.Model):
    name= models.CharField()

class Venue (models.Model):
    name = models.CharField()
    address = models.CharField()

class Photo(models.Model):
    venue = models.ForeignKey(Venue)
    source = models.CharField()
  

Как бы я выполнил эквивалент с моделями App Engine?

Ответ №1:

Здесь нет ничего, что должно быть де-нормализовано для работы с App Engine. Вы можете изменить ForeignKey на ReferenceProperty, CharField на StringProperty и DateTimeField на DateTimeProperty и готово. Возможно, было бы эффективнее хранить категорию в виде строки, а не ссылки, но это зависит от контекста использования.

Денормализация становится важной, когда вы начинаете разрабатывать запросы. В отличие от традиционного SQL, вы не можете писать специальные запросы, которые имеют доступ к каждой строке каждой таблицы. Все, что вы хотите запросить, должно удовлетворяться индексом. Если сегодня вы выполняете запросы, которые зависят от сканирования таблиц и сложных объединений, вам придется убедиться, что параметры запроса индексируются во время записи, а не вычисляются на лету.

В качестве примера, если вы хотите выполнить поиск без учета регистра по названию события, вам пришлось бы сохранять копию заголовка в нижнем регистре для каждого объекта во время записи. Не угадав ваши требования к запросу, я не могу предложить более конкретный совет.

Ответ №2:

Можно запустить Django на App Engine

Вам нужно три приложения отсюда:http://www.allbuttonspressed.com/projects

  • Django-nonrel
  • djangoappengine
  • djangotoolbox

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

  • django-dbindexer

… она денормализует поля, к которым вы хотите присоединиться, но имеет некоторые ограничения — не обновляет денормализованные значения автоматически, поэтому действительно подходит только для статических значений

Сигналы Django обеспечивают полезную отправную точку для автоматической денормализации.