php / mysql - регистрация действий пользователей и огромная загрузка базы данных - PullRequest
7 голосов
/ 16 апреля 2011

Предполагая, что мы должны регистрировать все активности пользователей сообщества, Я предполагаю, что в скором времени наша база данных станет очень огромной ;поэтому мой вопрос:

действительно ли это приемлемый компромисс (, чтобы иметь огромную таблицу БД ), чтобы предлагать этот вид услуг?Или мы можем сделать это более эффективным способом?

РЕДАКТИРОВАТЬ: регистрируемый вид деятельности - это «классический» журнал действий в социальных сетях, где люди могут посмотреть, чтодругие делают или сделали и наоборот, поэтому он будет отслеживать, например, когда пользователь редактирует профиль, публикует что-то, входит в систему, выходит из системы и т. д. .

РЕДАКТИРОВАТЬ 2: моя таблицауже оптимизирован для хранения только id's

log_activity_table(
id int
user int 
ip varchar
event varchar #event-name
time varchar
callbacks text #some-info-from-the-triggered-event
)

Ответы [ 3 ]

8 голосов
/ 17 апреля 2011

Я на самом деле работаю в подобной системе, поэтому меня интересуют ответы, которые вы получите.

Для моего проекта наличие полного исторического учета не имело значения, поэтому мы решили держать таблицу довольно скудной, как и вы. Наши таблицы выглядят примерно так:

CREATE TABLE `activity_log_entry` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `event` varchar(50) NOT NULL,
  `subject` text,
  `publisher_id` bigint(20) NOT NULL,
  `created_at` datetime NOT NULL,
  `expires_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `event_log_entry_action_idx` (`action`),
  KEY `event_log_entry_publisher_id_idx` (`publisher_id`),
  CONSTRAINT `event_log_entry_publisher_id_user_id` 
    FOREIGN KEY (`publisher_id`)  
    REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Мы решили, что не хотим хранить историю навсегда, поэтому у нас будет cron задание, которое убивает историю после определенного периода времени. У нас есть столбцы created_at и expired_at просто из-за удобства. Когда событие регистрируется, эти столбцы автоматически обновляются моделью, и мы используем простую strftime('%F %T', strtotime($expr)), где $expr - строка, подобная '+30 days', которую мы извлекаем из конфигурации.

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

Наши events (иначе действия) являются простыми строками, такими как 'update', 'create' и т. Д. Они используются в некоторых запросах и, конечно, помогают определить, какое сообщение показывать пользователю.

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

1 голос
/ 16 апреля 2011

Случай: когда все действия пользователя имеют разные таблицы.Например.Например, комментируйте, публикуйте, становитесь участником.

Тогда в этой таблице должен быть ключ, связывающий запись с пользователем.Для данного пользователя вы можете получать последние действия, запрашивая каждую таблицу по ключу user_key.

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

Случай: есть некоторые действия, которые называются общими и не имеют отдельной таблицы для них

Затем создайте таблицу для общих операций и найдите ее вместе.с другими таблицами активности.

0 голосов
/ 16 апреля 2011

Нужно ли сохранять конкретную активность каждого пользователя или вы просто хотите регистрировать вид активности, которая происходит с течением времени.Если последнее, то вы можете рассмотреть что-то вроде RRDtool (или похожий подход) и сохранить количество активности за разные временные шаги в круговом буфере, размер которого остается постоянным во времени.Смотри http://en.wikipedia.org/wiki/RRDtool.

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