0

次のモデルがあります。さまざまなテキストがさまざまなテキストのコレクションにタグ付けされており、各テキストには複数のバージョンを含めることができますが、「アクティブな」バージョンは 1 つだけです。

class Collection(db.Model):
    name = db.StringProperty()
    ...       

class Text(db.Model):
    title = db.StringProperty(default="Untitled")
    ...

class Version(db.Model):
    text = db.ReferenceProperty(Text, collection_name="versions")
    content = db.TextProperty()
    active = db.BooleanProperty(default=True)
    ...

class Tag(db.Model):
    collection = db.ReferenceProperty(Collection, collection_name="c_tags")
    text = db.ReferenceProperty(Text, collection_name="t_tags")

ここで、すべての「アクティブな」テキストを 1 つのコレクションに表示したいと思います。

class ViewCollection(webapp.RequestHandler):
    def(get):
        collection = Collection.get(self.request.get("key"))
        # grabs the collection to display
        tags = collection.t_tags
        # grabs all the tags linking a text and a collection
        texts = [t.text for t in tags]

これにより、すべてのテキストのリストが得られるので、すべてのテキスト タイトルを簡単に印刷できます ( t.title for t in texts) が、各テキストの対応する「アクティブな」バージョンだけを取得できる賢い方法はありますか?

それとも、異なるモデル クラスにまたがるこのタイプのフィルタリングは不可能ですか?

4

2 に答える 2

1

Text == t.text および active == True である Version オブジェクトに対して別のクエリを発行する必要があります。

ユースケースによっては、非正規化してタグに最新バージョンを保存することも価値がある場合があるため、データを取得するために追加のクエリは必要ありません。この非正規化は、nosql データストアの一般的な「最適化」です。

于 2012-08-23T15:09:05.337 に答える
1

App Engine のデータストアは、この種のリレーショナル代数の問題には対応していません。あなたの現在の設計では、効率的に実行できるとは思いません。NoSQL データベースの概念を読み、モデルを再設計して「リレーショナルではない」ようにすることをお勧めします。

于 2012-08-23T06:38:25.777 に答える