Google app engine 如何在GAE数据存储中正确保存数据?

Google app engine 如何在GAE数据存储中正确保存数据?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我需要保存以下数据: field1value=SomeStringValue field1score=10 field2value=SomeOtherValue field2score=20 ... fieldNvalue=SomeNValue fieldNscore=N i、 e.我有N个字段,每个字段都有自己的名称、存储的值和分数。如何在GAE数据存储中正确存储此类数据?通过字段名可以轻松访问数据。我还需要计算最终分数(field1score+field1score+…+fieldNsco

我需要保存以下数据:

field1value=SomeStringValue
field1score=10
field2value=SomeOtherValue
field2score=20
...
fieldNvalue=SomeNValue
fieldNscore=N
i、 e.我有N个字段,每个字段都有自己的名称、存储的值和分数。如何在GAE数据存储中正确存储此类数据?通过字段名可以轻松访问数据。我还需要计算最终分数(
field1score+field1score+…+fieldNscore

N大约为100,数据库中的记录总数将是巨大的

Upd。我使用了以下方法,但似乎不是最好的方法:

class User(db.Model):
    field_names = db.StringListProperty()
    field_values = db.StringListProperty()
    field_scores = db.ListProperty(int)
    score_value = db.IntegerProperty()

def fields_add(user_key_name, field_name, field_value, field_score):
    user = User.get(user_key_name)
    if user:
        field_names = user.field_names
        field_values = user.field_values
        field_scores = user.field_scores
        if field_name in user.field_names:
            field_index = user.field_names.index(field_name)
            field_values[field_index] = field_value
            field_scores[field_index] = field_score
        else:
            field_names.append(field_name)
            field_values.append(field_value)
            field_scores.append(field_score)
        user.field_names = field_names
        user.field_values = field_values 
        user.field_scores = field_scores
        # TODO: update user.score_value
        user.put()

可能取决于您的访问模式,以及N的最大值

最简单的方法是维护两个:


这取决于您的访问模式。了解更多的细节和要求可以得到更好的答案

如果您将有超过5000个条目无法分开,则应使用下面这样的简单结构。要获得分数之和,可以查询所有分数并将其添加到内存中。如果您有大量的分数,您可以使用按需查找总和,也可以使用a来保持总分数

class Score(db.Model):
  value = db.StringProperty()
  score = db.IntegerProperty()
如果您的条目不超过5000个,则可以使用
ListProperty
。这将导致数据存储的读写次数大大减少,因为只有一个查询返回所有结果,然后可以在内存中求和。如果您有第三条数据(如下面的玩家字段),您可以使用它来保证您的条目少于5000条,这可能是一个不错的解决方案

class Score(db.Model):
  player = db.StringProperty()
  values = db.StringListProperty()
  scores = db.ListProperty(int)

数据存储中的记录总数将超过5000条。但是字段的数量(
N
以上)将在100左右。谢谢,瑞文。字段名是什么?我应该有第三个列表吗?@LA_u?如果您的字段名列表是静态的,那么您可能希望维护名称索引查找,而不是将它们存储在用户类中。只需使用良好的默认值(零?)将所有人初始化为相同大小的数组。但是,如果您想根据特定的命名分数进行任何查询,您可能需要考虑显式列出每个字段,而不是在列表中存储值/分数。我很确定这可以动态完成——不需要输入200个属性(如果字段列表不是静态的,那么Expando模型可能是合适的)。
class Score(db.Model):
  player = db.StringProperty()
  values = db.StringListProperty()
  scores = db.ListProperty(int)