2010-02-13 2 views
0

사용자가 등록 된 사용자 인 경우에만 사용자가 투표를 할 수 있다고 가정합니다. 각 사용자는 기사 당 한 번만 투표해야합니다.
articleid, userid, bit (양수/음수를 나타내는) 및 datetime 열의 4 개 열이있는 테이블을 유지 관리해야합니다.등록 된 사용자 만 투표 할 수 있도록 허용하는 경우 다른 문제가 발생할 수 있습니까?

아직도 악용되는 것으로 보입니까?

그물 등급을 얻으려면 두 번 테이블을 쿼리합니다. 한 번 긍정적 인 모든 투표를 계산하고 한 번 부정적인 모든 투표를 계산합니다.

내가보기에 접근법상의 결함이나 최적화를 알려주십시오.

+1

을 나는 상황을 이해 아주 잘 모르겠어요 .. : 당신과 같이 쿼리하여 그룹을 통해 두 값을 얻을 수로

BTW, 당신은 두 번 데이터베이스를 조회 할 필요가 없습니다 – MPelletier

+0

SO에는 일정 기간 경과 후 투표 변경 사항을 금지하는 등의 여러 가지 최적화가 있습니다. 달성하려는 목표는 무엇입니까? –

+0

이것은 DB 테이블 디자인 인 것 같습니다. 모든 관련 항목 표시 : DB –

답변

0

등록 된 사용자에게 투표하는 것은 남용을 피하고 다른 IP 주소를 통해 회피합니다.

순 등급을 얻으려면 테이블을 한 번 쿼리하여 모든 투표를 합산하거나 더 나은 방법으로 최종 투표의 각 항목을 계산하십시오. 한 번 투표하면 항목의 등급을 높이거나 낮추십시오.

편집 : 미리 계산할 수 있다면 여러 테이블을 쿼리하는 것이 나쁜 습관이라고 주장해야합니다. 관계형 모델을 깨는 것은 데이터베이스 최적화의 중요한 부분입니다.

+0

을 게시하는 데 감사드립니다. 따라서 사용자가이 기사에 대해 이전에 투표하지 않았 음을 표결했을 때만 내 표를 봅니다. 합리적이라고 생각하십니까? – TPR

+0

예. 그렇게하면 기사 목록을 인쇄 할 때 모든 것을 계산하기 위해 전체 표를 스캔 할 필요가 없습니다. 나는 또한 SO가 TotalUpVotes 및 TotalDownVotes 열이있는 USER 테이블도 같은 방식으로 처리했음을 확신합니다. – MPelletier

0

등록 된 사용자에게 투표를 제한하는 것은 가능한 남용을 피하기위한 방법입니다. 그러나 사용자가 투표를하면 자신의 투표를 취소 할 수 있는지 생각하고 싶어 할 수 있습니다. 나는 그런 일이 자주 일어나지 않을 것이라고 생각하지만 그것에 대해 생각할 것입니다.

SELECT Vote, COUNT(Vote) 
FROM tVotes 
GROUP BY Vote, ArticleID 
HAVING ArticleID = 1 
관련 문제