문제

사용자가 자신의 포인트가 증가 할 때 스택 오버플로와 유사한 프로그램에서 포인트 시스템을 만들려고합니다. DB Schema + Logic 측면에서이를 구현하는 가장 좋은 방법이 무엇인지 궁금합니다.

세 가지 옵션을 생각할 수 있습니다.

  1. 사용자 테이블에 포인트라는 추가 필드를 추가하고 사용자가 무언가를 할 때마다 해당 필드에 추가하십시오 (그러나 이것은 일종의 활동을 보여줄 수 없습니다).
  2. 사용자가 선행을 수행하고 값을 처음부터 계산하고 포인트 필드를 업데이트 할 때마다 실행되는 함수를 만듭니다.
  3. 포인트 필드없이 함수를 사용하여 매번 계산하십시오.

이것에 대해 가장 좋은 방법은 무엇입니까? 시간 내 주셔서 감사합니다.

도움이 되었습니까?

해결책

개인적으로, 나는 두 번째 옵션을 사용 하여이 문제에 접근 할 것입니다.

첫 번째 옵션은 기능을 제한하므로 즉시 제거합니다.

세 번째 옵션은 성능 측면에서 비효율적입니다. 그 숫자를 가져올 것입니다. 많이, 프로그램이 stackoverflow와 같은 것이면 아마도 페이지 뷰/액션 당 해당 숫자를 여러 번 표시 (계산) 할 수 있습니다.

두 번째 옵션은 괜찮은 하이브리드 솔루션입니다. 일반적으로 i 싫어하다 내 시스템에 복제 된 데이터 (하나 또는 다른 것이 아닌 동작 및 포인트)를 사용하지만이 경우 정수 필드는 사용자 당 다소 적은 양의 공간입니다. 많은 불필요하게 값을 다시 계산하는 데 시간이 걸립니다.

우리는 때때로 성능을위한 거래 데이터 저장 공간이나 그 반대의 경우를 위해서는 #2가 응용 프로그램에 큰 도움이되는 트레이드 오프라고 말합니다.

다른 팁

이것은 직면 할 것으로 예상되는 계산 수에 크게 달려 있습니다. 실제로, 분명히 1) 접근 방식과 유사한 방법을 사용합니다.

이것은 또한 요인이 변경되는 경우 숫자의 점프를 방지합니다 (예 : 포인트를 수여 한 삭제 된 항목 또는 여기에서 커뮤니티 위키가되는 So Respies, 포인트 규칙의 변경, 여기에 다른 계정에 가입하는 것과 같은 외부 조치 등).

RECALC 솔루션 (2)이 원하는 것인 경우, 포인트 수정이 이루어질 때마다 값을 지우고 ( "더러운"것을 의미하는 NULL로 설정) 값을 지우면서 "스마트"캐싱을 구현할 수 있습니다. 널이면 캐시를 사용하여 사용하십시오. 당신은 또한 (눈에 띄지 않는 일이 일어 났을 때 자체 수정 조치로서) 1 시간, 하루 또는 전나무라고 생각하는 값을 제거하여 "더러운"상태와 독립적으로 특정 시간이 지나면 recalc가 강제되도록 값을 제거 할 수 있습니다. .

나는 1과 2로 갈 것입니다 (매 순간마다 Cron에서 실행).

- 추가 필드는 지점의 양에 대한 캐시 역할을합니다. - 포인트를 계산하는 함수는 단일 SQL 쿼리 일 수있는 단일 SQL 쿼리 일 수 있습니다.

나는 포인트가 다시 될 때마다 필드를 다시 계산하는 것이 과잉 일 것이라고 생각합니다.

개인적으로, 나는 첫 번째 옵션과 함께 가서 활동 기록을 추적하기 위해 "액션"테이블을 추가합니다.

사용자가 좋은 일을하면 조치 및 일부 포인트 값으로 "액션"테이블에 항목을 얻습니다. 포인트 값은 다른 테이블 또는 일부 구성 파일에서 나올 수 있습니다. 동일한 값이 사용자 레코드에 추가됩니다.

언제라도 작업을 요약하고 사용자 총액을 얻을 수 있지만 성능을 위해서는 작업 레코드를 추가 할 때 간단히 업데이트하면 간단합니다.

포인트 시스템이 얼마나 간단합니까? 나는 어떤 종류의 벌목 /저널링이 좋다고 생각하여 모든 사용자에서 매일 /주간 /월별 활동을 추적 할 수 있습니다.

체크 아웃 http://code.google.com/p/userinfuser/

오픈 소스로 응용 프로그램에 포인트와 배지를 추가 할 수 있습니다. Java, Python, PHP 및 Ruby 바인딩이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top