2012-02-25 5 views
0

나는 다음과 같은 데이터를 유지해야합니다GAE 데이터 저장소에 데이터를 올바르게 저장하는 방법은 무엇입니까?

field1value=SomeStringValue 
field1score=10 
field2value=SomeOtherValue 
field2score=20 
... 
fieldNvalue=SomeNValue 
fieldNscore=N 

즉 내가 N 필드가 각 필드는 자신의 이름, 거기 점수 저장된 값을가집니다. GAE 데이터 저장소에 이러한 데이터를 올바르게 저장하는 방법은 무엇입니까? 데이터는 필드 이름으로 쉽게 액세스 할 수 있어야합니다. 최종 점수 (field1score + field1score + ... + fieldNscore)도 계산해야합니다.

N은 약 100이며 데이터베이스의 총 레코드 수는 커집니다.

업데이트. 나는 다음과 같은 방법을 사용하지만 가장 좋은 것이 아니다처럼 보이는했습니다

class User(db.Model): 
    field_names = db.StringListProperty() 
    field_values = db.StringListProperty() 
    field_scores = db.ListProperty(int) 
    score_value = db.IntegerProperty() 

def fields_add(user_key_name, field_name, field_value, field_score): 
    user = User.get(user_key_name) 
    if user: 
     field_names = user.field_names 
     field_values = user.field_values 
     field_scores = user.field_scores 
     if field_name in user.field_names: 
      field_index = user.field_names.index(field_name) 
      field_values[field_index] = field_value 
      field_scores[field_index] = field_score 
     else: 
      field_names.append(field_name) 
      field_values.append(field_value) 
      field_scores.append(field_score) 
     user.field_names = field_names 
     user.field_values = field_values 
     user.field_scores = field_scores 
     # TODO: update user.score_value 
     user.put() 

답변

0

아마 액세스 패턴처럼 무엇에 따라 달라집니다, 그리고 N의 최대 값은 무엇인가.

가장 간단한 방법은 두 ListProperties을 유지하는 것입니다 :

from google.appengine.ext import db 

class MyClass(db.Model): 
    valueList = db.StringListProperty() 
    scoreList = db.ListProperty(int) 
+0

감사합니다. 필드 이름은 무엇입니까? 세 번째 목록이 있어야합니까? –

+0

@LA_ 필드 이름 목록이 정적 인 경우 이름을 으로 유지하고 User lookup을 User 클래스에 저장하지 않으려합니다. 좋은 기본값 (제로?)을 가진 동일한 크기의 배열로 모두 초기화하십시오. 그러나 특정 명명 된 점수를 기반으로 쿼리를 수행하려는 경우 값/점수를 목록에 저장하는 대신 각 필드를 명시 적으로 나열하는 것이 좋습니다. 나는 이것을 동적으로 할 수 있다고 확신한다 - 200 개의 속성을 입력 할 필요가 없다. (그리고 필드 목록이 정적이 아닌 경우 Expando 모델이 적절할 것이다.) – Raven

1

이 당신의 액세스 패턴에 따라 달라집니다. 더 자세한 내용과 요구 사항을 알고 있으면 더 나은 대답을 얻을 수 있습니다.

별도로 분리 할 수없는 항목이 5000 개 이상인 경우 아래와 같은 간단한 구조를 사용해야합니다. 점수의 합계를 얻으려면 모두를 쿼리하고 메모리에 추가 할 수 있습니다. 점수가 많은 경우 MapReduce을 사용하여 요청시 합계를 찾거나 누적 합계를 유지하려면 shard counter을 사용할 수 있습니다. 5000 개 이상의 항목이하지 않을 경우

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

당신은 ListProperty를 사용할 수 있습니다. 결과적으로 메모리에서 합계 할 수있는 모든 결과를 반환하는 쿼리가 하나뿐이기 때문에 데이터 저장소의 읽기 및 쓰기 수가 훨씬 적습니다. 아래에있는 플레이어 필드와 같은 세 번째 데이터가있는 경우 5000 개 미만의 항목이 있음을 보장하는 데 사용할 수 있습니다. 괜찮은 해결책 일 수 있습니다.

class Score(db.Model): 
    player = db.StringProperty() 
    values = db.StringListProperty() 
    scores = db.ListProperty(int) 
+0

데이터 저장소의 총 레코드 수는 5000 개가 넘습니다. 그러나 필드 수 (위의 'N')는 약 100입니다. –

관련 문제