2009-05-01 38 views
6

Tôi đang làm việc trên một ứng dụng PHP có một số đối tượng có thể được nhận xét. Mỗi bình luận có thể được bình chọn, với người dùng có thể cho nó +1 hoặc -1 (như Digg hoặc Reddit). Ngay bây giờ tôi đang có kế hoạch có một bảng 'phiếu' đã mang user_id và thông tin bỏ phiếu của họ, mà dường như làm việc tốt.Thực hành tốt nhất cho cấu trúc cơ sở dữ liệu bình chọn bỏ phiếu

Vấn đề là mỗi đối tượng có hàng trăm nhận xét được lưu trữ trong một bảng nhận xét riêng biệt. Sau khi tôi tải các bình luận, tôi phải kiểm phiếu và sau đó kiểm tra từng cuộc bỏ phiếu với người dùng để đảm bảo họ chỉ có thể bình chọn một lần. Điều này hoạt động nhưng dường như thực sự là cơ sở dữ liệu chuyên sâu - rất nhiều truy vấn chỉ cho các bình luận.

Có phương pháp đơn giản hơn để làm điều này ít tốn kém hơn không? Cấu trúc cơ sở dữ liệu hiện tại của tôi có phải là cách tốt nhất để đi không?

Để được rõ ràng hơn về cấu trúc cơ sở dữ liệu hiện hành:

Comments bảng:

  • user_id
  • object_id
  • TOTAL_VOTES

Votes bảng:

  • comment_id
  • user_id
  • phiếu

End Mục tiêu:

  • Cho phép người dùng bỏ phiếu chỉ một lần trên mỗi comment với ít nhất # truy vấn MySQL (mỗi đối tượng có nhiều ý kiến)

Trả lời

8

Để đảm bảo rằng mỗi cử tri bỏ phiếu chỉ một lần, hãy thiết kế bảng phiếu bầu của bạn với các trường này — CommentID, UserID, VoteValue. Đặt CommentID và UserID làm khóa chính, sẽ đảm bảo rằng một người dùng chỉ nhận được một phiếu bầu. Sau đó, để truy vấn phiếu bầu cho nhận xét, hãy thực hiện điều gì đó như sau:

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

Điều đó có hữu ích không?

+0

Điều đó giúp ích rất nhiều, cảm ơn! Ý nghĩ về việc có hai khóa chính thậm chí không vượt qua tâm trí của tôi .. – mdolon

0

Tại sao bạn không lưu tổng số phiếu bầu cho mọi nhận xét? Tăng/giảm số tiền này khi một phiếu bầu mới đã xảy ra.

Sau đó, bạn phải kiểm tra xem người dùng đã bình chọn cụ thể cho nhận xét này để chỉ cho phép một phiếu bầu cho mỗi nhận xét cho mỗi người dùng.

+0

Bí quyết là phần thứ hai, kiểm tra xem người dùng đã bình chọn cho nhận xét cụ thể đó - về cơ bản nó dẫn đến việc có một bảng biểu quyết riêng biệt. – mdolon

0

Bạn có thể đặt điều kiện tham gia sql trả về tất cả các phiếu trên nhận xét của người dùng hiện tại cho đối tượng này, nếu bạn không nhận được hàng, người dùng chưa bỏ phiếu. Đó là chỉ hơi khác nhau từ bạn kiểm tra từng bình luận từng người một trong chương trình.

theo như cấu trúc cơ sở dữ liệu có liên quan, việc giữ những thứ này riêng biệt có vẻ hoàn toàn hợp lý. bỏ phiếu {user_id, object_id, object_type, vote_info ...)

Bạn có thể đã làm điều này, xin lỗi nhưng tôi không thể giải thích từ bạn đăng nếu đó là trường hợp.

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