Рекомендации по моделированию данных для системы тегов блогов в Google App Engine - PullRequest
8 голосов
/ 20 ноября 2008

Интересно, кто-нибудь может дать несколько концептуальных советов по эффективному способу построения модели данных для создания простой системы, описанной ниже. Я немного новичок в мышлении нереляционным образом и хочу попытаться избежать любых очевидных ошибок. Насколько я понимаю, основной принцип заключается в том, что «хранилище дешево, не беспокойтесь о дублировании данных», как это может быть в обычной СУБД.

Что я хотел бы смоделировать это:

Статья в блоге, которой можно присвоить 0-н тегов. Многие статьи блога могут использовать один и тот же тег. При получении данных хотелось бы разрешить поиск всех статей, соответствующих тегу. Во многих отношениях очень похож на подход, принятый здесь в stackoverflow.

Мое обычное мышление - создание отношений между тегами и статьями блога. Тем не менее, я думаю, что в контексте GAE это будет дорого, хотя я видел примеры этого.

Возможно, использовать ListProperty, содержащий каждый тег как часть сущностей статьи, и вторую модель данных для отслеживания тегов по мере их добавления и удаления? Таким образом, нет необходимости в каких-либо отношениях, и ListProperty по-прежнему разрешает запросы, при которых любое соответствие элемента списка будет возвращать результаты.

Какие-нибудь предложения по наиболее эффективному способу подойти к этому на GAE?

Ответы [ 4 ]

7 голосов
/ 21 ноября 2008

Спасибо вам обоим за ваши предложения. Я реализовал (первая итерация) следующим образом. Не уверен, что это лучший подход, но он работает.

Класс А = Статьи. Имеет StringListProperty, к которому можно обращаться по элементам списка

Класс B = Метки. Одна сущность на тег также ведет подсчет общего количества статей, использующих каждый тег.

Модификации данных в A сопровождаются работами по техническому обслуживанию B. Предполагается, что предварительные вычисления считаются хорошим подходом в среде с интенсивным чтением.

2 голосов
/ 07 апреля 2009

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

http://code.google.com/appengine/articles/sharding_counters.html

1 голос
/ 21 ноября 2008

Один из возможных способов - с Expando, где вы бы добавили тег вроде:

setattr(entity, 'tag_'+tag_name, True)

Тогда вы можете запросить все сущности с тегом вроде:

def get_all_with_tag(model_class, tag):
    return model_class.all().filter('tag_%s =' % tag, True)

Конечно, вы должны очистить свои теги, чтобы они были правильными идентификаторами Python. Я не пробовал этого, поэтому я не уверен, что это действительно хорошее решение.

1 голос
/ 20 ноября 2008

Много-много-много звучит разумно. Возможно, вам следует сначала попробовать, чтобы увидеть, действительно ли это дорого.

Хорошая вещь о Г.А.Е. является то, что он скажет вам, когда вы используете слишком много циклов. Профилирование бесплатно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...