我应该对这些ActiveRecord关系使用LIKE查询吗?

时间:2016-05-09 16:29:29

标签: ruby-on-rails ruby postgresql rails-activerecord

假设我有一个带有2组复选框的单一网页表单用户界面。通过设置1复选框,我可以查看我想要的培训师(“杰森”,“亚历山德拉等”)通过设置2复选框,我可以查看我想看到的动物(“老虎”,“熊”,等一旦我提交了带有这些选项的表格,我会找回符合条件的动物园列表(让我们假设所有的动物园都在所有动物园工作,所有的动物都在动物园里供讨论)

我们将按“名称”运行我们的数据库查询(例如,使用培训师名称和动物名称进行搜索,而非数据库ID)

假设我们使用的Postgres数据库有数十万行(如果不是数百万行)。

  1. 使用“ILIKE”查询进行搜索效率更高,还是更好地进行标准联接查询(例如Zoo.includes(:animals, :trainers).where("animals.name = ? and trainers.name = ?", animal_names, trainer_names)
  2. 有没有比我刚才在#1中展示的更好的方式?
  3. 模型设置

    class Zoo < ActiveRecord::Base 
      has_many :animals, through: zoo_animals
      has_many :trainers, through: zoo_trainers
      has_many :zoo_trainers
      has_many :zoo_animals
    end  
    
    class Animal < ActiveRecord::Base
      has_many :zoos, through :zoo_animals
      has_many :zoo_animals
    end  
    
    class Trainer < ActiveRecord::Base
      has_many :zoos, through :zoo_trainers 
      has_many :zoo_trainers
    end  
    
    class ZooAnimal < ActiveRecord::Base
      belongs_to :animal
      belongs_to :zoo
    end
    
    class ZooTrainer < ActiveRecord::Base
      belongs_to :zoo
      belongs_to :trainer
    end
    

    编辑:假设我无法访问数据库ID。

1 个答案:

答案 0 :(得分:1)

LIKE '%Jason%'效率低于查询确切的字符串&#39; Jason&#39; (或查询ID),因为虽然LIKE的精确比较和某些用法可以在要查询的列上使用索引LIKE with a pattern beginning with a wildcard can't use an index

然而,性能并不像这里最重要的考虑因素。在合理负载下,LIKE %Jason%在合理大小的数据库上仍然可能足够快。如果应用程序确实需要通过子字符串搜索事物(这意味着搜索可能有多个结果),那么这个要求就不能通过简单的相等来满足。

搜索文本的解决方案数量不断增加,包括Postgres内置全文搜索和Elasticsearch等外部解决方案。如果没有具体的扩展要求,我会选择LIKE,直到它开始变慢,然后才会投入更复杂的事情。