Tôi hiện đang phát triển một trang web nơi người dùng có thể tìm kiếm người dùng khác dựa trên thuộc tính (độ tuổi, chiều cao, thị trấn, giáo dục, v.v.). Bây giờ tôi muốn triển khai một số loại xếp hạng giữa hồ sơ người dùng. Đánh giá được tính toán thông qua thuật toán riêng dựa trên sự tương đồng giữa 2 cấu hình đã cho. Người dùng A có xếp hạng "xếp hạng so khớp" là 85 với Người dùng B và 79 với Người dùng C chẳng hạn. B và C có xếp hạng là 94 và tương tự ....Kiến trúc MySQL cho n * (n - 1)/2 thuật toán
Người dùng có thể tìm kiếm các thuộc tính nhất định và lọc kết quả theo xếp hạng.
Vì xếp hạng khác với cấu hình và cũng phụ thuộc vào người dùng thực hiện tìm kiếm, tôi không thể thêm trường vào bảng người dùng của mình và sử dụng ORDER BY. Cho đến nay tôi đã đưa ra 2 giải pháp:
giải pháp đầu tiên của tôi là có một công việc lô hàng đêm, cho phép tính giá cho mỗi kết hợp sử dụng càng tốt và lưu trữ nó trong một bảng riêng biệt (user1, user2, xếp hạng) . Sau đó tôi có thể tham gia bảng này với bảng người dùng và sắp xếp kết quả theo xếp hạng. Sau khi làm một số toán học, tôi đã tìm ra rằng giải pháp này không mở rộng tốt.
Dựa trên công thức n * (n - 1)/2 có 45 kết hợp có thể cho 10 người dùng. Đối với 1.000 người dùng, tôi đột nhiên phải chèn 499.500 kết hợp xếp hạng vào bảng xếp hạng của tôi.
Giải pháp thứ hai là rời khỏi MySQL và chỉ tính toán xếp hạng khi đang bay trong ứng dụng của tôi. Điều này cũng không quy mô tốt. Giả sử tìm kiếm chỉ trả lại 100 kết quả cho giao diện người dùng (có xếp hạng cao nhất ở trên cùng). Nếu tôi có 10.000 người dùng và tôi muốn thực hiện tìm kiếm cho mọi người dùng sống ở New York được xếp hạng theo xếp hạng, tôi phải tải mọi người dùng đang sống ở NY vào ứng dụng của tôi (giả sử 3.000), áp dụng thuật toán và chỉ trả lại 100 người dùng hàng đầu. Bằng cách này tôi đã nạp 2.900 đối tượng người dùng vô dụng từ DB và CPU bị lãng phí vào thuật toán mà không bao giờ làm bất cứ điều gì với nó.
Bất kỳ ý tưởng nào tôi có thể thiết kế điều này trong MySQL db hoặc ứng dụng web để người dùng có xếp hạng cá nhân với người dùng khác theo cách mà hệ thống vượt quá vài nghìn người dùng?
Đó là 'n * (n-1)/2' và tôi không thích tiêu đề, nhưng câu hỏi thú vị. – Patrick
cảm ơn, tôi đã sửa công thức. Tôi đang mở cho đề xuất tiêu đề .. không thực sự biết cách khác để cụm từ nó :-) – black666
ở bước đầu tiên, không phải là nó có thể để lại các trận đấu tồi tệ nhất trong cơ sở dữ liệu (ví dụ: một thuật toán đơn giản mà quy mô tốt trong mysql), để bạn chỉ phải tải - hãy nói 500 kết quả phù hợp trong ứng dụng của bạn, để bạn có thể mang lại kết quả chưa hoàn chỉnh, nhưng gần như hoàn hảo? – RomanKonz