2012-02-25 177 views
0

我需要保存的数据如下图所示:如何在GAE数据存储区中正确保存数据?

field1value=SomeStringValue 
field1score=10 
field2value=SomeOtherValue 
field2score=20 
... 
fieldNvalue=SomeNValue 
fieldNscore=N 

即我有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() 

回答

0

可能取决于你的访问模式是什么样的,什么N的最大值为。

最简单的方法是维持两个ListProperties

from google.appengine.ext import db 

class MyClass(db.Model): 
    valueList = db.StringListProperty() 
    scoreList = db.ListProperty(int) 
+0

谢谢,乌鸦。什么是字段名称?我应该有第三份名单吗? – 2012-02-28 17:19:10

+0

@LA_如果您的字段名称列表是静态的,您可能希望保留名称<->索引查找,甚至不将它们存储在User类中。只需将每个人初始化为具有良好默认值(零)的相同大小的数组。但是,如果您想根据特定的指定分数执行任何查询,则可能需要考虑明确列出每个字段,而不是将值/分数存储在列表中。我很确定这可以动态完成 - 不需要输入200个属性(如果字段列表不是静态的,那么Expando模型也可能是合适的)。 – Raven 2012-02-29 06:20:54

1

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

如果您将有超过5000条条目无法分开,您应该使用如下所示的简单结构。要获得分数的总和,您可以查询所有分数并将其添加到内存中。如果您有大量的分数,则可以使用MapReduce来查找按需金额,或者使用shard counter来保持总分。

class Score(db.Model): 
    value = db.StringProperty() 
    score = db.IntegerProperty() 

您可以使用ListProperty如果你不会有超过5000个条目。这会导致数据存储读写次数少得多,因为只有一个查询返回所有可以在内存中求和的结果。如果您有第三部分数据(如下面的球员字段),您可以使用它来保证您的输入少于5000条,这可能是一个体面的解决方案。

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

数据存储区中的记录总数将超过5000个。但字段数(上面的'N')将大约为100。 – 2012-02-26 15:08:49