Я знаю, что вариации этого вопроса задавались много раз (и я их читал, 2 из них были: 1, 2), но я просто не могу оборачивать голову тем, что просто похоже на правильное решение.
Все было предложено от многих до многих отношений, разветвления, полиморфных ассоциаций, решений NoSQL, очередей сообщений, денормализации и их комбинаций.
Я знаю, что этот вопрос очень ситуативен, поэтому я кратко объясню свое:
- Многие действия, которые вызывают множество событий.
- Следующее, создание, симпатия, комментирование, редактирование, удаление и т.д.
- Пользователь может следить за другими действиями пользователя (события, которые они запускают).
- Наиболее востребованные события будут самыми последними событиями.
- Желательна возможность просмотра прошлых событий.
- Нет сортировки или поиска в канале, желательно, чтобы прошлый заказ по дате.
- Масштабируемость - это проблема (производительность и расширяемость).
В течение среднего времени я закончил работу с денормализованной установкой, состоящей в основном из таблицы событий, состоящей из: id
, date
, user_id
, action
, root_id
, object_id
, object
, data
.
user_id
является тем, кто вызвал событие. action
- действие. root_id
является пользователем, которому принадлежит object
. object
- тип объекта. data
, содержащий минимальный объем информации, необходимой для отображения события в потоке пользователя.
Затем, чтобы получить нужные события, я просто хватаю все строки, в которых user_id
является идентификатором пользователя, за которым следует поток, который мы захватываем.
Это работает, но денормализация просто кажется неправильной. Аналогично, полиморфические ассоциации. Кажется, что Fanout находится где-то посередине, но чувствует себя очень грязно.
Со всем моим поиском по этой проблеме и чтением многочисленных вопросов здесь, на SO, я просто не могу заставить ничего щелкнуть и почувствовать, как правильное решение.
Любой опыт, понимание или помощь, которую может предложить любой, значительно оценены. Спасибо.