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

Jul*_*okk 7 php mysql logging android-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
)
Run Code Online (Sandbox Code Playgroud)

pro*_*son 8

我实际上正在研究一个类似的系统,所以我对你得到的答案感兴趣.

对于我的项目来说,拥有完整的历史会计并不重要,所以我们选择保持表格非常精简,就像你正在做的那样.我们的表看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

我们决定我们不想永远存储历史,所以我们将有一份cron工作在一段时间后杀死历史.我们有两个created_atexpired_at列只是为了方便.当记录事件,这些列由模型自动更新,我们用一个简单的strftime('%F %T', strtotime($expr))地方$expr是一个字符串像'+30 days'我们从配置上拉.

我们的subject专栏与您的专栏相似callback.我们还选择不直接将活动主题与其他表相关联,因为有可能并非所有事件主题都有一个表,另外它对于保持这种关系甚至不重要,因为我们对此事件日志的唯一做法是显示活动供稿消息.我们存储与事件相关的数据的序列化值对象,以用于预定的消息模板.我们还直接编码事件所涉及的内容(即,个人资料,评论,状态等).

我们events(又名活动.)是简单的字符串,如'update','create'等等.这些在某些查询中使用,当然也有助于确定向用户显示哪条消息.

我们仍然处于早期阶段,所以这可能会发生很大的变化(可能基于这个问题的评论和答案),但考虑到我们的要求,这似乎是一个很好的方法.