说我有一个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吗?
感谢。
答案 0 :(得分:1)
在@ minitech的回答基础上,我有3个模型和5个数据库表
<强>模型强>
rails g model <model_name>
附加表格
rails g migration <table_name>
然后在您的模型中配置关系如下
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))
然后在想要所有数据的同时进行三向连接。这是您建立多对多关系的基本方式。