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):
.210Chè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?
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. –
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
@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. –