1

他に何をすべきかわからない種類のリクエストの例を挙げると、

アプリケーションは、ボウリングのスコア/統計トラッカーです。誰かが高度なモードでスコアを入力すると、スコアだけでなく、いくつかの統計が計算されます。データは次のようにモデル化されます。

ゲーム - 名前、ユーザー、ボウリング場への参照、スコアなどのメンバー フレーム - 各ボールのピンフォール、各ボールでピンが倒されたブーリアン リスト、ボールのパスに関する情報 (スタンス、ターゲット、実際にボールが飛んだ場所) )、そのフレームのスコアなど GameStats - ゲーム全体の計算された統計を保存し、必要に応じて他のゲーム統計とマージして、ゲームのグループ全体の統計を表示します。

実際のこの情報の例は、ここにあります。

ゲームが完了し、フレームが更新されると、ゲーム、フレーム、その後のすべてのフレーム、場合によってはその前のいくつかのフレーム (スコアが正しいことを確認するため)、および統計を更新する必要があります。この操作は、常に CPU モニターにフラグを立てます。ゲームが未完成で、統計を計算する必要がない場合でも、スコアなどを更新してリアルタイムの進行状況をユーザーに表示する必要があるため、これらにもフラグが付けられます。このハンドラーの平均 CPU 時間は 7000 ミリサイクルを超え、ビューも表示されません。ほとんどの人は、シリーズごとに 3 ~ 4 ゲームをボウリングします。レーンでリアルタイムにスコアを入力する場合、2 ~ 4 分ごとに約 1 件のリクエストですが、すべてを書き留めて後で入力すると、30 ~ 40 件のゲームがあります。これらの要求が連続して行われています。


要求に応じて、重要なクラスのデータ モデル:

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)
4

1 に答える 1

1

いくつかの提案:

  • フレームの統計情報を、各ハーフの終わりに立っているピンのビットフィールド (整数で格納) のリストとして格納することで、それぞれに個別のエンティティを用意するのではなく、ゲームと同じエンティティの一部として格納できます。たとえばフレーム。これがどのように実装されるかについての詳細が必要な場合はお知らせください。
  • それができない場合は、フェッチ時に相互に関連するいくつかの統計を計算できます。たとえば、ゲーム全体を一度にロードした場合、これまでのスコアの計算は簡単になるはずです。つまり、リクエストごとに複数のフレームを更新する必要がなくなります。
  • データモデルを見せていただければ、さらにお役に立ちます。:)
于 2008-09-30T16:26:06.050 に答える