2009-06-04 40 views
6

Tôi đang cố gắng lập trình một plugin cho bbPress (phần mềm diễn đàn nguồn mở) sẽ hoạt động tương tự như Hacker News (http://news.ycombinator.com/).Cách sắp xếp như tin nhắn Hacker

Cụ thể, tôi muốn sắp xếp thứ tự của diễn đàn-đề (bbPress gọi họ là "chủ đề") bằng cách sử dụng thuật toán sau đây:

sort_value = (p - 1)/(t + 2)^1.5 
where p = total votes for each topic from users 
t = time since submission of each topic in hours 

Tôi muốn để có thể sắp xếp chủ đề của thành viên này tính sort_value sử dụng MySQL.

Các lĩnh vực có liên quan trong bảng topics trông giống như sau:

topic_id   bigint(20) 
topic_start_time datetime 

Đây là lên trong không khí, nhưng tôi đã suy nghĩ sẽ có một bảng mà các cửa hàng phiếu cá nhân của người sử dụng vì vậy chúng tôi sẽ có thể biết liệu người dùng đã bỏ phiếu chưa. Và một bảng khác sẽ lưu trữ tổng số phiếu bầu hiện tại cho mỗi chủ đề. Có lẽ sẽ có một lĩnh vực khác trong bảng đó lưu trữ sort_Value được tính toán mới nhất?

Để chính xác 100%, giá trị sắp xếp phải được cập nhật sau mỗi phiếu bầu mới. Điều này sẽ thêm quá nhiều tải vào máy chủ cơ sở dữ liệu, mặc dù, đặc biệt là nếu chúng tôi cố gắng cập nhật TẤT CẢ các chủ đề. Nếu chúng ta phải, chúng tôi có thể giới hạn tập dữ liệu bằng cách chỉ tính toán giá trị sort_value cho X # chủ đề cuối cùng. Chúng tôi cũng có thể giới hạn tải bằng cách chỉ cập nhật định kỳ sort_value (ví dụ: cứ 5 phút một lần thông qua một công việc cron).

Các phím tắt này có thể làm cho tải có thể chấp nhận được, nhưng tôi muốn một giải pháp thanh lịch hơn có thể mở rộng tốt hơn.

Bạn cấu trúc như thế nào? :-)

Trả lời

0

OK, đây là ý tưởng của tôi. Tôi sẽ bắt đầu bằng cách tạo một old_table có X hàng chủ đề với trường sort_value.

Tôi muốn tránh tấn câu lệnh UPDATE trên một bảng, vì vậy tôi sẽ định kỳ thay thế bảng cũ bằng bảng mới được tính toán. Theo như tôi biết, MySQL không hỗ trợ cú pháp "thay thế bảng", vì vậy, mỗi phút Y, thông qua cron, tôi sẽ tạo một phiên bản cập nhật của bảng này có tên là new_sort_value. Sau đó, tôi sẽ cố gắng trình tự này các lệnh:

  • thả old_table
  • RENAME new_table để old_table

Điều này có vẻ giống như một cách tiếp cận hợp lệ?

+0

Tôi nghĩ rằng đó là hợp lệ nếu một chút vụng về. Thật không may bạn đang đối phó với những hạn chế của hệ thống bạn đang thêm vào. Chia tỷ lệ loại vấn đề này chính xác là loại cơ sở dữ liệu thứ rdbms không hoạt động tốt. Một cái gì đó giống như Chế độ xem CouchDB sẽ nằm ngay trên con hẻm này. –

+0

Cảm ơn, Jeremy. Tôi sẽ kiểm tra CouchDB. Tôi chỉ nghĩ về một tinh chỉnh khác cho ý tưởng này, đó là chỉ cần lưu (ở nơi khác) một giá trị cho biết 'bảng' nào đang hoạt động. Giả sử giá trị hiện tại là 'old_table'. Điều này sẽ cho ứng dụng của tôi thực hiện một JOIN với 'old_table'. Sau đó, sau khi tạo một 'new_table' được cập nhật, tôi sẽ cập nhật giá trị" Active database "thành' new_table'. Điều này sẽ tránh DROP của bảng đang được yêu cầu cho JOIN thường xuyên. – bobbyh

1

Có một số sự cân bằng để cân nhắc trong trường hợp này. Bạn đã ám chỉ họ đã có trong câu hỏi của bạn. Tính kịp thời và chính xác so với tải và tỷ lệ.

Kết hợp tính toán là cách tốt nhất để giảm tải và tăng quy mô nếu tính kịp thời và chính xác là không cần thiết và hệ thống trải nghiệm tải trọng cao.

Bạn thực sự phải kiểm tra mức độ sử dụng của hệ thống và xác định khu vực nào bạn cần để tối ưu hóa. Tối ưu hóa cho Viết có những hạn chế khác nhau hơn là tối ưu hóa cho Đọc. Tương tự cho tính kịp thời hoặc tính chính xác của dữ liệu.

Xác định cái nào quan trọng nhất đối với ứng dụng của bạn và thực hiện sự cân bằng thích hợp.

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