Схемы без указания дизайна для Google App Engine Datastore и других NoSQL DB

Исходя из реляционных баз данных, как я уверен, многие другие, я ищу некоторые твердые рекомендации по настройке/разработке моего хранилища данных в Google App Engine. Существуют ли какие-либо хорошие правила для людей с ограниченными возможностями для создания таких хранилищ данных без схемы? Я понимаю некоторые основы, такие как денормализация, так как вы не можете присоединяться, но мне было интересно, какие другие рекомендации были у людей.

Конкретный простой пример: я работаю над проблемами хранения запросов и их результатов. Например, у меня есть следующие две модели, определенные в приложении Google App Engine с помощью Python:

class Search(db.Model):
    who = db.StringProperty()
    what = db.StringProperty()
    where = db.StringProperty()

    createDate = db.DateTimeProperty(auto_now_add=True)

class SearchResult(db.Model):
    title = db.StringProperty()
    content = db.StringProperty()

    who = db.StringProperty()
    what = db.StringProperty()
    where = db.StringProperty()

    createDate = db.DateTimeProperty(auto_now_add=True)

Я дублирую кучу свойств между моделями ради денормализации, так как я не могу присоединиться к Search и SearchResult вместе. Имеет ли это смысл? Или я должен хранить идентификатор поиска в модели SearchResult и эффективно "присоединяться" к двум моделям в коде, когда я их извлекаю из хранилища данных? Пожалуйста, имейте в виду, что это простой пример. Обе модели будут иметь гораздо больше свойств и способ, которым я сейчас подхожу к этому, я бы поместил любое свойство, которое я поместил в модель поиска в модель SearchResult, а также.

Ответ 1

Не дублируйте свойства, если они всегда будут одинаковыми между SearchResult и a Search. Если a SearchResult должно иметь ссылку на Search, сохраните ReferenceProperty, указывая на поиск. В основном это сохраняет в модели Search Key.

class SearchResult(db.Model):
    search = db.ReferenceProperty(Search, required=True)
    # other stuff...

Я также очень рекомендую вам посмотреть некоторые из видеороликов App Engine из прошлогодних Google I/O (и от 2008), в частности этот от Бретта Слаткина и этот Райана Барретта. Они все очень полезные видеоролики, если у вас есть время, но я обнаружил, что эти два особенно хороши.