#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 обеспечивают полезную отправную точку для автоматической денормализации.