2012-08-10 6 views
0

나는 GAE를 백엔드로 사용하는 Facebook App을 보유하고 있으며 간단한 채점 시스템을 구현하고 있습니다. 실제 모델 수준의 데이터 및 여러 사용자의 가능성이 조금 더 복잡하지만 단순화 된 버전은 다음과 같다 :친구 목록을 기반으로 GAE에서 상한 검색

class score(db.Model): 
    value = db.IntegerProperty() 
    user = db.StringProperty() 

이미 세계 최고 열 점수를 표시 할 수 있지만 는 또한의 옵션을 원하는 사용자의 친구의 상위 10 개 점수 표시. SQL 환경에서 SELECT * FROM 점수 user1 IN (... friendslist ...) 또는 user2 IN (... friendslist ...) ORDER BY value LIMIT 10. 무언가를 할 것입니다. 비 관계형 데이터베이스에서 " IN "쿼리는 비용이 많이 들며 GAE에서는 특히 한 번에 30 개 값의 블록으로 제한됩니다. 이 방법으로 쿼리를 구현하는 것은 이상적이지 않습니다.

현재 각 점수는 key_name = facebook id (앱은 가장 높은 점수 만 저장하므로 중복 키에 문제가 없습니다) 점수를 저장 한 다음 score.get_by_key_name (... friendslist)을 사용하십시오. ..). 이 메소드의 문제점은 수없이 많습니다. 모든 친구를 쿼리해야하며, 모든 친구의 점수를 정렬되지 않은 목록으로 반환합니다. 그러면 코드로 파싱해야합니다.

각 점수 엔티티를 memcaching하면로드가 조금 줄어들지 만, 데이터 저장소에 많은 점수가 채워지면 memcache가 잘 확장되지 않으며 이는 여전히 간단한 작업이 될 수있는 비싼 고통스러운 방식입니다. 관계형 데이터베이스. Google App Engine에서 더 나은 방법이 있나요?

답변

0

상위 10 개 점수를 각 사용자의 엔터티에 적어주세요.

사용자 1의 점수가 100입니다. 네!

사용자 1에게는 20 명의 친구 목록이 있습니다.

친구 20 명을 얻고 상위 20 개 중 하나 인 경우 각 엔티티의 최고 점수 필드에 100을 추가하십시오.

단점 : 사용자가 새로운 고득점을 올릴 때마다 모든 친구의 항목을 가져 와서 업데이트 할 수 있습니다. 읽기 쓰기 비용보기 물론, 사용자가 여러 개의 높은 점수를 연속적으로 받으면 아마도 친구 값이 memcached됩니다.

장점 : 사용자가 마지막으로 재생 한 이후로 각 최고 점수 항목에 타임 스탬프를 표시하고 사용자가 마지막으로 재생 한 시간을 추적하고 HIGHLIGHT 새로운 높은 점수를 기록 할 수 있습니다. 그냥 생각 ...

관련 문제