2011-07-28 2 views
0

합리적인 성능을 얻기 위해 애플리케이션 데이터를 모델링하는 데 어려움이 있습니다. 그 다음 내가 가진, 내가 예를 들어 각 사람의 균형을 계산할 때 문제가Google App Engine Datastore에서 내 앱을 모델링하는 방법

class Event(db.Model): 
    # Values 
    name = db.StringProperty(required=True) 
    password = db.StringProperty(required=True) 

class Person(db.Model): 
    # References 
    event = db.ReferenceProperty(Event, required=True) 
    # Values 
    name = db.StringProperty(required=True) 

class Transaction(db.Model): 
    # References 
    event = db.ReferenceProperty(Event, required=True) 
    paidby = db.ReferenceProperty(Person, required=True) 
    # Values 
    description = db.StringProperty(required=True) 
    amount = db.FloatProperty(required=True) 
    datetime = db.DateTimeProperty(auto_now_add=True) 

# This is used because a transaction might not distribute costs 
# evenly across all persons belonging to the event 
class TransactionPerson(db.Model): 
    # References 
    event = db.ReferenceProperty(Event, required=False) 
    transaction = db.ReferenceProperty(Transaction, required=True) 
    person = db.ReferenceProperty(Person, required=True) 
    # Values 
    amount = db.FloatProperty(required=True) 

입니다 :

그것은 나는 다음과 같은 엔티티 한 사람과 오늘의 그룹 내에서 비용을 추적하는 응용 프로그램입니다

    : (~입니다 아래의 예에서 65.000 작업을)

    각 트랜잭션/사람의 조합에 대한 모든 TransactionPerson을 통해 이벤트 및 루프와 관련된 모든 데이터를 가져 오기 위해 내가 가진 이벤트 예를

  • 4 명
  • 76 거래
  • 213 TransactionPerson

인당 이러한 균형 요약을 표시하고 모든 트랜잭션이 걸리는 시작 페이지로 요청 :

 
real: 1863ms 
cpu: 6900ms (1769ms real) 
api: 2723ms (94ms real) 

순간 I에서 3 명의 RPC 요청만으로 이벤트에 대한 모든 사람, 트랜잭션 및 트랜잭션 담당자를 얻은 다음 응용 프로그램에서 모든 "관계형"작업을 수행합니다. 즉, CPU ms가 꽤 높은 이유입니다.

질문 :

  1. 그것은, 2723ms API를 CPU 만 3 개 데이터 저장소 요청에서 293 개체를 얻을하는 데 걸리는 꽤 높지 않다? 실시간은 괜찮습니까 (94ms),하지만 내 API 할당량에서 많이 걸립니까?

  2. 더 나은 성능을 얻으려면 어떻게 설계해야합니까? 예를 들어 12 명의 사람들이 있다면 시간은 3 배가됩니다. 이는 수용 가능한 응답 시간이 아닙니다.

고마워요!

답변

1

일반적으로 읽기를 최적화하고 싶습니다.

읽기 시간에 사람의 잔고를 계산하는 대신 쓰기 시간에 변경 사항을 계산하고 비정규 화하여 계산 된 잔액을 사람 개체에 저장합니다.

+0

memcache를 사용하여 비정규 화 된 데이터를 저장하고 거기에서 가져 오면 읽기 성능이 크게 향상됩니다. 귀하의 솔루션뿐만 아니라, 같은 속도로 데이터와 느린 추가/쓰기 요청을 내 memcache 솔루션으로 같은 속도로 추가 할 수있을 것 같아요 특정 추가 이벤트에 대한 memcache를 무효화 할 추가/쓰기. – thejaz