2012-07-29 2 views
2

나는 두 테이블, 기사가받은 투표 수 저장 한이 : 나는 또한 다른 테이블이DB 트리거를 사용해야하는 상황은 무엇입니까?

| article_id | visitor_votes | member_votes | voting_opened | 
------------------------------------------------------------- 
| 1   | 12   | 394   | Y    | 
| 3   | 94   | 5821   | Y    | 

유지 사용자가 투표 트랙 그중를하는 기사

| vote_id | user_id | article_id | date | 
-------------------------------------------- 
| 1  | 12  | 1   | 7/28/2012 
| 2  | 23  | 3   | 7/28/2012 

하나에 대한 사용자는 거래 당 하나의 투표 만 할 수 있습니다. 나는 현재 투표 테이블에 레코드가 삽입 될 때마다 기사 테이블의 투표 수를 증가시키는 방아쇠를 사용합니다. 이 좋은 연습인가, 아니면 내 응용 프로그램 (PHP 웹 기반 웹 사이트)에서이 작업을 수행해야합니까? 또한 특정 득표 (voting_opened = N) 이후에 투표를 중지하고 총 투표 수 (visitor_votes + member_votes> = 6000)를 확인한 다음 아티클 행을 업데이트하여 voting_opened = N으로 설정해야합니까? 아니면 내 응용 프로그램에서해야 할 일이 무엇입니까? 수백 개의 기사에 대해 수천 표를 얻고 업데이트가 충분히 빨리 업데이트되지 않아 투표 수가 임계 값을 초과하는 경우에 직면하고 싶지 않기 때문에 규모가 큰 솔루션이 필요합니다. 또는 무엇이든. 이 시나리오에서 누군가가 약간의 빛을 비춰 줄 수 있습니까?

감사합니다.

+0

총 투표 수를 유지하지 않으려는 경우 필요에 따라 user_vote 테이블에서 추가하십시오. –

+0

해당 솔루션의 문제점은 현재 1 억 개가 넘는 레코드가있는 투표 테이블입니다. 모든 사용자가 투표를하기 전에이를 요약하는 것은 성능 관점에서 엄청나게 무겁습니다. 단순한 선택 및 비교가 상대적으로 낮은 곳. – user1143767

답변

1

두 가지 해결책 모두 유효하며 동일하게 잘 작동해야합니다.

당신은 다음 응용 프로그램

UPDATE articles SET 
    visitor_votes = visitor_votes + 1 
    voting_opened = IF(visitor_votes + member_votes >= 6000, 'N', 'Y') 
WHERE 
article_id = xxxx 
AND voting_opened = 'Y' 

이 같은 시도 영향을받는 행을 확인하고 있는지> 0 표 테이블에 행을 삽입 할 수 있습니다.

관련 문제