Ruby on rails Rails 4/Postgresql:更好的读/写查询性能空与字符串

Ruby on rails Rails 4/Postgresql:更好的读/写查询性能空与字符串,ruby-on-rails,postgresql,ruby-on-rails-4,Ruby On Rails,Postgresql,Ruby On Rails 4,我有一个postgresql 9.4专栏“交易状态” 在创建交易(模型)时,我必须在以下两个选项之间决定属性/列“交易状态”: 要么什么都不做,让值为null(要么为空,不知道什么都不说时Rails中会发生什么)。当用户进行交易时,我会将值从NULL更改为字符串('deal\u take') 或者在列中指定默认值“deal\u not\u Take”。当用户进行交易时,我会将值从字符串('deal\u not\u not\u take')更改为另一个字符串('deal\u take') 我有

我有一个postgresql 9.4专栏“交易状态”

在创建交易(模型)时,我必须在以下两个选项之间决定属性/列“交易状态”:

  • 要么什么都不做,让值为null(要么为空,不知道什么都不说时Rails中会发生什么)。当用户进行交易时,我会将值从NULL更改为字符串('deal\u take')

  • 或者在列中指定默认值“deal\u not\u Take”。当用户进行交易时,我会将值从字符串('deal\u not\u not\u take')更改为另一个字符串('deal\u take')

我有大量的行,所以我正在研究更多的性能

我有一个名为“show\u deals\u available”的方法,其中涉及一个postgresql查询,我正试图对其性能进行优化,因为它会经常出现:

那么,当postgresql“执行”下面的查询时,它的最佳/最快/最高效是什么:

1。选项1:创建交易时,不为交易状态属性提供任何默认值(因此其值为空值);然后像这样查询:

controller/deals\u controller.rb

def show_deals_available
    @deal = Deal.friendly.find params[:id]
    @available_deal = Deal.where('deal_id = ? AND deal_status is NULL',
                             @deal.id).first  
    respond_to do |format|
      format.js 
    end
  end
2。选项2:在创建交易时,提供一个字符串作为默认值:'deal\u not\u take';并进行以下查询:

controller/deals.rb

def show_deals_available
    @deal = Deal.friendly.find params[:id]
    @available_deal = Deal.where('deal_id = ? AND deal_status = ?',
                             @deal.id, "deal_not_yet_taken").first  
    respond_to do |format|
      format.js 
    end
  end
另外,也许答案看起来更复杂。事实上,上述两个选项之间的选择也可能受到写入的影响:当我必须将值更改为“deal_take”时,是否将表单字符串更改为另一个字符串,而不是将表单NULL更改为字符串


请注意,我使用的是active record,但对于postgresql,这个问题仍然是正确的(将来我可能会切换到原始postgresql)。

Rails本质上是在底层语言和db层之上进行抽象的。因此,这总是会对速度和性能造成影响。然而,在大多数情况下,它是可管理的。在创纪录的情况下,这场演出的成功将真正开始产生影响。但一般来说,布尔值更快,因此,如果您可以添加一个名为“可用”的字段,而不是搜索字符串deal_status search for available==true,那么您的查询速度会更快。非常好的建议,谢谢,看起来很合逻辑,但对于新手,我甚至不知道“布尔值”与字符串计算相比,过程更容易访问/更快。谢谢访问数据库的开销比处理单个布尔值或字符串的开销高得多。因此,您应该使用更自然的方式来表示您的问题。可用的true/false非常好,并且易于理解:)