1

举一个我不知道还能做什么的请求的例子:

该应用程序是保龄球得分/统计跟踪器。当有人在高级模式下输入他们的分数时,会计算一些统计数据以及他们的分数。数据建模为:

游戏 - 成员,如姓名、用户、保龄球馆的引用、得分 Frame - 每个球的落点、每个球上击倒球的布尔列表、关于球路径的信息(姿势、目标、实际去向)、该帧的得分等 GameStats - 存储整个游戏的计算统计数据,根据需要与其他游戏统计数据合并,以便跨游戏组显示统计数据。

可以在此处找到此信息在实践中的示例。

当游戏完成并更新一帧时,我必须更新游戏、帧、之后的每一帧,可能还有之前的一些(以确保他们的分数是正确的),以及统计数据。此操作始终标记 CPU 监视器。即使游戏没有完成,不需要计算统计数据,也需要更新分数等以向用户显示实时进度,因此这些也会被标记。这个处理程序的平均 CPU 时间超过 7000 mcycles,它甚至不显示视图。大多数人每个系列会打 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

几点建议:

  • 您可以将帧的统计信息存储为与游戏相同的实体的一部分,而不是为每个实体单独存储一个实体,方法是将其存储为位于每个半场末尾的引脚的位域列表(以整数存储)-以框架为例。如果您想了解有关如何实施的更多详细信息,请告诉我。
  • 如果做不到这一点,您可以计算一些更相关的 fetch 统计信息。例如,如果您一次加载了整个游戏,那么计算到目前为止的分数应该很简单,这意味着您可以避免每次请求都更新多个帧。
  • 如果您向我们展示您的数据模型,我们可以提供更多帮助。:)
于 2008-09-30T16:26:06.050 回答