Добавление тегов к полиморфным моделям в рельсах - PullRequest
1 голос
/ 05 октября 2010

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

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

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

Post, Article, Photo
has_many :taggings

Taggings (attributes)
taggable_type
taggable_id
tag_name

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

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

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

Спасибо.

1 Ответ

1 голос
/ 05 октября 2010

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

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

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

...