将外键放在rails模型belongs_to association中

时间:2012-02-08 18:59:50

标签: ruby-on-rails database associations

我是rails框架的初学者。我有一个基本问题。

我正在尝试定义一些模型及其关联,引用流行的rails指南。我的关联如下所示。

class Person < ActiveRecord::Base
  has_one :head
end

class Head < ActiveRecord::Base
  belongs_to :person
end

在这里,我需要在表格'head'中添加foreign_key(人的主键)。

现在,如果我需要获得'人'的'头',则rails需要扫描头表并匹配person_id。

我认为直接的方法是在'person'表中添加外键。然后我可以用'ID'直接引用'人'的'头'。

看来rails约定对性能不友好。我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:5)

创建迁移以添加包含外键的列时,强烈建议此列上的add an index。这样,数据库将有效地从person_id中找到头部(与id一样有效搜索)。

add_index :heads, :person_id

如果它是一对一关联,您甚至可以添加unique选项(除非您的应用程序接受连体双胞胎:-)):

add_index :heads, :person_id, :unique => true

我建议你看一下这篇关于在哪里使用索引的文章:

答案 1 :(得分:1)

Re:看来rails约定对性能不友好。我在这里错过了什么吗?

是。 Rails专为生产现场而设计。所以它包含许多性能特征。正如@Baldrick所说,您特别关注的答案是始终为外键字段添加索引。

出于性能原因,对于任何SQL dbms应用程序,无论语言如何,都需要为每个外键字段添加索引。请注意,索引将添加到数据库,而不是MVC层(Rails)。

Rails本身包含其他性能功能,包括sql结果缓存,可选片段和页面缓存等。

Rails 3.2包含slow query features。这些使Rails能够自动显示缓慢的查询。然后,您可以根据需要集中精力修复它们。