2017-07-04 81 views
1

假设我有一个博客文章和评论的博客应用程序。为了争论的缘故,可以有大量的评论,足够大以至于简单的comments = StringProperty(repeated=True)是不够的。Google App Engine - JSONProperty vs独立模型

我应存储的意见作为JSONProperty(从Python列表连载):

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

或者我应该干脆创建一个单独的评价模型和相应的网志文章的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

你一定想要一个单独的模型的意见。

原因之一是实体大小限制为1MB。如果一个帖子获得大量评论,那么您有可能超出限制,并且您的代码会崩溃。

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

+0

非常感谢!在评论模型中,如果我将blog_id属性设置为字符串,可以吗?出于某种原因,我在iOS中使用长数字iD出现错误。这不会有什么区别吗? – JK140

+0

不,无所谓,但为了简单起见,我会保留一个整数并修复iOS中发生的任何事情。 –