如何组织/存储评论表的“类型”字段?

时间:2010-08-26 16:29:10

标签: ruby-on-rails database-design

我的应用程序包含大约六种不同类型的用户可以评论的项目(文章,照片,视频,用户个人资料,博客帖子,论坛帖子)。

我现在的计划是在我的数据库中有一个comments表,然后在表格中有parent_idtype个字段。

type字段只是string,其内容将是其父表的名称。因此,对于文章评论,类型将是article,例如。

这是处理comments表的最佳方法吗?或者还有其他更有效的方法吗?

5 个答案:

答案 0 :(得分:2)

使用多态关联将是实现此目标的最佳方式 - 查看关于主题的Ryan railscast(或http://asciicasts.com/episodes/154-polymorphic-association处的ASCIIcast)。我想你最终会得到类似的东西:

class Comment < ActiveRecord::Base

  belongs_to :commentable, :polymorphic => true
  belongs_to :user

end

然后,您希望用户能够评论的每个模型都有以下行:

has_many :comments, :as => :commentable

我还发现this post在设置多态注释时很有用。希望有所帮助!

答案 1 :(得分:1)

您所描述的是一种称为多态关联。 Rails可以处理开箱即用,请看这一集: http://railscasts.com/episodes/154-polymorphic-association

答案 2 :(得分:0)

如果评论不能适用于多个内容(相同的评论既不适用于文章和博客文章,也不适用于两篇不同的文章)那么为什么它是基础实体?

如果你致力于此,我会有一个看起来像这样的评论表:

COMMENT_ID
COMMENT_BODY
USER_ID
DATE
ARTICLE_ID references ARTICLE on delete cascade
BLOG_POST_ID references BLOG_POST on delete cascade
... etc

然后有一个约束,说只有一个父母可以申请。

另一种方法是为每个基本实体提供一个COMMENT表,因此你有ARTICLE_COMMENTS,BLOG_POST_COMMENTS等等。

答案 3 :(得分:0)

我建议查看像acts_as_commentable这样的插件,并查看它们是如何实现的。或者只是使用插件。

答案 4 :(得分:0)

我认为你的设计非常好。它简单易行。唯一的要求是行标识符的数据类型必须与comment.parent_id相同,以便您的连接是一致的。我实际上会在每个'类型'的注释表上定义视图。例如,“将photos_comments创建为select * from comments where type ='PHOTOS'”。那么你可以在PHOTOS.PHOTO_ID = PHOTO_COMMENTS.PARENT_ID上从PHOTOS加入PHOTO_COMMENTS,依此类推。

您还可以创建一个超类型的小部件,每个照片,blog_post等都可以是小部件的子类型。然后,您可以约束您的注释表,使其具有FK到窗口小部件表。然后可以将“类型”列移动到窗口小部件表。