【问题标题】:Is good idea to create two separate tables which have similar structure in postgres?在 postgres 中创建两个具有相似结构的单独表是个好主意吗?
【发布时间】:2012-06-20 07:26:52
【问题描述】:

我正在使用 postgres db 开发 Rails 应用程序。我有一个名为 Mercer_review_votes 的表,其中架构是

-------------------------------------------------- 编号 |整数 用户 ID |整数 商家评论 ID |整数 价值 |整数 created_at |没有时区的时间戳 更新时间 |没有时区的时间戳 --------------------------------------------------

我正在创建另一个涉及投票的部分(比如产品),创建另一个类似的架构或修改代码并仅使用一个表是个好主意。 如果只有一张表,架构的外观如何?我会面临什么样的问题..

【问题讨论】:

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


    【解决方案1】:

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

    但我缺少对在您的表定义中查看的存储的引用。如果您需要它(这很有可能,否则您将不知道评论属于哪个商店或产品),您可能最好有两个表。一个带有 store 表的外键,一个带有 product 表的外键。

    【讨论】:

    • 谢谢 ..我想使用作为投票值的值将是 1 或 -1 所以如果在同一个表中添加另一个外键说 product_id 。如果 product_id 存在,我们可以知道投票给产品,反之亦然。但我的另一个担心是可以保持 Mercer_review_id 或 product_id 为零@a_horse_with_no_name
    【解决方案2】:

    这听起来像是 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 列保存“可审查”对象的类名,reviewable_id 保存它的 id。在迁移中,您可以使用以下方法创建这些列:

     t.references :reviewable, :polymorphic => true
    

    【讨论】:

    • 感谢 Nate 正是我想要的。
    【解决方案3】:

    这对于 SO 来说可能过于开放,但这是我的看法:这取决于!

    有时它是有道理的。我不喜欢全局注释表。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 2016-08-13
      • 1970-01-01
      • 2015-07-12
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多