关系数据库中的Active记录连接是否是开销?

时间:2016-06-20 21:32:21

标签: ruby-on-rails join activerecord orm relational-database

我对ORM ActiveRecord 关系数据库(例如在Rails中)有疑问:

我很困惑,连接(例如内部连接)不会发生在数据库层中,如果我是正确的,ActiveRecord会进行多次查询,然后自己加入记录......

这不是开销吗? Ruby正在做数据库的工作!
我错了吗? 任何建议表示赞赏。

我正在练习Rails,并想知道为什么数据库本身没有定义外键如下:

MySql view with no foreign key defined

谢谢。

2 个答案:

答案 0 :(得分:0)

默认情况下,Rails在加载关联时很懒惰。

e.g。

users = User.where(id: [1768, 1769, 1770])

将致电

SELECT `users`.* FROM `users`  WHERE `users`.`id` IN (1768, 1769, 1770)

现在,对于每一个,如果你要求user.company(例如),将再次为相应的公司查询数据库。

ActiveRecord还允许您在数据库端为查询进行连接,并使其在数据库端运行。 e.g。

User.joins(:company).where(companies: {id: 5})

将致电

SELECT `users`.* FROM `users` INNER JOIN `companies` ON `companies`.`id` = `users`.`company_id` WHERE `companies`.`id` = 5

您还可以在一个查询中加载一组记录,并在一个额外查询中加载所有关联:

users = User.where(id: [1768, 1769, 1770]).includes(:company)

将最终加载用户,然后加载公司

SELECT `users`.* FROM `users`  WHERE `users`.`id` IN (1768, 1769, 1770)
SELECT `companies`.* FROM `companies`  WHERE `companies`.`id` IN (5, 1)

现在对于每个加载的用户,例如,询问users[0].company将使用已加载的关联,并且不会命中数据库。

答案 1 :(得分:0)

正确答案:
一段时间后,我意识到可以为迁移中的foreign_key数据库字段定义reference,因此Active Record使用inner join进行查询。

create_table :houses do |t|  
      ...  
      t.references :house_type, foreign_key: true, index: true, null: false 
      ...    
end
相关问题