php/mysql - 记录用户 Activity 和巨大的数据库负载

标签 php mysql logging android-activity

假设我们必须记录一个社区的所有用户 Activity ,我想在短时间内我们的数据库将变得非常庞大;所以我的问题是:

无论如何,为了提供这种服务,这是一个可以接受的妥协(拥有一个巨大的数据库表)吗?或者我们可以用更有效的方式做到这一点?

编辑: 要记录的 Activity 类型是“经典”社交网络 Activity 日志,人们可以在其中查看其他人正在做什么或已经做过什么,反之亦然,因此它将跟踪例如用户编辑个人资料、发布内容、登录、注销等。

编辑 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
)

最佳答案

我实际上在一个类似的系统上工作,所以我对你得到的答案很感兴趣。

对于我的项目,拥有完整的历史记录并不重要,因此我们选择保持表格相当精简,就像您正在做的那样。我们的表看起来像这样:

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_atexpired_at 列只是为了方便。记录事件时,这些列会由模型自动更新,我们使用简单的 strftime('%F %T', strtotime($expr)) 其中 $expr是我们从配置中提取的类似于 '+30 days' 的字符串。

我们的 subject 列与您的 callback 列类似。我们还选择不直接将 Activity 主题与其他表相关联,因为有可能并非所有事件主题都有一个表,此外,保持这种关系甚至不重要,因为我们对该事件日志所做的唯一事情是显示 Activity 提要消息。我们存储与事件相关的数据的序列化值对象,以便在预定的消息模板中使用。我们还直接对事件的相关内容进行编码(即个人资料、评论、状态等)。

我们的事件(又名 Activity )是简单的字符串,如'update''create'等。这些用于一些查询,当然还有帮助确定向用户显示哪条消息。

我们仍处于早期阶段,因此这可能会发生很大变化(可能基于对该问题的评论和回答),但考虑到我们的要求,这似乎是一个不错的方法。

关于php/mysql - 记录用户 Activity 和巨大的数据库负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688548/

相关文章:

mysql - 按年和月计算总数

PhpStorm 对 JSON 函数的警告

php - 使用php将复选框值保存在mysql数据库中

python - 如何检查插入或更新是否会影响选择查询的结果

MySQL 允许从特定域访问?

r - 如何阻止 h2o 将大量 .ERR、.OUT 和其他日志文件保存到本地驱动器

authentication - 垃圾邮件查杀网站认证吗?

java - 从 EXE 和 DLL 访问 Singleton 对象中的成员变量

php - Elasticsearch-PHP批量

php - MYSQL & PHP 如何显示一个表中有多少个结果