Комментарии для разных моделей: полиморфные или нет?(Рубин на рельсах) - PullRequest
6 голосов
/ 05 апреля 2011

Я создаю приложение, которое позволяет комментировать 5 уникальных моделей (сообщения, фотографии, события и т. Д.), И еще 2 или 3 находятся в пути. В настоящее время каждая модель имеет связанную модель комментариев (PostComments, PhotoComments, EventComments и т. Д.), Хотя сами комментарии, как правило, одинаковы для всех моделей.

Недавно я обнаружил силу полиморфных ассоциаций, прекрасно объясненных в Railscast # 154 , который по сути объединяет множество моделей в одну модель и множество таблиц в одну таблицу.

Хотя полиморфные ассоциации будут очищать код и избыточность, как они влияют на производительность? Я не знаю много об оптимизации базы данных, но кажется, что запрос на комментарий из 1 000 000 строк в общей таблице комментариев займет больше времени, чем 200 000 строк в конкретной таблице комментариев. Стоит ли переходить к полиморфным ассоциациям (хотя приложение все еще находится на относительно ранней стадии разработки) или мне следует продолжать создавать модели / таблицы для каждого типа комментариев?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Это действительно зависит от того, насколько большим будет сайт. Сначала вы должны добавить индекс на 2 столбца.

add_index :comments, [:commentable_type, commentable_id]

Это значительно увеличит скорость.

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

Я говорю, сделайте 1 стол!

0 голосов
/ 04 ноября 2013

Немного улучшится по сравнению с ответом Майкла:

add_index :comments, [:commentable_id, :commentable_type]

Я думаю, что этот ответ будет лучше, потому что: атрибут commentable_id будет сужать запрос больше, что означает, что общая скорость запроса по индексу будет намного выше. Дайте мне отзывы об этом:)

...