2012-02-25 225 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