2008-11-20 2 views
8

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

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

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

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

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

Любые предложения по наиболее эффективному способу подхода к этому по GAE?

ответ

7

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

Класс A = Статьи. Имеет StringListProperty, который может быть запрошен в его элементах списка.

Класс B = Теги. Один объект для каждого тега также поддерживает текущее количество общего количества статей с использованием каждого тега.

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

+0

Просто подход, который я собирался предложить, за исключением того, что я не нашел времени. :) –

1

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

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

+0

Я думал, многие-ко-многим тоже, но даже в документации на Google предупреждает против этого во всех, кроме самых необходимых ситуациях. Хороший совет подумал о профилировании, я думаю, что попробую выполнить некоторые тесты с использованием разных подходов и сообщить результаты здесь. – Matty

1

Одним из возможных способов является с 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

Что делать, если имена тегов не должны быть английскими? –

2

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

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

+0

В новейших версиях gae sdk функция count() не имеет максимального предела: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count –

+0

true! будет редактировать. – mainsocial

Смежные вопросы