2009-10-27 3 views
0

필자는 자신의 점수에 따라 순위표 사용자를 배치하는 응용 프로그램의 기능을 작업하고 있습니다. 현재 개별적으로 점수를 추적 중입니다. 내 생각에이 리더 보드는 절대적이지 않고 상대적인 사이트 여야합니다. 즉, 사용자의 친구 네트워크 중 상위 10 위인 사이트에서 가장 높은 점수를받은 사용자가 상위 10 위인 대신에 상대적이어야합니다. 모든 사람이 네트워크에서 1 위를 차지할 수있는 기회가 있기 때문에 이러한 상황에 관심이있는 사람들에게는 우호적 경쟁의 형태가 있기 때문에 이것은 더 좋아 보인다. 이미 각 사용자의 점수를 저장하고 있으므로 효율적으로 실시간으로 해당 점수의 순위를 계산하는 방법이 과제입니다. 구글 앱 엔진을 사용하여 임 그래서 몇 가지 장점과 제한 사항이 있습니다 (예를 들어, IN [배열]) 쿼리가 배열의 모든 요소에 대해 하위 쿼리를 수행하고 또한친구들 간의 각 사용자에 대한 상대적 리더 보드의 실시간 업데이트

예를 들어 문 30 개 요소로 제한됩니다

1 잭 (100)

2 존 (50)

는 여기에 내가 해낸 방법하지만 그들은 모두 비효율적 인 것 같다 나는이 사회가 더 우아한 뭔가를 가지고 올 수 있다고 생각했다. 내 감각은 모든 솔루션을 가능성이 크론와 함께 할 것입니다 내가 읽기 작업을 최적화하기 위해 매일 순위 및 목록 순서를 저장하지만

  1. 이 당겨 더 가볍고 뭔가 실시간이 있다면 그것은 멋진 것입니다 점수로 정렬 된 사이트의 모든 사용자 목록. 각 사용자는 해당 목록에서 친구를 선택하고 새로운 순위를 만듭니다. 순위 및 목록 순서를 저장하십시오. 매일 업데이트. 단점 - 많은 사용자가있는 경우 영원히 걸릴 것입니다.

2a 각 사용자에 대해 자신의 친구를 선택하고 각 친구 선택 점수. 해당 목록을 정렬하십시오. 순위 및 목록 순서를 저장하십시오. 매일 업데이트. 각 사용자의 마지막 위치를 기록하여 기존 목록을 사용하여 다음 업데이트의 순서를 다시 지정하여 더 효율적으로 만들 수 있습니다 (정렬 시간을 절약 할 수 있음)

2b. 위와 같음 마지막 날에 프로필을 보았던 사람들의 순위 및 순서 만 제외 프로필을 본 사람의 최하위 사용자의 단점이 있습니다.

답변

4

씁니다. (대부분의 키 - 값 저장소의 주요 가설인데, 그뿐만 아니라 ;-)), 상대적인 리더 보드를 얻기보다는 점수 (쓰기)를 업데이트해야 할 때 시간이 걸리는 것을 선호 할 수도 있습니다). 특히, 사용자의 점수가 바뀌면 각 친구의 작업을 대기열에 추가하여 "상대적 리더 보드"를 업데이트하고 해당 리더 보드를 목록 속성 (순서를 유지하는!)으로 적절하게 정렬합니다 (예 : 후자는 비정규 화입니다. 비정규 화 (denormalize), 즉 정보를 적절하게 복제하여 키 - 밸류 스토어 (key-value stores)를 최대한 활용해야하는 경우가 종종 있습니다.

우정 (사용자 대 사용자 연결)이 사라지거나 나타나면 물론 상대 순위표를 업데이트 할 수도 있지만 점수 업데이트보다 희귀해야합니다 (예 : 상상해보십시오).

쓰기가 자주 발생하는 경우 정확하게 정확한 최신 정보 (예 : 재무/회계 자료가 아닙니다 .--)가 필요 없기 때문에 여전히 시도 할 수있는 많은 방법이 있습니다.

예.큰 점수 변경 (드문 경우)은 상대적 리더 보드의 재 계산을 유발할 수 있지만 작은 것 (더 자주)은 은닉되고 잠시 동안 한 번만 적용됩니다. 다양한 규모, 일반적인 네트워크 - 우정 클러스터 크기 등의 업데이트 빈도에 대한 대략적인 정보가 없으면 더욱 구체적입니다. 다른 모든 사람들과 마찬가지로 크기와 빈도가 얼마나 다른지에 관계없이 완벽한 접근 방식을 원합니다. ! 질문에 ...하지만, 당신은 단지 하나를 찾을 수 없습니다 -)

+0

덕분에,이 도움이됩니다. 쓰기는 사용자가 날마다 응용 프로그램을 사용하기위한 점수를 누적함에 따라 매우 빈번합니다. 나는 어떤 종류의 '델타 체크 (delta check)'방식을 사용하여 상대적 보드를 업데이트 할 것인지 결정할 생각을하지 못했습니다 (예 : 10 점 이상의 점수로 점프 할 때 업데이트 큐업). 이는 재 계산이 매우 활발하게 일어나는 것을 보장합니다 사용자. 그런 다음 재 계산 운동을 최소화하기 위해 점점 더 자주 충돌하는 경우이 상수를 늘릴 수 있습니다. 다른 아이디어가 있다면 알려주세요 – Aneto

+0

대략적인 통계. 각 사용자는 10 명의 친구에게 분산되는 평균 10 점을 생성합니다. 각 친구에게 1 점이 부여됩니다. 따라서 일반적인 사용자의 친구가 10 명인 경우 해당 사용자는 하루 100 점을 쌓을 수 있습니다. 네트워크를 통해 업데이트하기위한 임계 값으로 잠재적으로 50 포인트를 사용할 수 있습니다. – Aneto

+1

초보 사용자의 경우 (예 : <200/300 점 또는 그래서) 모든 업데이트가 중요 할 수 있으므로 재 계산 임계 값을 낮추도록 설정할 수 있습니다. 이미 많은 점수를 가진 사용자들에 대해서는 점차적으로 높아집니다 (이미 2350을 가지고있을 때 90 점을 얻는 것은 사소한 것이며, 70 점으로 시작할 때 90 점을 얻는 것은 거대합니다 ;-). 이것이 도움이되는지 여부는 '짧은 머리 대 긴 꼬리'문제에 달려 있습니다. 즉, 활동적인 사용자의 경우 많은 점수가 발생하고 덜 활동적인 사용자의 경우 '긴 꼬리'의 점수가 높지는 않습니다. –

관련 문제