Я пишу простое похожее на форум приложение в Google App Engine и пытаюсь избежать проблем с масштабируемостью. Я новичок в этом подходе, не связанном с RBDMS, и я хотел бы избежать ловушек с самого начала.
Дизайн форума довольно прост, посты и ответы будут единственными понятиями. Как лучше всего подойти к проблеме, если на форуме миллионы постов?
Модель пока (лишена бесполезных свойств):
class Message(db.Model):
user = db.StringProperty() # will be a google account user_id
text = db.TextProperty() # the text of the message
reply_to = db.SelfReferenceProperty() # if null is a post, if not null a reply (useful for reply-to-reply)
Разделение модели, я думаю, что это быстрее, потому что она будет запрашивать меньше элементов при извлечении "всех сообщений":
class Post(db.Model):
user = db.StringProperty() # will be a google account user_id
text = db.TextProperty() # the text of the message
class Reply(db.Model):
user = db.StringProperty() # will be a google account user_id
text = db.TextProperty() # the text of the message
reply_to = db.ReferenceProperty(Post)
Это отношение многие-к-одному в мире СУБД, следует ли использовать ListProperty вместо этого? Если да, то как?
Изменить:
Джайку использует что-то вроде этого
class StreamEntry(DeletedMarkerModel):
...
entry = models.StringProperty() # ref - the parent of this, should it be a comment
...