2012-05-08 29 views
24

Trello hiển thị nhật ký lịch sử về mọi thứ mà bất kỳ người dùng nào đã thực hiện kể từ khi thành lập ban. Tương tự như vậy, nếu bạn nhấp vào một thẻ cụ thể, nó sẽ hiển thị lịch sử của bất kỳ điều gì mà bất kỳ ai đã thực hiện liên quan đến thẻ đó.Trello hiển thị lịch sử nhanh như thế nào?

Theo dõi mọi thay đổi/bổ sung/xóa được lưu giữ vô thời hạn phải thu thập một tấn dữ liệu và cũng có khả năng tắc nghẽn bằng văn bản cho nhật ký đường dẫn lịch sử (giả sử nó được ghi ngay lập tức vào kho lưu trữ dữ liệu). Ý tôi là, không giống như họ đang lưu trữ mọi thứ trong các tệp nhật ký trải rộng trên 1000 máy chủ mà họ chỉ thu thập và phân tích cú pháp khi họ cần tìm thứ gì đó - chúng hiển thị tất cả thông tin này mọi lúc.

Tôi biết đây không phải là dịch vụ duy nhất cung cấp một cái gì đó như thế này, nhưng làm thế nào bạn sẽ đi về kiến ​​trúc sư như một hệ thống?

+0

Bạn sẽ ngạc nhiên về mức độ hiệu quả của RDBMS.Các bản ghi không được lưu trữ trong một tệp - chúng được lưu trữ trong một cơ sở dữ liệu với một số chỉ mục tốt đẹp. – JonH

Trả lời

32

Tôi thuộc nhóm Trello. Chúng tôi sử dụng một bộ sưu tập Actions trong cá thể MongoDB của chúng ta, với một chỉ số phức trên các id của các mô hình mà nó tham chiếu (Thẻ là một mô hình, và như vậy là một thành viên) và ngày khi hành động được thực hiện. Không có bộ nhớ đệm ưa thích hoặc bất cứ điều gì, ngoại trừ inasmuch như chỉ mục và tài liệu được sử dụng gần đây được lưu giữ trong bộ nhớ của DB. Hành động đến nay là bộ sưu tập lớn nhất của chúng tôi.

Điều đáng nói là hầu hết các dữ liệu cần thiết để hiển thị một hành động được lưu trữ không chuẩn hóa trong tài liệu hành động, để tăng tốc độ đáng kể.

+0

Vì vậy, bạn lưu trữ các hành động với dấu thời gian và chỉ mục trên cả hai để bạn có thể thực hiện tra cứu nhanh chóng, thật đơn giản! "Tài liệu hành động" là gì? –

+0

Chúng tôi sử dụng MongoDB, do đó, 'tài liệu hành động' tương đương với 'hàng trong bảng hành động' trong DB quan hệ truyền thống, nhưng nó chứa một tài liệu JSON phi pháp hơn là dữ liệu có cấu trúc cao. – Brett

+0

@Brett, Được viết bị ảnh hưởng (chậm hơn) bởi vì dữ liệu của bạn là tất cả không chuẩn hóa? – Pacerier

3

Cách đơn giản nhất mà đến với tâm là phải có một bảng như:

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

Indexing này trên UserID cho phép để thu hồi nhanh. Chỉ số bao phủ sẽ cho phép tìm nạp lịch sử của toàn bộ người dùng trong một đĩa tìm kiếm bất kể nó dài bao lâu.

Bảng này có thể được nhóm trên (UserID asc, DateTime desc, ID), do đó bạn thậm chí không phải có bất kỳ chỉ số nào và vẫn có hiệu suất tối ưu.

Bất kỳ vấn đề dễ dàng nào đối với cơ sở dữ liệu quan hệ.

+0

có lẽ đọc không phải là xấu .. nhưng sẽ không viết tất cả các dữ liệu đó vào một bảng có vấn đề khóa khá xấu? –

+0

Thường thì không. Số lượng ghi nhỏ trên mỗi giao dịch (đó là trường hợp ở đây) chỉ khóa các hàng. Chèn có thể xảy ra đồng thời theo cách đó. – usr

1

Tôi có thứ gì đó rất giống với @Brett từ Trello đã trả lời ở trên trong ứng dụng PHP + MySQL mà tôi sử dụng để theo dõi hoạt động của người dùng trong đơn đặt hàng và ứng dụng quản lý sản xuất cho cửa hàng trực tuyến của chúng tôi.

tôi đã hoạt động bảng mà giữ:

  • user_id: người dùng thực hiện hành động
  • action_id: hành động mà đã được thực hiện (ví dụ tạo, cập nhật, xóa, và vân vân ...)
  • resource: danh sách ENUM của các tài nguyên (mô hình) mà hành động được thực hiện trên (ví dụ: đơn đặt hàng, hóa đơn, sản phẩm, v.v.)
  • resource_id: PK của tài nguyên được thực hiện trên
  • description: mô tả văn bản của hành động (có thể được null)

Đó là một bảng lớn thực sự, nhưng với chỉ số đúng nó xử lý rất tốt. Nó hành động mục đích của nó. Đơn giản và nhanh chóng. Hiện tại nó có 200.000 bản ghi và đang phát triển với cca. 1000 mục mới mỗi ngày.