Trello显示自董事会成立以来,任何用户所做的一切的讲史记录。 同样,如果你点击一个特定的卡上显示任何东西任何人的历史做了相关的那张卡。
保持每一个变化/添加/删除被无限期保留必须收集大量的数据,并且也写入历史跟踪日志潜在瓶颈的轨道(假设它立即写入各种各样的数据存储)。 我的意思是,这是不喜欢它们存储在跨他们只收集,当他们需要找到一些解析服务器1000的蔓延日志文件的一切 - 他们是显示所有这些信息的所有的时间。
我知道这是不是提供了这样的事情的唯一服务,但你将如何去架构这样的系统?
Trello显示自董事会成立以来,任何用户所做的一切的讲史记录。 同样,如果你点击一个特定的卡上显示任何东西任何人的历史做了相关的那张卡。
保持每一个变化/添加/删除被无限期保留必须收集大量的数据,并且也写入历史跟踪日志潜在瓶颈的轨道(假设它立即写入各种各样的数据存储)。 我的意思是,这是不喜欢它们存储在跨他们只收集,当他们需要找到一些解析服务器1000的蔓延日志文件的一切 - 他们是显示所有这些信息的所有的时间。
我知道这是不是提供了这样的事情的唯一服务,但你将如何去架构这样的系统?
我在Trello团队。 我们使用的操作集合在我们的MongoDB实例,对模型的IDS因为它是指(A卡是一种模式,所以是一个会员)和日期执行操作时,一个复合索引。 没有花哨的缓存或任何东西,除了因为索引和最近使用的文档由DB保存在内存中。 行动是迄今为止我们最大的集合。
值得一提的是,大多数显示的动作所需要的数据是动作文档中存储的非规范化,使大大加快东西。
我想到的最简单的方法是有一个像表:
create table HistoryItems (
ID INT PK,
UserID INT PK,
DateTime datetime,
Data varbinary(max)/varchar(max)/...)
在用户名索引这允许快速检索。 覆盖索引将启用获取中的一个磁盘整个用户的历史寻求不管它有多长。
该表可以在(用户ID递增,日期时间递减,ID)来聚集,所以你甚至不必拥有所有任何索引,并且还具有最佳的性能。
任何简单的问题了关系数据库。
我作为@Brett非常相似,从Trello在我的PHP + MySQL的应用程序,我用在我们的订单和生产管理应用跟踪用户活动为我们的在线网络商店上面回答的东西。
我有表活动,认为:
user_id
:所执行的行动用户 action_id
:这是执行的操作(例如,创建,更新,删除,等等...) resource
:资源(模型)上执行该操作的ENUM列表(如订单,发票,产品,等...) resource_id
:在其上执行操作的资源PK description
:该动作的文字说明(可以为null) 这是一个大表确实,但正确的索引它处理得非常好。 它的作用是目的。 简单,快捷。 目前它拥有20万条记录,并与CCA增长。 每天1000个新条目。