可选字段的数据库设计

时间:2014-08-18 04:18:34

标签: ruby-on-rails postgresql database-design

我有3张桌子:

  1. 订单
  2. line_items
  3. 产品
  4. 他们设置为:

      

    订单有很多产品 line_items

    这允许我在 line_items 中存储诸如product_id,数量,购买时的价格,折扣等等......

    一切都很顺利。

    我希望实现的目标:

    我现在需要某些产品具有用户可更改的状态。这意味着在处理订单后的某个时间点,购买产品状态可以从一种状态更改为另一种状态。

    产品表有一个可状态布尔字段,用于跟踪所述产品是否支持状态。

    问题:

    我是否只需在line_items中添加状态字段?只有少量的产品需要一个状态,所以感觉就像浪费,但我不确定如何处理这个障碍。我主要担心的是,随着应用程序的增长,特定产品需要额外的可选字段,我最终会得到一张大表。

1 个答案:

答案 0 :(得分:0)

有两种选择:

  
      
  1. 在联接模型中创建一列
  2.   
  3. 创建单独的"状态"表,可用于创建特定的状态更新
  4.   

-

<强>属性

我个人会在联接模型中创建一个列以支持status。是的,它将要求您为每个line_item添加该列,但它将使该过程更简单,并且在没有大量问题的情况下提供可扩展性

您最好使用其中一个state machine宝石(state_machineaasm_state)来提供:

#app/models/line_item.rb
Class LineItem < ActiveRecord::Base
  include AASM

  aasm do
    state :active, :initial => true
    state :inactive

    event :activate do
      transitions :from => :inactive, :to => :active
    end

    event :deactivate do
      transitions :from => :active, :to => :inactive
    end
  end
end

这将使您能够直接影响line_item模型的状态

-

关联模式

或者,您可能想要创建不同的表/模型:

#app/models/line_item_status.rb
Class Status < ActiveRecord::Base
   #field id | line_item_id | status | created_at | updated_at
   belongs_to :line_item
end

#app/models/line_item.rb
Class LineItem < ActiveRecord::Base
   has_one :status
   delegate :status, to: :status #-> allows you to call @line_item.status
end

这样您就可以设置每个产品的状态,只需为每个status

包含一个line_item,从而提高数据表的效率