2013-03-01 1 views
-3

내 블로그 유형 웹 사이트에 포인트 시스템이 있습니다. 여기에서 사용자는 다양한 방법으로 기여할 수 있습니다 (댓글 달기/게시물 투표/댓글 투표 등). MySQL 데이터베이스에서 사용자가 얻은 모든 포인트를 효율적으로 기록하는 방법은 무엇입니까?PHP/MySQL에 효율적인 포인트 로깅 시스템을 구성하는 방법

현재 내가 자신의 테이블에서 다음 필드를 가지고 생각 해요 :

post_id, 
giving_user_id, 
receiving_user_id, 
type, 
date_added 

이제 내 사이트가 성장하고 내가 100 만 개 ... 억 ... 10 억 행이 분명히있는 경우, 이 접근 방식과 구조는 데이터 유형이 올바르게 설정되어 제공하면 영원히 실행하지 않고도 견딜 수 있습니까?

대부분 테이블에 삽입 할 예정이지만, stackoverflow 사용자 통계 페이지와 유사하게 앞으로 20 포인트 (예) 포인트를 보거나 차감 할 수 있기를 원합니다.

저에게 더 효율적인 구조가 더 있습니까? 네, 그것은 매우 기능에서 유래 같은 것

정보 업데이트]

는 한 사용자가 postid 당 하나의 투표를 가져옵니다. @Paul Gregory 다시 생각한 후에 receiving_user_id은 거의 항상 게시물과 관련이 있으므로 훨씬 더 좋은 아이디어 일 수 있습니다.

+0

아마도 도움이

희망 사용자가 다른 사람에게 줄 수있는 포인트를 축적 할 수 있도록 허용 할 것인가?) – symcbean

+1

일부 액션의 경우'give_user_id'가 시스템입니다. 예를 들어 게시물을 작성하는 자동 1 포인트 및 기타 그것은 사용자인가? 'receiving_user_id'는 언제 post_id와 연결된 사용자와 다른가요? –

+0

@Paul Gregory ive 님이 질문에 약간의 추가 정보를 추가했습니다. – john

답변

1

post_id를 사용하여 특정 댓글을 식별하고 type (다른 ID와 같은 숫자)을 현명하게 사용한다고 가정하면이 접근법은 로그에 광범위하게 적합합니다.

(정확히 receiving_user_id은 우리가 모르겠다는 것을 알지 못합니다. post_id - 게시물과 댓글을 구별하지 못하길 바랍니다.)

그러나 필요할 때마다 해당 테이블을 사용하여 총점을 계산하면 매우 효율적이지는 않습니다.

따라서 각 합계/게시물에 대해 현재 합계를 별도로 저장해야합니다.

마지막 20 점만 표시하려면 로그 데이터를 내보내고 오래된 로그 항목을 자주 제거해야합니다.

0

하여 POST 테이블에서 해당 필드를 삭제하고 매우 유사 테이블을 만들고 이노 외래 키 관계를 만들 : 당신이 당신의 테이블을 정상화하는 방법으로

id (log id) 
post_id, (add relation with your post table post.id) 
giving_user_id, (user id relation) 
receiving_user_id, (user id relation) 
type, (type as you want); 
date_added (datetime or whatever); 

을 당신은 당신의 데이터 로깅보다 효율적으로 제어 할 것 .

0

내 웹 사이트에서 포인트 로그를 보관하고 일정 기간 동안 요약을 매일 다시 계산한다는 것을 기반으로합니다. 항상 현재 요약 값을 유지하려면 새 항목이 기록 될 때 현재 날짜/월/년 합계에 적절한 값을 추가하십시오.

날짜 별 적절한 데이터베이스 인덱싱을 사용하면 큰 포인트 로그에 대해서도 훌륭한 성능을 얻을 수 있습니다.

0

내가 너라면 이라는 표가 있으며 특정 작업에 대해 부여 할 수있는 점수가 나열되어 있습니다.구조는

point_id INT PRIMARY_KEY 
name VARCHAR 
descriptions TEXT 
number_of_points INT 

은 그럼 당신은 user_points 사용자가 그들에게 포인트를 준 작업을 수행 할 때 녹음 할 수 있습니다라는 테이블을 가질 수 있습니다, 다음과 같이 보일 수 있습니다. 이 테이블은 다음과 같을 것입니다

point_id INT 
user_id INT 
date DATE 

더 나은 방법이있을 수 있지만 제공 한 정보에 근거하여 제안하는 것이 좋습니다. 당신이 포인트를주는 규칙이 예 (우리는이 대답에 자상 걸릴 수 있습니다 당신은 그래서 여기 만 포스트 당 하나의 투표를 허용 않습니다 무엇을 하시겠습니까? 아니면 어떻게 설명하면

+0

나는 어떤 행동을 취했는지에 대한 로그를 이미 가지고 있습니다. 두 번째 테이블은 내가 관심있는 테이블이지만, 당신은 마이너스'give_user_id'입니다. 내가 언급 한 테이블. – john

+0

@Pattle 효과적으로'type' 필드에 대해 자세히 설명하고, who-awarded-the-point와 for-what을 던지십시오. –

관련 문제