我对模型关联中的索引列主题有点困惑。
(来自The Rails 4 Way)我们有用户
、时间表
和费用报告
模型。
用户
模型:
has_many: timesheets
has_many: expense_reports
(以及其他模型中相应的 belongs_to
)
The Rails 4 Way 书中提到将 add_index
添加到 timesheets
和 expense_reports
模型中,如下所示:
add_index :timesheets, :user_id
add_index :expense_reports, :user_id
我不明白在每个外键列后添加索引的原因。 timesheet
和 expense_report
表已经有一个 primary_key
列,那么为什么不将其用于“性能嘘声”呢?添加两个额外的索引对我来说似乎多余?谁能解释一下它的好处吗?
最佳答案
我知道你的挫败感来自哪里,只要跟着做,我相信你很快就会明白......
问题:
在数据库中创建列时,考虑是否需要从该列中查找和检索记录至关重要。因此,假设我们有一个用户表,每个用户都有一个电子邮件,在许多应用程序中用于用户的身份验证和授权。当我们允许用户登录我们的应用程序时,我们需要找到与提交的电子邮件地址对应的用户记录。 不幸的是,通过电子邮件地址查找用户的唯一方法是扫描数据库中的每个用户行并将其电子邮件属性与给定的电子邮件进行比较 - 因此,这意味着我们可能必须检查每个用户行(因为用户可以是数据库中的最后一个人)。正如您可以想象的那样,这将花费大量时间。简单地说,这不好。
解决方案:
在电子邮件列上放置索引可以解决该问题。将其视为本书末尾的附录。在书中,要查找给定字符串(例如“foobar”)的所有出现位置,您必须扫描每一页以查找“foobar”——全表扫描的纸质版本。另一方面,使用图书索引,您只需在索引中查找“foobar”即可查看包含“foobar”的所有页面。数据库索引的工作原理本质上是相同的。
希望这对您有所帮助。
关于ruby-on-rails - 为什么 Rails Model Association 需要索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31419689/