我是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约定对性能不友好。我在这里错过了什么吗?
答案 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能够自动显示缓慢的查询。然后,您可以根据需要集中精力修复它们。