Google App Engine - JSONProperty与单独模型

时间:2017-07-04 02:10:58

标签: google-app-engine

假设我有一个包含博客文章和评论的博客应用程序。让我们说,为了论证,可能会有大量的评论,足够大,简单的comments = StringProperty(repeated=True)是不够的。

我应该将注释存储为JSONProperty(从python列表序列化):

class BlogPost(ndb.Model):
  title = ndb.StringProperty()
  description = ndb.TextProperty()
  comments = ndb.JSONProperty()

或者我应该创建一个单独的Comment模型并将相应的blogpost的ID存储为属性:

class Comment(ndb.Model):
  text = ndb.TextProperty()
  blog_id = ndb.IntegerProperty()
  created = ndb.DateTimeProperty(auto_now_add=True)

我可以查询特定博客帖子的所有评论,如下所示:query = Comment.query(Comment.blog_id==blog_id).order(-Comment.created)

一种方法更可取吗?特别是如果评论可能变得非常大> 1000.

1 个答案:

答案 0 :(得分:1)

你肯定想要一个单独的评论模型。

一个原因是实体的大小限制为1MB。如果一个帖子收到大量评论,那么你就有超出限制的危险,你的代码就会崩溃。

另一个原因是您要考虑实体的读/写速率和可伸缩性。如果您使用JSON,则每次发表评论时都需要更新BlogPost实体。如果很多人同时写评论,那么您将需要交易并存在争用问题。如果您有一个单独的评论模型,那么您可以轻松扩展到每秒一百万条评论!