求一个“评论盖楼”的设计思路,系统设计高手进

可以参考一下网易的新闻的评论系统,如
http://comment.news.163.com/news2_bbs/5BRE0I4400012Q9L.html#mainReplies

这种盖楼的效果,数据库和页面展示是怎么做的?
还要方便能删除任何一层的评论。

一种方案是把整个楼层内容存在数据库的一个字段中,可这样一来不好删除了。
如果不这么做的话,查询的时候又很难查。

[b]问题补充:[/b]
没有说清楚,如果不考虑性能的问题,问题似乎变的无比的简单。

但是问题在于,拿新浪的新闻评论说吧,平均每篇新闻的评论数绝对超过1000。
每天发的新闻数量级也在过千。
浏览访问量更是无比的巨大,在这种情况下,评论系统如何设计 ,才会成为一个难题。

我需要做的负载能力当然没有新浪那么强,但是性能指标也是很恐怖的,所以才觉得被一个看似简单的问题给难住了。

[quote]如果性能非常重要,这个方式是很有意义的,
引用
最简单、最高效的方式是用文件来存储每一个楼,每个新闻一个楼,使用xml、json等树形结构的文件格式来规范评论和新闻内容。这样每进一个楼只需要访问一个文件,发评论只是创建一个文件,把楼盖高,只是给增加新内容。而新闻列表可以存储在数据库中,也可以用lucene做索引。

而且新闻列表一定是用lucene做索引。
新闻首页一定不是直接查询数据库,而是静态化该页面。在后台做一个轮训器,定期更新这个静态页,如果有重大新闻发生,强制更新该页面。
新闻内容、评价页静态化或者单文件处理,能极大降低服务器压力,毕竟没有数据库操作。每天一个目录,或者每小时一个目录,在文件存储方面就不会对文件系统形成较大压力。[/quote]
至于数据压力,用数据库的话,可以分拆为每年、每个月再或者每周一个新闻库,只需要每次新增一个库即可。具体的处理方式就要看你用的数据库。
某些情况下,将当月、重点的新闻单独提炼出来静态页面项目,需要对当月、重点的新闻做大规模的负载均衡,对其他不重要新闻则使用普通的方式。

新闻内容如果静态化
优势:可以使用apache甚至lighttpd、nginx服务器,对应的处理压力的能力较强。
方式:可以用新闻内容本身+新闻模版生成静态的新闻文件,在新闻文件上用ajax异步加载新闻的评论。
缺点:新闻页面上的其他因素成为开发起来比较麻烦的东西,比如广告、相关文章链

新闻内容如果不静态化
缺点:使用的服务器受到你的系统的架构的影响,处理压力的能力受限。
方式:可以将该新闻的内容、评论等相关因素放在一个xml里面,访问该新闻时仅仅读一个新闻xml,仅一次读IO,性能上不会有较大压力。前端可以再加一个集中式缓存(比如memcached),将读的次数非常多的新闻存在缓存中,进一步减少IO数。
有点:灵活。

不就是一个递归么?
更新parentId而已

数据库就类似于有一个父ID的关联字段,好多的树形结构就都是这么设计的。所有的评论都有一个主题记录的ID外键关联字段(父ID),这样不就有了这个层级关系。

前段时间做了一个论坛,差不多实现了类似的效果.
数据库方面是新闻是一张主表,评论是他的子表,同一篇新闻的评论都有一个评论顺序字段.前台显示就是要做一个引用评论功能,点击引用后将相应的评论用js动态加载到评论框中,然后用一些标签来隔开以达到盖楼效果.
我是用SSH做的,配置文件可以给你参考一下.


//关联主键

//评论顺序


这样的需求其实挺特殊,每个“楼”都是一个独立的“树”,每个“楼”都“几乎”不用依赖其他的“楼”。
最简单、最高效的方式是用文件来存储每一个楼,每个新闻一个楼,使用xml、json等树形结构的文件格式来规范评论和新闻内容。这样每进一个楼只需要访问一个文件,发评论只是创建一个文件,把楼盖高,只是给增加新内容。而新闻列表可以存储在数据库中,也可以用lucene做索引。

如果一定要用数据库实现,那么新闻(主贴)做一张表,评论(回贴)做一张表,评论表中添加新闻id字段作为与新闻表的外键关联即可。如果要进一步完善树形结构,评论表上补充一个指回评论表的外键即可。[quote="ywbanm"]不就是一个递归么?
更新parentId而已[/quote]

提高性能总是有各种各样的手段,不要让它左右你的设计

提高性能的话,好象都是在加载新闻的时候不加载评论,点击评论才能出来评论页面.然后再采用分页显示.

如果性能非常重要,这个方式是很有意义的,
[quote]最简单、最高效的方式是用文件来存储每一个楼,每个新闻一个楼,使用xml、json等树形结构的文件格式来规范评论和新闻内容。这样每进一个楼只需要访问一个文件,发评论只是创建一个文件,把楼盖高,只是给增加新内容。而新闻列表可以存储在数据库中,也可以用lucene做索引。 [/quote]

而且新闻列表一定是用lucene做索引。
新闻首页一定不是直接查询数据库,而是静态化该页面。在后台做一个轮训器,定期更新这个静态页,如果有重大新闻发生,强制更新该页面。
新闻内容、评价页静态化或者单文件处理,能极大降低服务器压力,毕竟没有数据库操作。每天一个目录,或者每小时一个目录,在文件存储方面就不会对文件系统形成较大压力。

朋友,问题要自动关闭啦,结分哦

哥们给分了啊,问题要被关闭了~

怎么不喜欢结贴子呀?