Trello显示了自董事会成立以来任何用户所做的所有事情的历史记录。同样,如果您点击特定的卡片,它会显示任何人与该卡片相关的任何事件的历史记录。
跟踪无限期保留的每个更改/添加/删除必须收集大量数据,并且还可能在写入历史记录日志时遇到瓶颈(假设它立即写入各种数据存储)。我的意思是,它们并不是将所有内容存储在分布在1000个服务器上的日志文件中,而是只在需要查找内容时才收集和解析 - 它们始终显示所有这些信息。
我知道这不是唯一提供此类服务的服务,但您如何设计这样的系统?
答案 0 :(得分:33)
我在Trello团队中。我们在MongoDB实例中使用Actions集合,在其引用的模型的ID上有一个复合索引(Card是模型,因此是成员)以及执行操作的日期。没有花哨的缓存或任何东西,除非索引和最近使用的文档由DB保存在内存中。行动是迄今为止我们最大的收藏品。
值得一提的是,显示动作所需的大部分数据都存储在动作文档中非规范化,因此可以大大加快速度。
答案 1 :(得分:3)
想到的最简单的方法是拥有一个像:
这样的表格create table HistoryItems (
ID INT PK,
UserID INT PK,
DateTime datetime,
Data varbinary(max)/varchar(max)/...)
在UserID上对此进行索引可以快速检索。无论覆盖多长时间,覆盖索引都可以在一个磁盘搜索中获取整个用户的历史记录。
此表可以聚集在(UserID asc,DateTime desc,ID)上,因此您甚至根本不需要任何索引,并且仍然具有最佳性能。
关系数据库的任何简单问题。
答案 2 :(得分:1)
我有一些非常类似于Trello的@Brett在我的PHP + MySQL应用程序中回答的问题,我用它来跟踪我们在线网上商店的订单和生产管理应用程序中的用户活动。
我有桌面活动:
user_id
:执行操作的用户action_id
:已执行的操作(例如,创建,更新,删除等等)resource
:执行操作的资源(模型)的ENUM列表(例如订单,发票,产品等)resource_id
:在description
:操作的文字说明(可以为空)这确实是一张大表,但是使用正确的索引它可以很好地处理。它起到了它的作用。简单快捷。目前它拥有20万条记录并且随着cca而增长。每天1000个新条目。