在postgres中创建两个具有相似结构的独立表是个好主意吗?

时间:2012-06-18 10:24:57

标签: ruby-on-rails postgresql ruby-on-rails-3.1 schema

我正在使用postgres db的rails应用程序。我有一个名为merchant_review_votes的表,其中schema是

--------------------------------------------------
 id                  | integer 
 user_id             | integer 
 merchant_review_id  | integer
 value               | integer
 created_at          | timestamp without time zone
 updated_at          | timestamp without time zone
--------------------------------------------------

我正在创建一个涉及投票的另一个部分(比如产品)是一个好主意,创建一个类似于此的另一个模式或修改代码并只使用一个表。 如果只有一个表,架构将如何看?我可以面对什么样的问题..

3 个答案:

答案 0 :(得分:1)

如果两个评论都包含完全相同的信息,那么我会选择一个包含“review_type”列的表。对于商店评论,该列将包含产品评论的“商店”,该列将包含“产品”。

但我错过了对表定义中审核的存储的引用。如果您需要(很可能,否则您不知道评论所属的商店或产品),您最好有两张桌子。一个带有商店表的外键,一个带有产品表的外键。

答案 1 :(得分:0)

对于Polymorphic Association来说,这听起来很合适。

class Review < ActiveRecord::Base
  belongs_to :user
  belongs_to :reviewable, :polymorphic => true
end

class Merchant < ActiveRecord::Base
  has_many :reviews, :as => :reviewable
end

class Product < ActiveRecord::Base
  has_many :reviews, :as => :reviewable
end

然后,您可以分别致电@merchant.reviews@product.reviews以获取商家和产品的评论。您可以调用@review.reviewable来获取已审核的对象。

多态关联基于如下的表结构:

--------------------------------------------------
  id                  | integer 
  user_id             | integer 
  reviewable_id       | integer
  reviewable_type     | string
  value               | integer
  created_at          | timestamp without time zone
  updated_at          | timestamp without time zone
--------------------------------------------------

reviewable_type列包含&#34;可审核的&#34;的类名。对象和reviewable_id拥有它的ID。在迁移中,您可以使用以下命令创建这些列:

 t.references :reviewable, :polymorphic => true

答案 2 :(得分:0)

对于SO来说,这可能过于开放了,但在这里;我的看法:它取决于它!

有时它是有道理的。我不是全球笔记表的粉丝。

一般来说,我认为值得避免这种情况,但是当你必须这样做时,让两个表继承一个没有记录的共同基础可以大大简化管理。