浏览 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,圈子,论坛的通用存储结构: 第一种方式的写入/修改麻烦而读取简单。 第二种方式的写入/修改简单而读取麻烦。 或者还有什么更合理的结构? 因为最近有这方面的需求,而在数据库设计上团队内部意见不统一,所以想看看大家的意见。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-06-13
JavaEye的Blog和论坛是用相同的表结构,用单表继承,圈子是有自己独立的表
采用的设计是你说的第一种 |
|
| 返回顶楼 | |





