Рекомендации по проектированию без схемы для хранилища данных Google App Engine и других баз данных NoSQL - PullRequest
9 голосов
/ 16 апреля 2010

Исходя из реляционной базы данных, как, я уверен, и многих других, я ищу некоторые четкие рекомендации по настройке / проектированию моего хранилища данных в 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 Ответ

6 голосов
/ 16 апреля 2010

Не дублируйте свойства, если они всегда будут одинаковыми между SearchResult и Search. Если у SearchResult должна быть ссылка на Search, оставьте ReferenceProperty, указывающую на Поиск. Это в основном хранит связанные Search Key в модели.

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

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

...