Подтвердить что ты не робот

Как Trello показывает историю так быстро?

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

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

Я знаю, что это не единственная услуга, которая предоставляет что-то подобное, но как бы вы решили создать такую ​​систему?

4b9b3361

Ответ 1

Я нахожусь в команде Trello. Мы используем коллекцию Actions в нашем экземпляре MongoDB с составным индексом на идентификаторах моделей, к которым он относится (карта - это модель, а также член) и дата, когда действие было выполнено. Никакое причудливое кэширование или что-либо еще, за исключением того, что индекс и недавно использованные документы хранятся в памяти БД. Действия - это наша самая большая коллекция.

Стоит отметить, что большая часть данных, необходимых для отображения действия, сохраняется в файле действия, денормализованная в документе действия, что значительно ускоряет процесс.

Ответ 2

Самый простой способ, который приходит на ум, - иметь таблицу типа:

create table HistoryItems (
ID INT PK,
UserID INT PK,
DateTime datetime,
Data varbinary(max)/varchar(max)/...)

Указание этого на UserID позволяет быстро извлекать данные. Индекс покрытия позволит получать историю всего пользователя на одном диске, независимо от того, как долго он будет.

Эта таблица может быть сгруппирована (UserID asc, DateTime desc, ID), поэтому вам даже не нужно иметь какой-либо индекс вообще и по-прежнему иметь оптимальную производительность.

Любая простая проблема для реляционной базы данных.

Ответ 3

У меня есть что-то очень похожее, как @Brett от Trello ответил выше в моем приложении PHP + MySQL, которое я использую для отслеживания активности пользователей в нашем заказе и приложении для управления производством для нашего интернет-магазина.

У меня есть действия в таблице, которые хранятся:

  • user_id: пользователь, выполнивший действие
  • action_id: действие, которое было выполнено (например, создание, обновление, удаление и т.д.)
  • resource: список ресурсов (моделей) ENUM, действие которых было выполнено (например, заказы, счета-фактуры, продукты и т.д.)
  • resource_id: PK ресурса, действие которого было выполнено на
  • description: текстовое описание действия (может быть нулевым)

Это большая таблица, но с правильными индексами она отлично справляется. Это действует. Прост и быстр. В настоящее время он хранит 200 тыс. Записей и растет с примерно. 1000 новых записей в день.