建模多态博客帖子

时间:2011-05-19 18:00:13

标签: ruby-on-rails database-design data-modeling

说我有一个blog_posts表。但是,撰写帖子的用户属于群组,每个群组都有自己的博客。

例如:

Say,用户属于3个组:Marketing,Project Alpha,Administrators

他创建了一篇博文,但希望该帖子能够出现在“营销博客”和“Project Alpha”博客中。

对此进行建模的最佳方法是什么?

在blog_posts表中添加一个字段是不错的主意,如:group_ids

并存储以逗号分隔的ID列表:3,7(其中Marketing Group = 3,Project Alpha = 7)

或者我应该创建另一个表并存储blog_posts id和groups吗?

感谢。

3 个答案:

答案 0 :(得分:1)

在@ minitech的回答基础上,我有3个模型和5个数据库表

<强>模型 rails g model <model_name>

  • 发布(必须有FK的列user_id)
  • 用户

附加表格 rails g migration <table_name>

  • groups_posts(仅限group_id和post_id列)
  • groups_users(仅限group_id和user_id列)

然后在您的模型中配置关系如下

class Post < ActiveRecord::Base
  has_and_belongs_to_many :groups
  belongs_to :user
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
  has_many :posts
end

class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :posts
end

然后根据您的示例,代码变为:

user = User.find(<id of user>)
post = Post.create(:title => 'foo', :content => 'bar', :user => user)
post.groups << Group.find(3)
post.groups << Group.find(7)

答案 1 :(得分:0)

我建议创建一个表来保存所有博客的所有帖子,然后有一个表来存储所有博客的信息,然后是一个表来存储所有博客的帖子,由ID引用。然后你只需添加,例如:

进入帖子:ID =(自动增量值),标题='标题',内容='内容'
进入博客帖子:blogID =(博客# 1 的ID以插入帖子),postID =(自上次的自动增量值)
进入博客文章:blogID =(博客的ID 2 以插入帖子),postID =(自上次的自动增量值)

这样,帖子就会被链接,所以当它被编辑或删除时,所有博客都会反映出更改,您还可以使用SELECT * FROM blogPosts WHERE postID=id_of_post等内容快速列出帖子所在的所有博客。< / p>

答案 2 :(得分:0)

使用逗号分隔列表作为使所有数据项成为原子的方法是一个坏主意。 它基本上是一种获取不是第一范式并且变换的数据的方式,因此它看起来像第一个普通表格数据,即使它不是。

如果这样做,对于某些查询,您将不得不对其中一个表进行全面扫描,而不是对索引查找进行全面扫描。这将是极其缓慢的,并且随着数据量的增加而变得更糟。

更好的解决方案是建立一个将group_id与user_id相关联的联结表。

 Create Table Group_user 
(group_id,
 user_id primary key is (gorup_id,  user_id))

然后在想要所有数据的同时进行三向连接。这是您建立多对多关系的基本方式。