Добавление тегов к полиморфным моделям в рельсах

Добавляю теги к нескольким моделям (сообщения, статьи, фотографии и т. Д.). Мне известны плагины для маркировки рельсов, но я предпочитаю не использовать их, поскольку они не совсем соответствуют моим конкретным потребностям.

Я знаю, что типичный способ реализации поддержки полиморфных тегов - использовать 2 таблицы Tags, Taggings и настроить соответствующие отношения has_many: through.

Но, как я думаю об этом немного больше - и вот мой вопрос: нужна ли таблица тегов. Есть ли недостатки в использовании только таблицы Taggings и есть ли у меня такие отношения:

Post, Article, Photo
has_many :taggings

Taggings (attributes)
taggable_type
taggable_id
tag_name

Тогда мне просто нужно будет самому управлять вставкой / удалением тегов. По сути, я хотел бы просто сохранить атрибут tag_name непосредственно в таблице Taggings, а не в таблице Tags.

Преимущества заключаются в том, что исключается управление таблицей, нет объединений для получения имен тегов (хотя я буду выполнять много операций SELECT DISTINCT).

Не могли бы вы поделиться своими мыслями об этом дизайне?

Спасибо.


person Jim Jones    schedule 05.10.2010    source источник


Ответы (1)


Эти SELECT DISTINCT станут одним из недостатков. Вы обнаружите, что создание списка тегов будет медленным не только в случае создания индекса для ссылки (который, я полагаю, можно обойти с помощью кэширования фрагментов), но и для автозаполнения.

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

Ничто из этого, конечно, не означает, что вам категорически не следует этого делать; пропуск дополнительного соединения сделает некоторые вещи намного быстрее. С вашей стороны будет разумно посмотреть на стоимость и решить, стоит ли оно того.

person pjmorse    schedule 05.10.2010