Database design 特雷罗是如何如此迅速地展示历史的?

Database design 特雷罗是如何如此迅速地展示历史的?,database-design,architecture,trello,Database Design,Architecture,Trello,Trello显示了自董事会成立以来所有用户所做的一切的历史日志。同样,如果你点击一张特定的卡片,它会显示任何人所做的与该卡片相关的事情的历史记录 对无限期保存的每个更改/添加/删除进行跟踪必须收集大量数据,并且可能会在写入历史跟踪日志时遇到瓶颈(假设它立即写入各种类型的数据存储)。我的意思是,他们并不是把所有东西都存储在分布在1000多台服务器上的日志文件中,他们只是在需要查找某些东西时才收集和解析这些文件——他们一直在显示所有这些信息 我知道这不是唯一一项提供类似服务的服务,但您将如何着手构建

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

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


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

想到的最简单的方法是有一个如下表:

create table HistoryItems (
ID INT PK,
UserID INT PK,
DateTime datetime,
Data varbinary(max)/varchar(max)/...)
在UserID上对此进行索引允许快速检索。覆盖索引可以在一次磁盘搜索中获取整个用户的历史记录,无论它有多长

这个表可以聚集在(UserID asc、DateTime desc、ID)上,所以您甚至不必有任何索引,仍然可以获得最佳性能


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

我是Trello团队的成员。我们在MongoDB实例中使用一个Actions集合,在它所引用的模型ID(卡片是模型,成员也是模型)和执行操作的日期上有一个复合索引。除了索引和最近使用的文档由数据库保存在内存中之外,没有任何奇特的缓存或其他东西。Actions是迄今为止我们最大的收藏


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

我的PHP+MySQL应用程序中有一个非常类似于上面Trello回答的@Brett的东西,我用它来跟踪在线网店订单和生产管理应用程序中的用户活动

我的桌上活动包括:

  • user\u id
    :执行操作的用户
  • 操作\u id
    :执行的操作(例如创建、更新、删除等…)
  • resource
    :对其执行操作的资源(模型)的枚举列表(例如订单、发票、产品等)
  • 资源\u id
    :对其执行操作的资源的主键
  • 说明
    :操作的文本说明(可以为空)

它确实是一个很大的表,但是有了正确的索引,它处理得非常好。它起作用,这是它的目的。它简单快速。目前它拥有20万项记录,并随着cca的增长而不断增长。每天有1000个新条目。

你会惊讶于你的RDBMS到底有多好。日志不是存储在文件中,而是存储在一个数据库中,其中包含一些很好的索引。。但是,将所有这些数据写入一个表不会有非常糟糕的锁定问题吗?通常不会。每个事务的少量写入(这里就是这种情况)只会锁定行。插入可以以这种方式同时发生。因此,您可以使用时间戳和索引来存储操作,以便您可以快速查找,非常简单!什么是“action document”?我们使用MongoDB,因此“action document”相当于传统关系数据库中的“actions table中的行”,但它保存的是一个任意的JSON文档,而不是高度结构化的数据。@Brett,写操作是否会受到影响(较慢),因为您的数据都是非规范化的?