Я знаю, что варианты этого вопроса задавались много раз до (и я прочитал их, 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, я просто не могу заставить что-то щелкнуть и почувствовать себя правильнымрешение.
Любой опыт, понимание или помощь, которую кто-либо может предложить, очень приветствуется .Спасибо.