0

我有以下模型,其中不同的文本被标记到不同的文本集合中,每个文本可以有多个版本,但只有一个“活动”版本:

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")

现在我想在一个集合中显示所有“活动”文本:

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

App Engine 的 Datastore 不是为此类关系代数问题而设计的。我不相信您当前的设计可以有效地完成。我建议您阅读 NoSQL 数据库概念并重新设计您的模型以“减少相关性”。

于 2012-08-23T06:38:25.777 回答
1

您必须对文本 == t.text 和活动 == True 的版本对象发出另一个查询。

根据您的用例,在标签中进行非规范化和存储最新版本可能是值得的,因此您不需要额外的查询来获取数据。这种非规范化是 nosql 数据存储的常见“优化”。

于 2012-08-23T15:09:05.337 回答