Frage

Um ein Beispiel für die Art von Anfrage zu geben, dass ich nicht herausfinden kann, was ich sonst noch tun soll:

Die Anwendung ist a Bowling Score/Stat -Tracker. Wenn jemand im erweiterten Modus seine Ergebnisse eingibt, werden eine Reihe von Statistiken sowie ihre Punktzahl berechnet. Die Daten werden als:

Spiel - Mitglieder wie Name, Benutzer, Verweis auf die Kegelbahn, Score -Rahmen - Pinfall für jeden Ball, Boolesche Listen, für die Pins auf jeden Ball niedergeschlagen wurden, Informationen über den Weg des Balls (Haltung, Ziel, wo es tatsächlich ging ), die Punktzahl als dieses Rahmen usw. Gamestats - Speichert die berechneten Statistiken für das gesamte Spiel, um nach Bedarf mit anderen Spielstatistiken für Statistiken über Gruppen von Spielen hinweg zusammenzufassen.

Ein Beispiel für diese Informationen in der Praxis kann gefunden werden hier.

Wenn ein Spiel abgeschlossen ist und ein Rahmen aktualisiert wird, muss ich das Spiel, den Rahmen, jeden Frame danach und möglicherweise einige vor ihm aktualisieren (um sicherzustellen, dass die Punktzahlen korrekt sind) und die Statistiken. Dieser Vorgang kennzeichnet immer den CPU -Monitor. Auch wenn das Spiel nicht abgeschlossen ist und Statistiken nicht berechnet werden müssen, müssen die Punktzahlen und solche aktualisiert werden, um dem Benutzer den Echtzeit-Fortschritt anzuzeigen, und diese werden auch markiert. Die durchschnittliche CPU -Zeit für diesen Handler beträgt über 7000 Mcycles und zeigt nicht einmal eine Ansicht. Die meisten Leute Bowl 3 bis 4 Spiele pro Serie - Wenn sie in Echtzeit in ihren Punkten eintreten Diese Anfragen werden in Folge gestellt.


Wie angefordert, das Datenmodell für die wichtigen Klassen:

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)
War es hilfreich?

Lösung

Ein paar Vorschläge:

  • Sie können die Statistiken für Frames als Teil derselben Entität wie das Spiel speichern, anstatt eine separate Einheit für jeden zu haben, indem Sie sie als Liste von Bitfields (in Zahlen gespeichert) für die Stifte, die am Ende jeder Halbzeit stehen, gespeichert werden. Frame, zum Beispiel. Lassen Sie mich wissen, ob Sie weitere Details dazu wünschen, wie dies implementiert werden würde.
  • Da Sie dies nicht tun können, können Sie einige der miteinander verbundenen Statistiken zum Abrufen berechnen. Die Berechnung des Score-SO-Far-Fars sollte beispielsweise einfach sein, wenn Sie das gesamte Spiel gleichzeitig geladen haben. Dies bedeutet, dass Sie vermeiden können, mehrere Frames auf jeder Anfrage zu aktualisieren.
  • Wir können mehr hilfreich sein, wenn Sie uns Ihr Datenmodell zeigen. :)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top