【发布时间】:2011-07-05 13:42:59
【问题描述】:
我仍在学习有关使用 bigtable/nosql 进行数据建模的课程,希望能得到一些反馈。 如果我经常需要在父母之间处理汇总的孩子,我应该避免在数据建模中使用父->子关系,这样公平吗?
举个例子,假设我正在构建一个博客,该博客将由许多作者贡献,彼此都有帖子,每个帖子都有标签。所以我可能会设置这样的东西:
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.StringListProperty()
据我了解,这将基于作者父级创建一个实体组。 如果我主要需要按我希望跨越多个作者的标签查询帖子,这会导致效率低下吗?
我了解对列表属性进行查询可能效率低下。假设每个帖子平均有大约 3 个标签,但可以一直增加到 7 个。我希望我收集的可能标签在几百个以内。 将模型改成这样有什么好处吗?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.ListProperty(db.Key)
class Tag(db.Model):
name = db.StringProperty()
或者我做这样的事情会更好吗?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
class Tag(db.Model):
name = db.StringProperty()
class PostTag(db.Model):
post = db.ReferenceProperty(Post,
collection_name='posts')
tag = db.ReferenceProperty(Tag,
collection_name='tags')
最后一个问题...如果我最常见的用例是通过多个标签查询帖子怎么办。例如,“在 {'apples', 'oranges', 'cucumbers', 'bicycles'} 中查找所有带有标签的帖子” 这些方法之一是否更适合用于查找具有任何集合的帖子的查询标签?
谢谢,我知道那是一口。 :-)
【问题讨论】:
-
您的示例都没有创建实体组。在第一个示例中,您使用的是 ReferenceProperty,它创建对另一个实体的引用 - 这是可变的,并不意味着所有权。通过为实体的构造函数指定“父”参数来创建父引用 - 有关详细信息,请参阅此页面:code.google.com/appengine/docs/python/datastore/…
-
啊,谢谢尼克。我错过了那部分......认为它是创建父关系的引用并且缺少您需要将父级传递给构造函数。现在说得通了。
标签: python google-app-engine database-design nosql bigtable