Разработка таблицы тегов, которая сообщает, сколько раз она использовалась - PullRequest
1 голос
/ 08 апреля 2010

Я пытаюсь спроектировать систему тегов с такой моделью:

Tag:
   content = CharField
   creator = ForeignKey
   used = IntergerField

Это отношение многие ко многим между тегами и тем, что было помечено.

Каждый раз, когда я вставляю запись в таблицу ассоциаций, Tag.used увеличивается на единицу и уменьшается на единицу в случае удаления.

Tag.used поддерживается, потому что я хочу ускорить ответ на вопрос «Сколько раз этот тег используется?».

Однако, похоже, это замедляет вставку.

Скажите, пожалуйста, как улучшить этот дизайн.

Заранее спасибо.

http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

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

ваше представление будет по запросу типа:

SELECT
    TagID,COUNT(*)
    FROM YourTable
    GROUP BY TagID

Агрегированиепредварительно вычисляется и сохраняется в индексе, чтобы минимизировать дорогостоящие вычисления во время выполнения запроса.

1 голос
/ 08 апреля 2010

Не думаю, что такая денормализация ваших данных - это хорошая идея.

Я думаю, что более элегантное решение - использовать агрегирование django для отслеживания того, сколько раз использовался тег http://docs.djangoproject.com/en/dev/topics/db/aggregation/

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

my_tag = Tag.objects.annotate(used=Count('post'))[0]

и затем получив к нему доступ следующим образом:

my_tag.used

при условии, что у вас естькласс модели Post, имеющий поле ManyToMany для вашего класса тегов

При необходимости вы можете упорядочить теги по названному аннотированному полю:

Tag.objects.annotate(used=Count('post')).order_by('-used')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...