为什么Rails模型关联需要索引

时间:2015-07-15 00:44:56

标签: ruby-on-rails ruby database model associations

我对模型关联中索引列的主题感到有点困惑。

(来自 The Rails 4 Way )我们有UserTimesheetExpense Report模型。

User型号:

has_many: timesheets
has_many: expense_reports

(以及其他模型中相应的belongs_to

Rails 4 Way 一书向add_indextimesheets模型expense_reports说:

add_index :timesheets, :user_id
add_index :expense_reports, :user_id

我不理解在每个外键列之后添加索引的原因。 timesheetexpense_report表已经有primary_key列,那么为什么不能用于"性能提升?"添加两个额外的索引对我来说似乎多余了有人可以解释这个好处吗?

1 个答案:

答案 0 :(得分:1)

我可以看到你的挫折来自何处,只需跟随,我相信你会很快得到它......

问题:

在数据库中创建列时,考虑是否需要查找和检索该列中的记录至关重要。因此,假设我们有一个用户表,并且每个用户都有一个电子邮件,在许多应用程序中用于身份验证和授权。当我们允许用户登录我们的应用程序时,我们需要找到与提交的电子邮件地址相对应的用户记录。 不幸,通过电子邮件地址查找用户的唯一方法是浏览数据库中的每个用户行,并将其电子邮件属性与给定的电子邮件进行比较 - 因此,这意味着我们可能需要检查每个用户row(因为用户可以是数据库中的最后一个人)。这可能会花费很多时间,你可以想象。简单来说,这并不好。

解决方案:

在电子邮件列上添加索引可解决问题。把它想象成本书末尾的附录。在一本书中,为了找到给定字符串的所有出现,比如说“foobar”,你必须扫描每一页的“foobar” - 全表扫描的纸质版本。另一方面,使用书籍索引,您只需在索引中查找“foobar”即可查看包含“foobar”的所有页面。数据库索引的工作方式基本相同。

我希望这可以帮助你。