2016-06-16 9 views
8

Tôi có yêu cầu về trường hợp sử dụng, nơi tôi muốn thiết kế một hệ thống xếp hạng hashtag. 10 thẻ bắt đầu bằng # phổ biến nhất nên được chọn. Ý tưởng của tôi là một cái gì đó như thế này:Loại DB nào tính toán số liệu thống kê trên mỗi phút?

[hashtag, rateofhitsperminute, rateofhisper5minutes]

Sau đó, tôi sẽ truy vấn, tìm hiểu 10 #hashtags phổ biến nhất, rateofhits mà mỗi phút là cao nhất.

Câu hỏi của tôi là loại cơ sở dữ liệu nào, tôi có thể sử dụng, để cung cấp cho tôi các thống kê như 'rateofhitsperminute'?

Cách tốt để tính chi tiết và lưu trữ trong đó là gì? Do một số DB cung cấp các tính năng này?

+0

tôi nghĩ rằng HammerDB có thể làm. – ihemant360

Trả lời

4

Trước hết, "tỷ lệ truy cập mỗi phút" được tính:

[hits during period]/[length of period] 

Vì vậy, tỷ lệ sẽ thay đổi tùy theo thời gian là bao lâu. (Phút cuối cùng? 10 phút cuối cùng? Kể từ khi số lần truy cập bắt đầu được ghi lại? Vì thẻ bắt đầu bằng # được sử dụng?)

Vì vậy, những gì bạn thực sự muốn lưu là số lần truy cập chứ không phải tỷ lệ. Nó là tốt hơn để một trong hai:

  • Store hashtags và đếm hit của họ trong một thời gian nhất định (ít bộ nhớ/CPU cần thiết nhưng ít linh hoạt)
  • HOẶC dấu thời gian và hashtag của mỗi hit (nhiều bộ nhớ/cpu bắt buộc nhưng linh hoạt hơn)

Bây giờ, việc chọn khoảng thời gian quan tâm và truy vấn cơ sở dữ liệu để tìm 10 thẻ bắt đầu bằng # có nhiều lần truy cập nhất trong khoảng thời gian đó.

Nếu bạn cần hiển thị tỷ lệ, hãy sử dụng công thức ở trên, nhưng lưu ý rằng nó không thay đổi thứ tự của thẻ bắt đầu bằng # vì khoảng thời gian này giống nhau cho mỗi thẻ bắt đầu bằng #.


Bạn có thể áp dụng thuật toán ở trên cho hầu hết mọi DB. Bạn thậm chí có thể làm điều đó mà không cần sử dụng một cơ sở dữ liệu (chỉ cần sử dụng một hashmap được xây dựng của ngôn ngữ lập trình).

Nếu hiệu suất là mối quan tâm và sẽ có nhiều thẻ bắt đầu bằng # khác nhau, tôi khuyên bạn nên sử dụng OLAP database. Cơ sở dữ liệu OLAP được thiết kế đặc biệt cho các truy vấn đầu k (trong một khoảng thời gian nhất định) như thế này.

Có nói rằng, đây là ví dụ về cách hoàn thành trường hợp sử dụng của bạn trong Solr: Solr as an Analytics Platform.Solr không phải là một cơ sở dữ liệu OLAP, nhưng ví dụ này sử dụng Solr như một OLAP DB và có vẻ là dễ dàng nhất để thực hiện và thích ứng với trường hợp sử dụng của bạn:

schema Solr của bạn sẽ trông giống như:

<fields> 
<field name="hashtag" type="string"/> 
<field name="hit_date" type="date"/> 
</fields> 

Một tài liệu ví dụ sẽ là:

{ 
"hashtag": "java", 
"hit_date": '2012-12-04T10:30:45Z' 
} 

Một truy vấn mà bạn có thể sử dụng sẽ là:

http://localhost:8983/solr/select?q=*:*&facet=true&facet.field=hashtag&facet.mincount=1&facet.limit=10&facet.range=hit_date&facet.range.end=2013-01-01T00:00:00Z&facet.range.start=2012-01-01T00:00:00 

Cuối cùng, sau đây là một số tài nguyên tiên tiến liên quan đến câu hỏi này:

3

Không có cơ sở dữ liệu có số liệu thống kê mỗi phút chỉ được tích hợp, nhưng bất kỳ cơ sở dữ liệu hiện đại nào cũng có thể được sử dụng để tạo cơ sở dữ liệu mà bạn có thể dễ dàng tính toán giá mỗi phút hoặc bất kỳ giá trị được tính nào khác mà bạn cần. Câu hỏi của bạn cũng giống như yêu cầu loại xe nào có thể lái xe từ New York đến LA - cũng không có xe nào có thể tự lái hoặc tiếp nhiên liệu trên đường đi (tôi nên cẩn thận với sự tương tự này vì tôi đoán xe ô tô gần như đang làm điều này ngay bây giờ.). !), nhưng bạn có thể lái bất kỳ chiếc xe nào bạn thích từ New York đến LA, một số sẽ thoải mái hơn, tiết kiệm nhiên liệu hơn và nhanh hơn những loại khác, nhưng bạn sẽ phải lái xe và tiếp nhiên liệu.

3

Bạn có thể sử dụng InfluxDB. Nó rất phù hợp với trường hợp sử dụng của bạn, vì nó được tạo ra để xử lý dữ liệu chuỗi thời gian (ví dụ "số lần truy cập mỗi phút").

Trong trường hợp của bạn, mỗi khi có lần truy cập, bạn có thể gửi bản ghi chứa tên của thẻ bắt đầu bằng # và dấu thời gian.

Dữ liệu có thể truy vấn và đã có các công cụ có thể giúp bạn xử lý hoặc trực quan hóa nó (như Grafana).

1

Nếu bạn hài lòng với một tập dữ liệu lớn, bạn có thể tự mình lưu trữ và tính toán thông tin này.

Tôi tin rằng Mongo khá nhanh khi nói đến các truy vấn dựa trên chỉ mục để bạn có thể cấu trúc một cái gì đó như thế này.

Mỗi lần một thẻ là "hit" hoặc truy cập bạn có thể lưu trữ thông tin này như một hàng

[Tag][Timestamp] 

lưu trữ nó trong một thời trang như vậy cho phép bạn đầu tiên của tất cả chạy đơn giản Group, Đếm và Sắp xếp các hoạt động đó sẽ dẫn bạn đến khả năng mong muốn đầu tiên của bạn trong việc tính toán 10 thẻ phổ biến nhất.

Với thông tin ở định dạng này, bạn có thể thực hiện thêm các truy vấn dựa trên thẻ và dấu thời gian để Đếm số lần truy cập cho một thẻ cụ thể giữa các lần X và Y sẽ cung cấp cho bạn số lần truy cập của bạn.

Lợi ích của việc thực hiện nó theo cách này:

  • granularity thông tin cao tùy thuộc vào khung thời gian cung cấp thông qua truy vấn
  • Các truy vấn này là khá nhanh trong MongoDB hoặc cơ sở dữ liệu tương tự ngay cả trên dữ liệu lớn đặt

Phủ định làm theo cách này:

  • Bạn phải lưu trữ nhiều r các dữ liệu
  • Bạn phải thực hiện các truy vấn để truy xuất thông tin bạn cần thay vì trả về một hàng dữ liệu đơn lẻ
Các vấn đề liên quan