我正在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,这是RDBMS世界中的多对一关系吗?如果是这样,怎么样?
修改
Jaiku使用类似的东西
class StreamEntry(DeletedMarkerModel):
...
entry = models.StringProperty() # ref - the parent of this, should it be a comment
...
答案 0 :(得分:2)
首先,为什么不使用user = db.UserProperty()
代替user = db.StringProperty()
?
其次,我很确定你应该使用它的工作方式,并且更具可读性并在以后测试性能,原因有三:
因此,当您准备好进行衡量时,请启动优化。
我不是这样说的,因为我对RDBMS,No-SQL DBMS或Google Datastore性能优化一无所知,但是因为我通常从测试中获得了所有这些知识,这似乎与以前的假设相矛盾比我想象的还要好。
答案 1 :(得分:-2)
您可能需要查看a good tutorial on creating a php forum from scratch。当然,这是关于PHP的,但它也涵盖了论坛设计的一般概述。
基本上,不要拆分帖子和回复或帖子和帖子。稍后会导致一些非常尴尬的查询。线程只是一个不回复任何内容的帖子。