Активность потоков / каналов, чтобы денормализовать или нет? - PullRequest
17 голосов
/ 24 мая 2011

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

Любой опыт, понимание или помощь, которую кто-либо может предложить, очень приветствуется .Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Я никогда не имел дело с фидами социальной активности, но, по вашему описанию, они очень похожи на ведение сложных журналов деловой активности.

Лично я имею дело с отдельными таблицами для применимых типов действий, таблицей ревизий / журналов для каждого из этих типов и каждой из них со ссылкой на более центральную таблицу журналов событий.

Последний позволяет создавать канал и очень похож на решение, которое вы придумали: event_id, event_at, event_name, event_by, event_summary, event_type. (Поле event_type представляет собой varchar, содержащий имя таблицы или объекта.)

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

Вы можете получить некоторые интересные идеи, посмотрев на вопросы, связанные с журналом аудита:

https://stackoverflow.com/search?q=audit+log

0 голосов
/ 23 ноября 2011

Я думаю, что использование комбинации NoSQL / Memcached может удовлетворить ваши потребности. Пожалуйста, смотрите этот URL для дальнейших идей:

http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...