3

假设您有一个这样的实体。

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

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

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

或者,您可以定义 post 之类的,而不是这样做

class Post(db.Model)
    commentids=db.StringListProperty()#store list of comment ids

这样你就可以通过做直接得到评论

comment=Comment.get_by_key_name('commentkey')

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

4

2 回答 2

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)
于 2012-09-07T17:47:05.510 回答
0

实体的大小限制为 1MB。此外,实体最多可以有 5000 个索引条目,因此如果您commentids被索引,那么最大大小将为 5000 个条目。

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

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

于 2012-09-07T21:53:20.353 回答