2009-06-29 2 views
1

랭킹 시스템 (스타팅 영화, 제품 등)의 남용을 방지하고 실제로 그것을 구현하는 방법에 대한 몇 가지 질문을 보았습니다. 이 질문을 단순화하기 위해 보안은 나에게 관심사가 아니며이 시스템에 액세스하는 사람들은 모두 신뢰할 수 있으며 순위 시스템을 악용하는 경우 일어나는 일은 사소한 일보다 쉽게 ​​되돌릴 수 있습니다. 어쨌든, 투표를 저장하는 방법이 궁금합니다.랭킹 시스템 구현

하나의 생각은 각 투표를 기록한 다음 즉시, 예정된 시간에 또는 제품의 모든 부하 (이 방법은 비효율적 인 것 같지만 그렇지 않을 수도 있음)를 기록하고 투표가 집계되고 두 배 0 - 5 사이의 값은 제품 테이블의 제품 항목으로 업데이트됩니다.

또는 총 점수와 투표 수를 제품 테이블에 저장하고 표시 할 때이를 나눕니다. 그리고 누군가 투표 할 때 투표를 합계 및 증가 수에 추가하십시오.

아니면 더 나은 방법이 있나요? 나는 제품 테이블에 '등급'필드를 그냥 갖고 싶지만 추가 데이터없이 투표를 업데이트하는 방법을 생각할 수는 없습니다.

다시 말해서 데이터 무결성은 중요하지만 어떠한 생각으로도 필요하지는 않습니까?

+2

이것은 당신에게 중요 할 수 있습니다 : http://www.evanmiller.org/how-not-to-sort-by-average-rating.html – Svante

답변

1

나는 제품에 "점수"를 기록 할 것이지만 누가 투표했는지보기 위해 투표 테이블을 유지할 것입니다. 누군가 투표를 할 때 투표를 삽입하고 제품 점수를 업데이트하십시오.

이렇게하면 빠른 정렬이 가능하며 두 번 투표하는 사람들의 점수를 다시 계산하고 다시 계산할 수있는 테이블도 있습니다.

투표를 작성하고 점수를 업데이트 할 때까지 기다릴 필요가 없습니다. 그 것입니다 문제를 소개하고 전통적인 시스템 (쓰기보다 훨씬 더 읽기)처럼 작동하는 경우, 당신에게 아무런 혜택을 제공합니다.

0

당신은 테이블에 투표를 별도로 저장 한 다음 정의 된 전략으로 제품 테이블에서 제품의 각 순위를 업데이트 할 것입니다. 비효율적 인 방법으로 저장하는 것처럼 보입니다. 아마도 그 이유에 대한 배경이있을 것입니다. 왜 모든 표를 하나의 테이블에 저장하고 해당 제품에 대한 투표를 계속 참고하기를 원하지 않겠습니까? 이것은 당신에게 실시간 카운트를 제공합니다.

UI에서는 모든 보팅의 평균을 가까운 정수로 계산하여 표시합니다. 그게 충분 하겠지? 또는 나는 무엇인가 놓치고 있냐?

+0

제가 제품과 함께 순위를 저장한다고 생각한 이유는 속도 때문입니다 - 그런 식으로 계산은 모든 페이지가로드되는 것이 아니라 새로운 투표가 시작될 때 수행되어야합니다. 그것은 정말로 걱정이 아닌가? – dimo414

+0

인덱스와 조인이 테이블에서 잘 생성되는 한 이러한 성능을 유지하는 것이 성능에 큰 영향을 미치지 않을 것이라고 생각합니다. 그러나 여전히 성능에 부정적인 영향을 미칠 것으로 생각되면 데이터베이스에서 Views를 사용하는 것에 대해 생각해보십시오. 제품 매핑과 등급이 포함 된 제품 테이블과 테이블 간의 조인 쿼리를 사용하여보기를 만듭니다. 뷰를 기반으로 쿼리가 잘 최적화되고 계산을 적절하게 수행 할 수 있다면 상대적으로 빠른 데이터를 추출 할 수 있습니다. – Priyank

0

나는 Oli에 동의합니다. 또한 점수를 캐시 할 수 있습니다. 따라서 캐시에서 제품 점수를 업데이트하면 애플리케이션에서 항상 캐시 값을 선택합니다. 따라서 페이지를 새로 고칠 때에도 데이터베이스를 치지 않고 최신 점수를 얻을 수 있습니다.