2012-02-18 19 views
5

Tôi đang lên kế hoạch về việc sử dụng công thức sau để tính toán "xu hướng" bài viết:Cách cấu trúc cơ sở dữ liệu DynamoDB để cho phép truy vấn cho các bài đăng thịnh hành?

Trending Score = (p - 1)/(t + 2)^1.5 

p = phiếu (điểm) từ người dùng. t = thời gian kể từ khi gửi trong giờ.

Tôi đang tìm lời khuyên về cách cấu trúc các bảng cơ sở dữ liệu của mình để tôi có thể truy vấn các bài đăng thịnh hành với DynamoDB (dịch vụ cơ sở dữ liệu nosql từ Amazon).

DynamoDB yêu cầu khóa chính cho từng mục trong bảng. Khóa chính có thể bao gồm 2 phần: Thuộc tính băm (chuỗi hoặc số) và Thuộc tính phạm vi (chuỗi hoặc số). Thuộc tính Hash phải là duy nhất cho mỗi mục và được yêu cầu. Thuộc tính phạm vi là tùy chọn, nhưng nếu sử dụng DynamoDB sẽ xây dựng một chỉ mục phạm vi được sắp xếp trên Thuộc tính phạm vi.

Cấu trúc tôi nghĩ trong đầu diễn ra như sau:

TableName: Người dùng

HashAttribute: user_id 
RangeAttribute: NONE 
OtherFields: first_name, last_name 

TableName: Bài viết

HashAttribute: post_id 
RangeAttribute: NONE 
OtherFields: user_id,title, content, points, categories[ ] 

TableName: Categories

HashAttribute: category_name 
RangeAttribute: post_id 
OtherFields: title, content, points 

TableName: đếm

HashAttribute: counter_name 
RangeAttribute: NONE 
OtherFields: counter_value 

Vì vậy, đây là một ví dụ về các loại yêu cầu tôi sẽ làm với các thiết lập bảng sau (ví dụ: user_id = 100):

tài Hành động 1:

Người dùng tạo bài đăng mới và gắn thẻ bài đăng cho 2 danh mục (bóng chày, bóng đá)

Query (1):

Kiểm tra hiện tại giá trị cho counter_name = 'post_id' và increment + 1 và sử dụng post_id mới

Query (2): Chèn sau vào bài viết bảng:

post_id=value_from_query_1, user_id=100, title=user_generated, content=user_generated, points=0, categories=['baseball','soccer'] 

Query (3):

.210

Chèn đoạn mã sau vào bảng Thể loại:

category_name='baseball', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0 

Query (4):

Chèn đoạn mã sau vào các hạng mục bảng:

category_name='soccer', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0 



Mục tiêu cuối cùng là để có thể thực hiện các loại truy vấn sau:
.210 1. Query cho xu hướng bài viết

2. Query cho bài đăng trong một thể loại nhất định

3. Query cho bài viết với điểm cao nhất đánh giá cao

Có ai có bất kỳ ý tưởng làm thế nào tôi có thể cấu trúc bảng của tôi để tôi có thể thực hiện truy vấn cho các bài đăng thịnh hành? Hay đây là thứ tôi có thể làm bằng cách chuyển sang DynamoDB?

+1

Tốt hơn nên cụ thể về cơ sở dữ liệu bạn đang sử dụng. Các cơ sở dữ liệu "NoSQL" khác nhau rất khác nhau. –

+0

Tần suất bạn tính toán lại các bài đăng thịnh hành? Bạn đang lưu dấu thời gian ở trên ở đâu? Trong khoảng thời gian nào, bạn sẵn sàng loại bỏ các bài đăng khỏi đủ điều kiện cho xu hướng? – Nick

+0

@Layble Tôi đã lên kế hoạch sử dụng post_id làm bộ đếm gia tăng (do đó, sắp xếp post_id theo thứ tự giảm dần sẽ hiển thị các bài đăng mới nhất). Lý do tôi nghĩ đến việc sử dụng post_id so với dấu thời gian là để tránh khả năng trùng lặp Thuộc tính phạm vi trong bảng danh mục (ví dụ: nếu 2 người dùng khác nhau đăng bài về bóng đá cùng một lúc). Tôi nghĩ rằng tôi muốn tính toán lại các bài viết thịnh hành ít nhất mỗi phút. –

Trả lời

1

Tôi bắt đầu với ghi chú về nhận xét của bạn với dấu thời gian so với post_id.
Vì bạn sẽ sử dụng DynamoDB làm trình tạo post_id của mình, có vấn đề về khả năng mở rộng ngay tại đó. Những con số này vốn không có giá trị và bạn nên sử dụng một đối tượng ngày tháng. Nếu bạn cần tạo bài viết nào trong một thời gian tốc độ điên bạn có thể bắt đầu đọc về cách twitter đang làm nó http://blog.twitter.com/2010/announcing-snowflake

Bây giờ hãy trở lại để kiểm tra xu hướng của bạn:
Tôi tin rằng kịch bản của bạn đang lạm dụng DynamoDB.
Giả sử bạn có một danh mục HOT có nhiều bài đăng nhất trong đó. Về cơ bản, bạn sẽ phải quét toàn bộ bài đăng (vì dữ liệu không được phát tán tốt) và mỗi lần bắt đầu xem xét các điểm và thực hiện so sánh trong máy chủ của bạn. Điều này sẽ không hoạt động hoặc sẽ rất tốn kém vì mỗi lần bạn có thể sẽ sử dụng tất cả dung lượng đơn vị đọc được dành riêng của bạn.

Cách tiếp cận DynamoDB cho những loại xu hướng kiểm tra được sử dụng MapReduce
đọc ở đây như thế nào để thực hiện những: http://aws.typepad.com/aws/2012/01/aws-howto-using-amazon-elastic-mapreduce-with-dynamodb.html

tôi không thể xác định một thời gian, nhưng tôi tin rằng bạn sẽ tìm thấy phương pháp này khả năng mở rộng - mặc dù bạn sẽ không thể sử dụng nó thường xuyên.

Lưu ý khác - bạn có thể giữ danh sách các câu hỏi hợp thời trang "top 10/100" và bạn cập nhật chúng trong "thời gian thực" khi bài đăng được tăng lên - bạn có danh sách, kiểm tra xem có cần hay không được cập nhật với câu hỏi mới được upvoted và lưu nó trở lại db nếu cần.

+0

http://engineering.twitter.com/2010/06/announcing-snowflake.html không thể truy cập được. Truy cập https://blog.twitter.com/2010/announcing-snowflake – Kibria