2011-04-01 2 views
0

당신이 제공 할 수있는 도움을 주시면 고맙겠습니다. 현재 PHP/MySQL로 구축하고있는 투표 응용 프로그램의 스키마를 결정하려고합니다. 그러나이를 최적화하는 방법에 완전히 몰입하고 있습니다. 주요 요소는 항목 당 사용자 당 단 하나의 표결을 허용하고 해당 월에받은 투표 수를 기준으로 한 달 상위 항목을 자세히 설명하는 차트를 작성할 수 있어야합니다.월별 차트를 작성하려면 투표 애플리케이션을 어떻게 최적화합니까?

지금까지 초기 스키마는 다음과 같습니다

그래서
Items_table 
item_id 
total_points 
(lots of other fields unrelated to voting) 

Voting_table 
voting_id 
item_id 
user_id 
vote (1 = up; 0 = down) 
month_cast 
year_cast 

나는 투표 테이블에서 모든 정보를 선택하는 경우가 될 것 궁금 해요 경우 월 = currentMonth & 년 = currentYear, 어떻게 든 실행 카운트 item_id를 기준으로 그룹화하고; 그렇다면 어떻게해야할까요? 아니면 각 투표마다 업데이트되는 월별 차트 용 별도의 테이블을 만드는 것이 나을 것이지만 투표 당 3 개의 데이터베이스 테이블을 업데이트해야한다는 요구 사항에 관심을 가져야합니까?

필자는 유능한 사람이 아니기 때문에 누군가가 제공 할 수있는 도움이나 조언을 정말 좋아할 것입니다.

감사합니다, 월별 차트에 대한 별도의 테이블을 추가하지 않을

답변

0

_just_me; 사용자가 항목 당 둘 이상의 투표를하지 못하게하려면 voting_table (item_id, user_id)에 고유 키를 사용할 수 있습니다. 클러스터 것 InnoDB의 테이블에 복합 키를 사용하여

create table votes(
    item_id 
,user_id 
,vote_dtm 
,vote 
,primary key(item_id, user_id) 
,foreign key(item_id) references item(item_id) 
,foreign key(user_id) references users(user_id) 
)Engine=InnoDB; 

: 요약에 관해서는, 당신이

select item_id, vote, count(*), month, year 
from voting_table 
group by item_id, vote, month, year 
0

같은 간단한 쿼리를 사용할 수 있어야 나는이 유사한 투표 테이블을 사용합니다 항목 주변의 데이터를 사용하여 항목과 관련된 투표를 훨씬 빠르게 찾을 수 있습니다. 나는 vote_dtm 란 칼럼을 추가했다.이 칼럼은 사용자가 투표했을 때의 타임 스탬프를 가지고있다.

그런 다음 하나 또는 여러 개의보기를 작성하여보고 목적으로 사용합니다.

create view votes_monthly as 
select item_id 
     ,year(vote_dtm) as year 
     ,month(vote_dtm) as month 
     ,sum(vote) as score 
     ,count(*) as num_votes 
    from votes 
group 
    by item_id 
     ,year(vote_dtm) 
     ,month(vote_dtm); 

성능 문제가 발생하면보고 코드를 터치하지 않고도 미리 계산 된 값이 포함 된 테이블로 대체 할 수 있습니다.

count(*)sum(vote)을 모두 사용했음을 유의하십시오. 카운트 (*)는 출전 한 득표 수를 반환하지만 합계는 득표 수를 반환합니다. Howver, vote 열을 upvotes +1 및 downvotes -1을 사용하도록 변경하면 sum (vote)은 stackoverflow의 투표 수가 계산되는 것과 같은 점수를 반환합니다.