2011-08-15 1 views
3

AppEngineデータストアについて知っていても、私はこれに対する答えは分かりません。誰かがすでに答えを知っていることを期待して、それを理解するために必要なすべてのコードを書いて実行する必要がないようにしようとしています。Google AppsエンジンのデータストアでONEを行う最も効率的な方法は何ですか

私はコードのように持っている:

class AddlInfo(db.Model) 
    user = db.ReferenceProperty(User) 
    otherstuff = db.ListProperty(db.Key, indexed=False) 

そして持つレコードを作成します。私のような何かを行うことができます。このオブジェクトを取得するには

info = AddlInfo(user=user) 
info.put() 

を:

# This seems excessively wordy (even though that doesn't directly translate into slower) 
info = AddlInfo.all().filter('user =', user).fetch(1) 

または私は何ができます次のようなもの:

class AddlInfo(db.Model) 
    # str(user.key()) is the key to this record 
    otherstuff = db.ListProperty(db.Key, indexed=False) 

の作成は次のようになります。

info = AddlInfo(key_name=str(user.key())) 
info.put() 

し、次いで情報を取得:

info = AddlInfo.get(str(user.key())) 

私は(私はユーザーオブジェクトを使用してそこに着いた、AddlInfoでreference_propertyを必要としません最初の場所)。より速い/少ないリソース集約型はどれですか?私はこのようにそれをやった理由の

==================

一部はotherstuffは100+キーのリストかもしれないと私は必要だということですそれらは時々(たぶん50%未満です)、私はすべての要求にこれらの100以上のキーをロードする必要がないので、効率的にしようとしていました。.....

+3

最も効率的な方法は、ただ正規化し、2つの別個のエンティティを持たないことです。 – geoffspear

+0

最後にあなたが言及するオーバーヘッドを避けるための "トリック"があります - 子クラスに100以上のキーを置きます。それを選択し、キーを取得し(のみ)、親を見つけて、より少量のデータをプルすることができます。これはここの別の答え、どこかで説明されています.... –

答えて

1

2つのオプションの間に、より安価です。なぜなら、あなたはリモートインデックスでそれを探すのではなく、推論によってキーを決定しているからです。

Wooble氏によれば、まだすべてを1つのエンティティに保つのは安いです。複数のオプションのアドホックプロパティを格納する方法が必要な場合は、Expandoを検討してください。

+0

わずかに安い - 約半分のコスト/時間。 –

0

2つ目の方法は、1つの修正を加えた方が良い方法です。ユーザーのキー全体をこのエンティティのキ​​ー名として使用する必要はありません。ユーザーレコードと同じキー名を使用するだけです。

+0

鍵全体を使うことはできません。それはあなたをさせません。 – boatcoder

+0

@ Mark0978どうしてですか?これが問題になると私が考えることができる唯一の理由は、使用しようとしているキーが長すぎる場合です。 –

関連する問題