2009-05-01 2 views
6

내가 댓글을 달 수있는 여러 객체가있는 PHP 앱에서 작업하고 있습니다. 각 의견은 사용자가 +1 또는 -1 (Digg 또는 Reddit과 같이)을 줄 수있는 상태에서 투표 할 수 있습니다. 지금 나는 user_id와 투표 정보를 가지고있는 'votes'테이블을 가질 계획입니다. 이것은 잘 작동하는 것 같습니다.의견 투표 데이터베이스 구조에 대한 우수 사례

사실, 각 개체에는 별도의 주석 표에 저장되는 수백 개의 주석이 있습니다. 의견을 읽은 후 투표를 집계하고 각 투표를 개별적으로 확인하여 한 번만 투표 할 수 있도록해야합니다. 이것은 작동하지만 데이터베이스 집약적 인 것처럼 보입니다. 단지 댓글에 대한 많은 쿼리입니다.

DB 집약도가 적은 간단한 방법이 있습니까? 현재 데이터베이스 구조가 가장 좋은 방법입니까?

댓글 테이블 :

  • USER_ID
  • OBJECT_ID
  • total_votes

투표 테이블 :

은 현재 데이터베이스 구조에 대한 명확하게하려면

  • 는 comment_id
  • USER_ID
  • 투표

최종 목표 :

  • 는 사용자가 각 주석 MySQL의 쿼리의 이상과 #에 한 번만 투표 할 수 있도록 허용 (각 개체 여러 의견이 있음)

답변

8

각 투표자가 한 번만 투표하도록하려면 — CommentID, UserID, VoteValue 필드를 사용하여 Votes 테이블을 디자인하십시오. CommentID 및 UserID를 기본 키로 설정하면 한 명의 사용자 만 한 번 투표 할 수 있습니다. 그런 다음 댓글에 대한 투표를 쿼리하려면 다음과 같이하십시오.

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

도움이 되셨습니까?

+0

실제로 도움이됩니다. 감사합니다. 두 개의 기본 키를 갖는 것에 대한 생각은 내 마음을 가로막 지 않습니다. – mdolon

0

모든 댓글에 총 투표 수를 저장하지 않으시겠습니까? 새 투표가 발생하면 이것을 증가/감소시킵니다.

그런 다음 사용자가이 의견에 대해 특별히 투표했는지 확인하여 사용자 당 하나의 의견 당 하나의 투표 만 허용하는지 확인해야합니다.

+0

트릭은 두 번째 부분으로, 사용자가 해당 의견을 투표했는지 확인하는 것입니다. 기본적으로 별도의 투표 테이블이 필요합니다. – mdolon

0

이 객체에 대해 현재 사용자가 작성한 주석에 대한 모든 투표를 반환하는 SQL 조인 조건을 지정할 수 있습니다. 행이 없으면 사용자가 투표하지 않았습니다. 이는 프로그램에서 각 댓글을 하나씩 확인하는 것과 약간 다릅니다.

데이터베이스 구조와 관련해서는 이러한 것들을 분리하여 보관하는 것이 완벽하게 논리적 인 것처럼 보입니다. 투표 {user_id, object_id, object_type, vote_info ...)

당신은 이미이 일을하고 있을지도 모르겠지만, 미안하지만 나는 그럴 경우 게시물을 해석 할 수는 없습니다.