假设您有这样的实体。
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')
从长远来看(当评论达到数百万甚至数十亿大关时)哪一个 效率更高。换句话说哪一个更合适。
答案 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会更好,因为你可以通过游标逐步列出注释,你也可以通过不同的标准(时间,投票等)对属性进行排序。