2012-03-06 6 views
0

나는 각 플레이어가 점수를 얻는 게임을 가지고있다. 나는 선수들이 점수를 비교하고 점수를 얼마나 잘 볼 수 있는지, 점수 판을 열람 할 수있는 세계적인 점수 판을 갖고 싶습니다.파이썬과 SQL을 사용하는 스코어 보드

불행히도 저는 이것을 프로그램하는 효율적인 방법을 찾을 수 없습니다 : 점수 판에 현재 플레이어 위치를 저장한다는 것은 플레이어가 점수를 올릴 때 점수 판의 많은 부분을 업데이트해야한다는 것을 의미하며, 내가 필요로 할 때마다 그것을 다시 계산해야한다. (또한 많은 계산이 필요할 것이다.)

이 문제에 대한 해결책이 더 있습니까? 또는 위의 솔루션 중 하나는 많은 사용자와 많은 업데이트를 통해 실질적으로 사용되기에 "충분히 좋은"것입니까?

+0

HMH을 발견하지 않는 한이 하나 같이 갈거야.. 나는 거의 이것을 SQL을 사용하지 않을 것이라고 생각한다. XQUF 확장을 사용하는 XQuery 데이터베이스는 문서를 수정하기 위해 "$ FAR을 $ BAR 바로 위로 이동"(또는 "$ FOO 2 이동" 형제 자매 ") 또는"이 문서에서 $ BAZ의 위치를 ​​검색 "하십시오. –

+1

... 그렇게 말하면 순위는 실제로 실시간이어야합니까? 일괄 처리로 업데이트합니다. 'SELECT INTO'를 할 때마다 당신의 삶이 더 쉬워 질 것입니다. –

답변

0

ORDER BY 절이 작성되어 매우 느리게 보이지 않습니다.

+0

ORDER BY는 내 문제를 해결하지 못합니다. 나는 그 선수의 계급을 얻을 수 없습니다. –

0

구현하기 쉽도록 두 번째 솔루션을 사용하는 것이 좋습니다. 프로젝트의 크기에 따라 ORDER_BY를 사용하여 솔루션을 주문할 수 있어야합니다.

"충분히 좋은"것인지 여부에 따라 사용자의 요구에 크게 좌우 될 수 있습니다. 최악의 경우 업데이트를 수행 할 때마다 데이터를 정렬하는 것이 비용이 많이 들지만 ORDER_BY가 느린 경우 다시 작성하는 것이 좋습니다.

가장 좋은 질문은 어떤 작업이 더 많이 수행 될 것인가하는 것입니다. 매우 드물게 글을 쓰고 자주 읽는다면 어쩌면 일종의 아이디어 일 것입니다. 그대로 ORDER_BY 사용하는 것이 좋습니다.

위치를 구현하는 한, 데이터 모델에서이를 가져 와서 출력시 추적하지 않는 이유가 있습니까? 행을 출력하는 동안 카운터를 작성하는 것이 꽤 쉬울 것 같고 테이블에 저장하는 것보다 문제가 적습니다.

요청시이 작업을 수행하려면 this SO question에 저장 프로 시저를 사용하는 솔루션이있는 것 같습니다.

+0

'O (n)'랭크 룩업을 사용하면 1K 명이 넘는 사용자를 갖게되는 순간 정말 느려질 것이라고 걱정됩니다. 데이터베이스 외부의 순위를 계산하기 위해 모든 데이터를 쿼리해야하는 경우 :/어쨌든 좋은 해결책을 찾은 것 같습니다. 질문에 대한 내 대답을 참조하십시오. –

0

마침내 각 점수 업데이트에서 전체 스코어 보드를 다시 계산할 필요가없는 솔루션을 발견했다고 생각합니다. 기본적으로, 의사 SQL 코드 :

순위는 이전 점수와 여전히 많이 될 수있는 새로운 점수 (사이의 플레이어 업데이트,하지만를 재 계산의 "순진"솔루션만큼되지
max_rank = SELECT MIN(rank) FROM scoreboard WHERE score <= $new_score AND score >= $old_score 
UPDATE scoreboard SET rank = rank + 1 WHERE score < $new_score AND score >= $old_score 
UPDATE scoreboard SET rank = $max_rank, score = $new_score WHERE player = $player 

전체 점수 판 SQL 데이터베이스는 대부분의 작업을 처리하는이 :. 모든 순위 업데이트 한 쿼리에서 완료

내가 누군가에 대한 문제 :

+0

마음에 오는 주요한 점은 당신이 스코어 보드에 추가되는 새로운 플레이어의 경우를 처리해야한다는 것입니다. 그러나 오래된 스코어가 0으로 간주되면 로직이 그것을 잘 처리해야합니다. – fluffy

관련 문제