论坛首页 Ruby版 rails

Javaeye是以什么样的模型设计来实现圈子,BLOG,论坛互通的?

浏览 576 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
时间:2008-06-13
最近发现javaeye的圈子,博客,论坛是互通的。

BLOG里的文章,论坛里的帖子,圈子里的话题,都是等价的。

因为发现BLOG里的文章后面的回复,实际上会作为论坛里对应原帖子的留言。
论坛里的一些帖子,有时会被整楼移动到圈子里。

据此推测,圈子,BLOG,论坛在数据存储上使用了相同/相似的表结构。
或者根本就是存储在一张表里。

使用ActiveRecord的多态相关/单表继承对此进行处理。

这样就使得数据的处理很灵活。不过一般来说,通常意义上的BLOG,圈子,论坛的数据库表设计上是有一定差异的。

例如论坛可能是一个Topic对应多个Post的,楼主和回帖都作为这个Topic下面的Post。
在这里Topic没有Content,而多个Post是有Content并且等价的。

而BLOG里可能是一篇Blog对应多个Comment,在这里Blog有Content,Blog和Comment是不等价的。

圈子里可能又有比较杂乱的权限需求。

如果要实现互通的模型,以哪一种为准,而方便今后的扩展。这个问题需要考虑清楚。

例如如果想做成表/树论坛切换的形式,就必须在每个Post上面存储层级信息等。

根据我的考虑,大体来说可能从两种模型中选择其一来实现:

一,类论坛式存储:

# Table name: topics 主题表
#
#  id         :integer(11)     not null, primary key  主题id
#  user_id    :integer(11)     not null               主题创建者  
#

class Topic < ActiveRecord::Base
  belongs_to :user
  has_many :posts
  ...
end


# Table name: posts 帖子表
#
#  id             :integer(11)     not null, primary key  帖子id
#  topic_id :integer(11)     not null                     主题id
#  user_id        :integer(11)     not null               发帖人id
#  title          :string                                 标题
#  content        :text                                   正文
#

class GroupPost < ActiveRecord::Base
  belongs_to :topic
  belongs_to :user
  ...
end


发表话题时,在Topic表中插入一行,同时在Post表中插入一行。
topic仅仅用来关联post,本身无标题和正文

假设一个话题里面有N个帖子,对应的是Topic表的1行,Post表的N行。

这样做的优点是,post的查询、正文分析、处理等都会很方便。Post地位等价,可以改变位置,删除其中某一个等。
但缺点也很明显,例如如果要实现对楼主和回帖不同的评分机制,或者圈子里删除话题主贴连带删除整个话题的机制,都必须写额外的判断,而且这些判断很有可能要在View和Model上写两遍。


另一种实现就是类BLOG的存储方式:
# Table name: topics 主题表
#
#  id         :integer(11)     not null, primary key  主题id
#  user_id    :integer(11)     not null               主题创建者  
#  title      :string          not null               主题的标题
#  content    :text                                   主体的正文
#

class Topic < ActiveRecord::Base
  belongs_to :user
  has_many :posts
  ...
end


# Table name: posts 帖子表
#
#  id             :integer(11)     not null, primary key  帖子id
#  topic_id :integer(11)     not null                     主题id
#  user_id        :integer(11)     not null               发帖人id
#  title          :string                                 标题
#  content        :text                                   正文
#

class GroupPost < ActiveRecord::Base
  belongs_to :topic
  belongs_to :user
  ...
end


主要的区别就是Topic上也有title和content。

当增加一个话题时,只要在Topic表里插入一行即可。
以后增加的回复/评论都插入Post表。

假设一个话题里面有N个帖子,对应的是Topic表的1行,Post表的N-1行。

这样做的好处就是主贴和回帖,正文和评论区分得很清楚,不用额外的判断就可以进行一些权限相关的处理。
但是坏处就是,把本来应该等价的content分放在了两个表里,这样进行查询,搜索,分析时都可能会有一点麻烦。

更简单地说,我觉得,如果要实现BLOG,圈子,论坛的通用存储结构:
第一种方式的写入/修改麻烦而读取简单。
第二种方式的写入/修改简单而读取麻烦。

或者还有什么更合理的结构?

因为最近有这方面的需求,而在数据库设计上团队内部意见不统一,所以想看看大家的意见。
   
时间:2008-06-13
JavaEye的Blog和论坛是用相同的表结构,用单表继承,圈子是有自己独立的表
采用的设计是你说的第一种
   
1 请登录后投票
论坛首页 Ruby版 rails

跳转论坛:
JavaEye推荐