2010-12-26 1 views
1

多くのブール値のプロパティを持つオブジェクトを持つGAEアプリケーションを構築しています。 (psuedo-sqlで)「X1 = True、X2 = False、X3 = False、X4からX7を真または偽にする」などのクエリを作成するプロパティを検索できます。多くのBooleanPropertyを使って効率的なGoogle-App-Engineスキーマを作成する方法

class JobModel(BaseModel): 
    job_name  = db.StringProperty(); 
    part_time  = db.BooleanProperty(); 
    has_401k  = db.BooleanProperty(); 
    has_health_in = db.BooleanProperty(); 
    has_childcare = db.BooleanProperty(); 
    has_edu_reim = db.BooleanProperty(); 

問題はGAEはこれらのブール値を検索するあらゆる可能な方法のためのインデックスを必要とすることである。

は、私は、以下に示すものと同様のモデルを持っています。したがって、5つのブール値のプロパティがある場合は、32の異なるインデックスが必要になります。あなたが20のブール値のプロパティを持っているなら(私の実際のケースでは)、100万を超えるインデックスが必要です!

このデータストアスキーマを設定するには、より良い方法が必要です。

答えて

4

これはStringListPropertyの良い機会です。

メンバーシップの設定はListPropertyの強みです。

リストを更新およびマーシャリングする方法を提供する必要がありますが、必要に応じて効率的である可能性があります。箇条

"WHERE has = '401k:T' and has = 'health_in:F'" 

ListPropertiesが彼らの強みと応用を理解するためにいくつかの努力を必要と

db.StringListProperty

has = ['401k:T', 'health_in:F', 'has_childcare:T'] 

GQL。うまくいったとN =プロパティの数を検索するO(2^N)インデックスの問題を、固定

GAE datastore list property serialization

+0

。しかし、あなたのソリューションはまだO(N)のインデックスを必要とします。 O(N)インデックスを回避する方法はありませんか? – speedplane

+0

アイデアは、すべてのプロパティを1つのインデックスになるように1つのリストプロパティにエンコードすることです。あなたは "爆発的なインデックス"の問題を望んでいない。 http://code.google.com/appengine/docs/python/datastore/queries.html#Big_Entities_and_Exploding_Indexes – kevpie

+0

この「分解インデックス」の問題を理解していると思います。しかし、すべてを1つのプロパティに入れることで、コードとデータモデルがクルージングに変わります。 – speedplane

関連する問題