GAE数据存储区缓存密钥与过滤器

时间:2012-09-07 16:45:47

标签: python google-app-engine datastore

假设您有这样的实体。

postid=db.StringProperty()
comment=db.StringProperty()

用于在帖子ID标识的某个帖子上存储评论。 评论可以达到数十亿条记录。现在,如果你想 获取属于您可以执行的某个帖子的所有评论,

query=Comment.all()
query.filter('postid = ','id').

或者不是这样做,你可以定义像

这样的帖子
class Post(db.Model)
    commentids=db.StringListProperty()#store list of comment ids

这样你可以通过

直接获得评论
comment=Comment.get_by_key_name('commentkey')

从长远来看(当评论达到数百万甚至数十亿大关时)哪一个 效率更高。换句话说哪一个更合适。

2 个答案:

答案 0 :(得分:3)

如果您计划有数十亿条评论,请考虑使用最新的NDB API,其中包括支持自动缓存。

您应该使用父postid实体,而不是按Comment过滤它们。这是一个例子(使用DB,但使用NDB非常相似):

如果你有这样的模特:

class Post(db.Model):
  desc = db.StringProperty()

class Comment(db.Model):
  desc = db.TextProperty()

您可以创建帖子和评论,例如:

post_db = Post(desc='Hello World')
post_db.put()

comment_db = Comment(parent=post_db, desc='Nice post')
comment_db.put()

最后,如果您想获得特定post_db实体的所有评论:

comment_dbs = Comment.all().ancestor(post_db)

答案 1 :(得分:0)

实体的大小限制为1MB。此外,实体可以拥有最多5000个索引条目,因此如果您的commentids已编入索引,则最大大小将为5000个条目。

因此选项二不适合数百万条评论(我从未见过每个帖子有一百万条评论的网站,但Reddit的热门帖子确实超过了5k。

此外,您可能需要一种以渐进方式列出注释的方法(分页,渐进式滚动)。在这种情况下,选项one via query会更好,因为你可以通过游标逐步列出注释,你也可以通过不同的标准(时间,投票等)对属性进行排序。