26

Trello 显示自董事会成立以来任何用户所做的所有事情的历史日志。同样,如果您单击特定卡片,它会显示任何人与该卡片相关的任何操作的历史记录。

跟踪无限期保存的每个更改/添加/删除必须收集大量数据,并且还可能成为写入历史跟踪日志的瓶颈(假设它被立即写入各种数据存储)。我的意思是,他们并不是将所有内容都存储在分布在 1000 台服务器上的日志文件中,他们只在需要查找某些内容时才收集和解析——他们一直在显示所有这些信息。

我知道这不是提供此类服务的唯一服务,但是您将如何构建这样的系统?

4

3 回答 3

34

我在 Trello 团队。我们在 MongoDB 实例中使用 Actions 集合,在它所引用的模型的 id 上具有复合索引(Card 是模型,Member 也是)和执行操作的日期。没有花哨的缓存或任何东西,除了索引和最近使用的文档由数据库保存在内存中。Actions 是迄今为止我们最大的系列。

值得一提的是,显示动作所需的大部分数据都以非规范化的方式存储在动作文档中,因此大大加快了速度。

于 2012-05-14T02:07:15.623 回答
3

想到的最简单的方法是有一个像这样的表:

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

在 UserID 上建立索引允许快速检索。覆盖索引可以在一次磁盘查找中获取整个用户的历史记录,无论它有多长。

该表可以聚集在 (UserID asc, DateTime desc, ID) 上,因此您甚至根本不需要任何索引并且仍然具有最佳性能。

关系数据库的任何简单问题。

于 2012-05-08T19:56:08.327 回答
1

我在我的 PHP + MySQL 应用程序中与 Trello 的 @Brett 非常相似,我用它来跟踪我们在线网上商店的订单和生产管理应用程序中的用户活动。

我有餐桌活动,其中包括:

  • user_id: 执行操作的用户
  • action_id: 已执行的操作(例如创建、更新、删除等...)
  • resource:执行操作的资源(模型)的 ENUM 列表(例如订单、发票、产品等)
  • resource_id: 执行操作的资源的 PK
  • description: 动作的文字描述(可以为空)

它确实是一个大表,但使用正确的索引它处理得很好。它执行它的目的。简单快捷。目前它拥有 20 万条记录,并且随着 cca 的增长而增长。每天1000个新条目。

于 2013-09-16T15:19:09.217 回答