2012-05-08 117 views
24

Trello顯示了自董事會成立以來任何用戶所做的所有事情的歷史記錄。同樣,如果您點擊特定卡片,它會顯示任何人已經完成的與該卡片相關的歷史記錄。Trello如何快速顯示歷史記錄?

跟蹤無限期保存的每個更改/添加/刪除必須收集大量數據,並且在寫入歷史記錄日誌(假設它立即寫入各種數據存儲)時也可能存在瓶頸。我的意思是,它不像他們將所有日誌文件都存儲在跨越1000個服務器的日誌文件中,他們只在需要查找內容時才收集和解析它們 - 它們始終顯示所有這些信息。

我知道這是不是提供了這樣的事情的唯一服務,但你將如何去架構這樣的系統?

+0

你會驚訝你的RDBMS真的有多好。日誌不會存儲在文件中 - 它們存儲在數據庫中,並帶有一些不錯的索引。 – JonH

回答

32

我在Trello團隊。我們在MongoDB實例中使用一個Actions集合,並在其引用的模型的id(一個Card是一個模型,也是一個成員)的複雜索引以及執行該操作的日期。沒有花哨的緩存或任何東西,除非索引和最近使用的文檔由DB保存在內存中。行動是迄今爲止我們最大的收集。

值得一提的是,大多數顯示的動作所需要的數據是動作文檔中存儲的非規範化,使大大加快東西。

+0

因此,您將兩個時間戳和索引存儲在一起,以便您可以快速查找,非常簡單! 什麼是「行動文件」? –

+0

我們使用的是MongoDB,因此'動作文檔'相當於傳統關係數據庫中'動作表'中的'行',但它擁有一個任意的JSON文檔而不是高度結構化的數據。 – Brett

+0

@佈雷特,寫入是否影響(較慢),因爲你的數據都是非規範化的? – Pacerier

3

想到的最簡單的方法是有一個像表:

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

索引這對用戶ID允許快速檢索。覆蓋索引可以使用戶在一次磁盤搜索中獲取整個用戶的歷史記錄,而不管其時間長短。

此表可以聚集在(UserID asc,DateTime desc,ID)上,因此根本沒有任何索引,並且仍然具有最佳性能。

的關係型數據庫的任何簡單的問題。

+0

也許讀取不那麼糟糕,但不會寫入所有的數據到一個表有非常糟糕的鎖定問題? –

+0

通常沒有。每筆交易的少量寫入(這裏就是這種情況)只鎖定行。插入可以同時發生。 – usr

1

我作爲@Brett非常相似,從Trello在我的PHP + MySQL的應用程序,我用在我們的訂單和生產管理應用跟蹤用戶活動爲我們的在線網絡商店上面回答的東西。

我已經表活動,認爲:

  • user_id:用戶所執行的行動
  • action_id:已執行的動作(例如創建,更新,刪除,等等...)
  • resource:執行操作的資源(模型)的ENUM列表(例如訂單,發票,產品等)
  • resource_id:執行操作的資源的PK號
  • description:行動的文字描述(可以爲null)

這是一個大表確實,但正確的索引它處理得非常好。它行爲的目的。簡單而快速。目前它擁有20萬條記錄,並與cca一起成長。每天1000個新條目。