2009-06-22 46 views
12

Tôi đang tạo một trang web giống như digg sẽ có trang chủ với các danh mục khác nhau. Tôi muốn hiển thị các bài gửi phổ biến nhất.Thuật toán phổ biến

Hệ thống xếp hạng của chúng tôi chỉ đơn giản là "thích", như "Tôi thích điều này" và không có gì. Về cơ bản, chúng tôi muốn hiển thị nội dung gửi có số lượng "lượt thích" cao nhất mỗi lần. Chúng tôi muốn có ba loại: phổ biến mọi thời đại, tuần trước và ngày cuối cùng.

Có ai biết cách giúp đỡ không? Tôi không có ý tưởng làm thế nào để làm điều này và làm cho nó hiệu quả. Tôi nghĩ rằng chúng tôi có thể sử dụng một số loại cron-job để chạy mỗi 10 phút và kéo số lượt thích trong 10 phút cuối ... nhưng tôi đã nói rằng điều đó khá không hiệu quả?

Trợ giúp?

Cảm ơn!

Trả lời

9

Thông thường các trang web giống như Digg và Reddit sẽ đến trước ngày gửi chứ không phải thời gian biểu quyết. Bằng cách này, tất cả những gì nó cần là một truy vấn SQL đơn giản để tìm các bản đệ trình hàng đầu trong khoảng thời gian X. Dưới đây là một giả truy vấn để tìm ra 10 liên kết phổ biến nhất từ ​​24 giờ qua sử dụng phương pháp này:

select * from submissions 
where (current_time - post_time) < 86400 
order by score desc limit 10 

Về cơ bản, truy vấn này nói để tìm tất cả các bài dự thi có số giây giữa bây giờ và thời gian đó là được đăng ít hơn 86400, tức là 24 giờ trong thời gian UNIX.

Nếu bạn thực sự muốn đo phổ biến trong khoảng thời gian X, bạn sẽ cần phải lưu trữ các bài viết và thời gian cho mỗi cuộc bỏ phiếu trong bảng khác:

create table votes (
post foreign key references submissions(id), 
time datetime, 
vote integer); -- +1 for upvote, -1 for downvote 

Sau đó, bạn có thể tạo ra một danh sách các yêu thích nhất các bài đăng giữa thời gian X và Y như sau:

select sum(vote), post from votes 
where X < time and time < Y 
group by post 
order by sum(vote) desc limit 10; 

Từ đây bạn chỉ cần nhảy, bỏ qua và tham gia bên trong để nhận dữ liệu bài được gắn với id đã trả về.

+1

Tôi đã viết về cơ bản giống nhau, bạn nhanh hơn tôi. =) –

+1

câu trả lời tuyệt vời ... có vẻ như mặc dù phương pháp đầu tiên bạn mô tả đơn giản hơn, nó không xử lý trường hợp một nội dung nào đó được đăng trong khi trở lại nhìn thấy sự nổi tiếng đột ngột (có thể là do sự kiện tin tức gần đây hoặc một cái gì đó)? phương pháp thứ hai trông mạnh mẽ hơn, cảm ơn tôi sẽ thử nó! –

-1

Để hoàn thành câu trả lời của ai đó, tôi khuyên bạn nên đọc trên số documentation (nếu bạn đang sử dụng MySQL tất nhiên).

3

Bạn có thiết lập DB tốt không? Chúng tôi có thể vui lòng nghe về chi tiết và chỉ số của bạn CREATE TABLE không? Giả sử một thiết lập lành mạnh, DB sẽ có thể kéo số lượng bạn yêu cầu đủ nhanh để phù hợp với nhu cầu của bạn! Ví dụ (ròng của chỉ số và các phím, đó phần nào phụ thuộc vào những gì động cơ DB bạn đang sử dụng), được đưa ra hai bảng:

CREATE TABLE submissions (subid INT, when DATETIME, etc etc) 
CREATE TABLE likes (subid INT, when DATETIME, etc etc) 

bạn có thể nhận được 33 mọi thời đại đệ trình phổ biến hàng đầu như

SELECT *, COUNT(likes.subid) AS score 
FROM submissions 
JOIN likes USING(subid) 
GROUP BY submissions.subid 
ORDER BY COUNT(likes.subid) DESC 
LIMIT 33 

và những người đã bỏ phiếu cho trong một phạm vi thời gian nhất định như

SELECT *, COUNT(likes.subid) AS score 
FROM submissions 
JOIN likes USING(subid) 
WHERE likes.when BETWEEN initial_time AND final_time 
GROUP BY submissions.subid 
ORDER BY COUNT(likes.subid) DESC 
LIMIT 33 

Nếu bạn được lưu trữ "phiếu bầu" (tích cực hay tiêu cực) trong likes, thay vì chỉ đếm mỗi mục đó như +1, bạn chỉ cần sử dụng SUM(likes.vote) thay vì COUNT giây.

0

Để có danh sách ổn định như mọi lúc, tuần trước, vì chúng không được thay đổi nhanh chóng nên tôi nghĩ bạn nên lưu danh sách trong bộ nhớ cache với thời gian hết hạn là khoảng 1 ngày hoặc lâu hơn.

Nếu bạn quan tâm về số lượng chính xác trong thời gian thực, bạn có thể kiểm tra tại mỗi lần xem trang bằng cách so sánh trang có trang thấp nhất trong bộ nhớ cache.

Tất cả những gì bạn cần làm là chăm sóc đồng bộ hóa giữa bộ nhớ cache và cơ sở dữ liệu thực.

thethanghn

+0

mục tiêu của cách tiếp cận của tôi là giảm nhiều truy vấn cơ sở dữ liệu vì nó có thể vì bạn không cần phải nhận được hàng đầu từ cơ sở dữ liệu mọi lúc – thethanghn

0

Các truy vấn mà thứ tự là một số chức năng của thời gian hiện tại có thể trở thành vấn đề hiệu suất thực. Mọi thứ trở nên đơn giản hơn nhiều nếu bạn có thể nhóm theo thời gian lịch và cập nhật điểm số cho mỗi nhóm khi mọi người bỏ phiếu.

Các vấn đề liên quan