JK140
JK140

Reputation: 785

Google App Engine - JSONProperty vs Separate Model

Say I have a blog app with blog posts and comments. Lets say for the sake of argument that there can be a very large number of comments, big enough that a simple comments = StringProperty(repeated=True) would be insufficient.

Should I store the comments as a JSONProperty (serialized from python list):

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

Or should I create a separate Comment model altogether and store the corresponding blogpost's ID as a property:

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

And I can query for all the comments of a specific blogpost as follows: query = Comment.query(Comment.blog_id==blog_id).order(-Comment.created)?

Is one approach preferable? Especially if comments could get very large > 1000.

Upvotes: 1

Views: 72

Answers (1)

minou
minou

Reputation: 16563

You definitely want a separate model for comments.

One reason is that entities are limited to 1MB in size. If one post gets a huge number of comments, then you are in danger of exceeding the limit and your code would crash.

Another reason is that you want to consider read/write rates for entities and scalability. If you use JSON, then you need update the BlogPost entity every time a comment is made. If a lot of people are writing comments at the same time, then you will need transactions and have contention issues. If you have a separate model for comments, then you can easily scale to a million comments per second!

Upvotes: 1

Related Questions