2013-02-25 4 views
2

사이트에 아주 간단한 포인트 시스템을 추가하려고합니다. 내 SQL 데이터베이스에는 포인트를 부여하는 테이블이 있습니다. 관리자가 포인트를 늘릴 수있는 근거와 함께 사용자의 포인트를 어느 정도 늘릴 수 있기 때문입니다. 따라서, 조금 단순화 된이 표에는 관리 상을 가리킬 때마다 부여 된 점수 #, 근거 및 사용자 ID가 포함되어 있습니다. 여태까지는 그런대로 잘됐다.포인트 시스템을위한 효율적인 데이터베이스 모델?

그러나 사이트에 10 개의 사용자 그룹이 있으며 총 점수가 가장 높습니다. 하나의 사용자 그룹에 대한 점수의 수는 이미 15,000 명에 달합니다. 이미 사이트의 구성원이 10,000 명 이상 (대부분은 비활성 상태 임)합니다. 리더 그룹에 경쟁하는 사용자 그룹 및 총 점수를 표시하고 싶지만 시스템을 구현할 때 점수를 합산하는 데 시간이 너무 오래 걸릴 것으로 걱정됩니다. 여기에 질문이 있습니다 : 어떤 레벨에서 (만약 있다면) 데이터베이스에 포인트 집계를 저장해야합니까? 사용자 당 총 점수에 대한 사용자 테이블에 필드가 있어야하며 사용자 그룹 리더 보드에 대한 정보를 합산해야합니까? 아니면 각 사용자 그룹에 대한 총계 필드를 하나씩 추가해야합니까? 시스템을 실제로 구현하기 전에, 불완전한 구현이 수천 명의 사용자에게 영향을 미치고 대규모의 실제적인 경험이 없으므로,이를 즉시 합산하는 데 얼마나 오랜 시간이 걸릴지에 대해 좋은 생각을 갖고 싶습니다. 데이터베이스.

답변

-2

정직하게 말하면, 집계는 10k 행 미만으로 1 초도 채 안 걸릴 것입니다. 운영중인 데이터베이스를 원 자성으로두고 각 포인트 트랜잭션을 저장하고 쿼리 할 때 집계를 계산해야합니다. 정말로 원한다면, 당신은 당신의 집합체를 구체화 된 뷰로 미리 계산할 수 있지만, 나는 정말로 당신이 필요하다고 생각하지 않는다.

당신은 시간마다 새로 고침 한 절

refresh fast start with sydate 
    next sysdate + 1/24 

-To으로 구체화 된 뷰를 만들 수 있습니다.

실시간 집계 데이터 (한 시간 씩있을 수 있음)는 없지만 데이터가 커지면 집계 쿼리의 성능이 상당히 향상 될 수 있습니다. 귀하의 데이터가 지금은, 나는 심지어 그것을 귀찮게하지 않을거야 - 귀하의 성능 괜찮을해야합니다.

편집 : 내가 왜 다운 투표를했는지 확실하지 않습니다. 나는 이것이 테이블에 집계를 저장하는 것보다 나은 해결책이라고 생각한다.

1

하드웨어에 따라 다르지만 수천 개의 행을 합하면 문제가 없습니다. 그러나 일반적으로 절대적으로 필요한 경우를 제외하고는 모든 사용자 점수를 합산하지 않아야합니다. 나는 각 그룹에 대한 총 점수를 저장할 rolup 테이블을 추가하고 총 점수를 검증하는 cron 야간에 실행하는 것이 좋습니다 (기본적으로 합계를 수행 한 다음 절대적으로 올바른 값을 저장합니다).

로그 포인트 및 수상 이유를 테이블에 추가하는 것이 좋습니다. 또한 사용자 당 합산 점수를 별도로 저장하고 동시에 로깅 테이블에 삽입하고 그룹당 총 점수가있는 다른 테이블을 업데이트하십시오. 그것은 당신의 활동 수준에서 잘 작동합니다. 너무 논쟁이 있지만 괜찮을 경우 전체 그룹 점수를 비동기 적으로 업데이트 할 수도 있습니다.

0

사용자에게 총점을 유지하는 것은 좋은 생각입니다. 점수 조정 테이블에 삽입 할 때 사용자 합계 만 업데이트하면됩니다. 응용 프로그램이 비교적 적은 수의 쓰기에 대해 많은 읽기를 가지기 때.에 더 효율적입니다. 유일한주의 사항은 원자 트랜잭션을 사용하여 삽입 및 합계가 모두 발생하는지 확인하는 것입니다. 또한 전체 합계를 실행하여 사용자 합계를 확인하는 야간 작업 역시 괜찮은 아이디어입니다.

관련 문제