Используйте отдельную модель для хранения записей каналов, как вы предлагаете в своей первой идее. Шаблон дизайна, на который вы смотрите, называется шаблон полиморфной ассоциации
Давайте предположим, что эта новая модель называется Feed, следуя паттерну полиморфной ассоциации, вы будете использовать столбцы: feedable_type и feedable_id (в зависимости от предложенной модели имен столбцов и related_id)
Я должен признать, что ваша проблема больше, чем простое понимание полиморфных ассоциаций, каналы являются важным нововведением современного информационного дизайна и включают в себя множество сложных функций, включая:
- Защита
- Подписаться / Подписаться
- Фильтрация
- Слияние
Все это может значительно усложниться в зависимости от любого из этих атрибутов. И если вам необходимо выполнить некоторые нефункциональные требования, такие как масштабирование и производительность, головная боль быстро усугубится.
Если вы когда-либо создавали приложение для Facebook, было бы очень интересно увидеть, как работает их API публикации фидов.
Вы быстро заметите, что отдельная модель, используемая для хранения фида, совершенно не оборудована для рендеринга записей фида HTML, но загрузка оригинальной модели, которая хорошо оснащена для рендеринга HTML, является дорогой базой данных. Для решения этой проблемы у меня есть исходная модель рендеринга HTML-кода канала, и я сохраняю его в таблице каналов.
Конечно, реализация даже немного сложнее, чем эта. Как и в случае с Facebook, все каналы имеют 1 общее (они исходят от людей). Таким образом, каждая запись в фиде имеет user_id (так сказать). Поскольку мы знаем, что все каналы имеют эти данные и могут отобразить часть «кто это сделал» в новостной ленте, мы не выполняем предварительную визуализацию этой части.
Весьма полезно предварительно выполнить рендеринг как можно большего объема, который позже будет сложно построить из модели канала, но отложить предварительный рендеринг, когда мы уверены, что компонент вездесущ, и его можно заправить в нашу модель канала. 1027 *
Наконец, изучение проектов с открытым исходным кодом - хороший способ выучить