Pergunta

Para dar um exemplo do tipo de solicitação que não consigo descobrir o que mais fazer para:

O aplicativo é um Pontuação de boliche/rastreador de estatísticas. Quando alguém entra em suas pontuações no modo avançado, várias estatísticas são calculadas, bem como sua pontuação. Os dados são modelados como:

Jogo - membros como nome, usuário, referência ao pacote de boliche, quadro de pontuação - pinfalls para cada bola, listas booleanas para as quais os pinos foram derrubados em cada bola, informações sobre o caminho da bola (postura, alvo, onde ela realmente foi ), a pontuação a partir desse quadro, etc. GameStats - lojas calculadas estatísticas para todo o jogo, para serem mescladas com outras estatísticas de jogo, conforme necessário, para as estatísticas exibidas entre grupos de jogos.

Um exemplo dessas informações na prática pode ser encontrado aqui.

Quando um jogo é concluído e um quadro é atualizado, tenho que atualizar o jogo, o quadro, cada quadro depois dele e possivelmente alguns antes (para garantir que suas pontuações estejam corretas) e as estatísticas. Esta operação sempre sinaliza o monitor da CPU. Mesmo que o jogo não esteja completo e as estatísticas não precisem ser calculadas, as pontuações e essa necessidade de ser atualizadas para mostrar o progresso em tempo real para o usuário e, portanto, elas também são sinalizadas. O tempo médio da CPU para este manipulador tem mais de 7000 mcycles e nem exibe uma visualização. A maioria das pessoas joga de 3 a 4 jogos por série - se estiverem entrando em sua pontuação em tempo real, nas faixas, isso é cerca de 1 solicitação a cada 2 a 4 minutos, mas se eles escreverem tudo e entrarem mais tarde, há 30-40 de Esses pedidos que estão sendo feitos seguidos.


Conforme solicitado, o modelo de dados para as classes importantes:

class Stats(db.Model):
  version = db.IntegerProperty(default=1)
  first_balls=db.IntegerProperty(default=0)
  pocket_tracked=db.IntegerProperty(default=0)
  pocket=db.IntegerProperty(default=0)
  strike=db.IntegerProperty(default=0)
  carry=db.IntegerProperty(default=0)
  double=db.IntegerProperty(default=0)
  double_tries=db.IntegerProperty(default=0)
  target_hit=db.IntegerProperty(default=0)
  target_missed_left=db.IntegerProperty(default=0)
  target_missed_right=db.IntegerProperty(default=0)
  target_missed=db.FloatProperty(default=0.0)
  first_count=db.IntegerProperty(default=0)
  first_count_miss=db.IntegerProperty(default=0)

  second_balls=db.IntegerProperty(default=0)
  spare=db.IntegerProperty(default=0)
  single=db.IntegerProperty(default=0)
  single_made=db.IntegerProperty(default=0)
  multi=db.IntegerProperty(default=0)
  multi_made=db.IntegerProperty(default=0)
  split=db.IntegerProperty(default=0)
  split_made=db.IntegerProperty(default=0)

class Game(db.Model):
  version = db.IntegerProperty(default=3)
  user = db.UserProperty(required=True)
  series = db.ReferenceProperty(Series)
  score = db.IntegerProperty()
  game_number = db.IntegerProperty()
  pair = db.StringProperty()
  notes = db.TextProperty()
  simple_entry_mode = db.BooleanProperty(default=False)
  stats = db.ReferenceProperty(Stats)
  complete = db.BooleanProperty(default=False)

class Frame(db.Model):
  version = db.IntegerProperty(default=1)
  user = db.UserProperty()
  game = db.ReferenceProperty(Game, required=True)
  frame_number = db.IntegerProperty(required=True)
  first_count = db.IntegerProperty(required=True)
  second_count = db.IntegerProperty()
  total_count = db.IntegerProperty()
  score = db.IntegerProperty()
  ball = db.ReferenceProperty(Ball)
  stance = db.FloatProperty()
  target = db.FloatProperty()
  actual = db.FloatProperty()
  slide = db.FloatProperty()
  breakpoint = db.FloatProperty()
  pocket = db.BooleanProperty()
  pocket_type = db.StringProperty()
  notes = db.TextProperty()
  first_pinfall = db.ListProperty(bool)
  second_pinfall = db.ListProperty(bool)
  split = db.BooleanProperty(default=False)
Foi útil?

Solução

Algumas sugestões:

  • Você pode armazenar as estatísticas para quadros como parte da mesma entidade que o jogo, em vez de ter uma entidade separada para cada um, armazenando-a como uma lista de campos de bits (armazenados em números inteiros) para os pinos que estão no final de cada metade quadro, por exemplo. Deixe -me saber se você quiser mais detalhes sobre como isso seria implementado.
  • Falhando nisso, você pode calcular algumas das estatísticas mais inter -relacionadas no busca. Por exemplo, o cálculo da pontuação do SCORE deve ser simples se você tiver todo o jogo carregado de uma só vez, o que significa que você pode evitar a necessidade de atualizar vários quadros em todas as solicitações.
  • Podemos ajudar mais se você nos mostrar seu modelo de dados. :)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top