创建或初始化。如何最小化数据库和服务器的负载

问题描述 投票:0回答:1

我在 ruby on Rails 框架中用 ruby 编写。我无法理解假设的情况。 假设 get_date 函数返回一个包含大约 1000 万个元素的数组。每个元素包含字段:fk、名称、详细信息。 还有一个包含相同字段的表。它是部分填充的。 fk - 唯一索引字段。 我的任务是检查表中是否存在条目。如果没有记录,我必须创建一个。如果记录存在,我必须更新名称和详细信息字段,因为它们可能变得无关紧要。 我需要编写一些代码来尽可能少地加载数据库和服务器

我建议:

get_data.each do |item|
          field = MyField.find_or_initialize_by_fk(item['fk'])
          field.update_attributes(
              {
                  :name       => item['name'],
                  :detail    => item['detail']
              }
          )
          field.save
end

get_data.each do |item|
          field = MyField.find_or_create_by_fk(item['fk'])
          field.update_attributes(
              {
                  :name       => item['name'],
                  :detail    => item['detail']
              }
          )
end

这两个哪个更好?

ruby-on-rails ruby postgresql
1个回答
0
投票

第一个版本会更好,因为它只执行两个查询,一个用于查找可能存在的记录,另一个用于更新现有记录或创建新记录。

当没有找到现有记录时,第二个版本将向数据库发出三个请求:一个尝试查找记录,第二个创建新记录,第三个更新新创建的记录。

但是,我建议使用

upsert
,它仅在一个查询中插入新记录或更新现有记录:

get_data.each do |item|
  MyField.upsert(
    { fk: item['fk'], name: item['name'], detail: item['detail'] },
    on_duplicate: 'name = EXCLUDED.name, detail = EXCLUDED.detail',
    unique_by: :fk
  )
end
© www.soinside.com 2019 - 2024. All rights reserved.