【问题标题】:How do I organize/store a "type" field for a comments table?如何组织/存储评论表的“类型”字段?
【发布时间】:2010-08-27 01:49:34
【问题描述】:

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

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

type 字段将只是一个string,其内容将是其父表的名称。因此,对于 Article cmets,类型将是 article,例如。

这是处理comments 表的最佳方式吗?还是有其他更有效的方法来做到这一点?

【问题讨论】:

  • 我会为每种类型的 cmets 创建一个单独的 cmets 表,以便我可以轻松应用外键。

标签: ruby-on-rails database-design


【解决方案1】:

使用多态关联将是实现这一目标的最佳方式 - 查看 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 在设置多态 cmets 时很有用。希望对您有所帮助!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果一条评论不能应用于多个事物(同一条评论不能同时应用于一篇文章和一篇博文,或者两篇不同的文章),那么它为什么是基础实体?

      如果你愿意的话,我会有一个看起来像这样的评论表:

      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 等。

      【讨论】:

      • 主要原因是它看起来是多余的。这实际上与与它们相关的模型相同。
      • @shpigford:相同的列类型不等于冗余。如果有这种感觉,请克服这种感觉,它会导致您进行无根据的优化。如果文章评论在功能上(语义上)不同于博客评论,那么它应该有一个单独的表。代码查找表通常看起来也一样(名称、值对),但是将所有代码(汽车类型、发动机类型、油漆类型)放在一个表中,然后必须使用额外的“where type = car type”条件。
      【解决方案4】:

      我建议查看acts_as_commentable 之类的插件,并查看它们是如何实现的。或者直接使用插件。

      【讨论】:

        【解决方案5】:

        我觉得你的设计很不错。它简单易行。唯一的要求是行标识符的数据类型必须与 comment.parent_id 相同,以便您的联接保持一致。我实际上会在 cmets 表上为每种“类型”定义视图。例如,“create photo_cmets as select * from cmets where type = 'PHOTOS'”。然后您可以在 PHOTOS.PHOTO_ID = PHOTO_COMMENTS.PARENT_ID 上从 PHOTOS 加入到 PHOTO_COMMENTS,依此类推。

        您还可以创建一个超类型,例如小部件,并且您的每个照片、博客帖子等都可以是小部件的子类型。然后你可以限制你的 cmets 表对小部件表有一个 FK。然后可以将“类型”列移动到小部件表中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-22
          • 1970-01-01
          • 2020-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多