ruby-on-rails - 为什么 Rails Model Association 需要索引

标签 ruby-on-rails ruby database model associations

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

(来自The Rails 4 Way)我们有用户时间表费用报告模型。

用户模型:

has_many: timesheets
has_many: expense_reports

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

The Rails 4 Way 书中提到将 add_index 添加到 timesheetsexpense_reports 模型中,如下所示:

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

我不明白在每个外键列后添加索引的原因。 timesheetexpense_report 表已经有一个 primary_key 列,那么为什么不将其用于“性能嘘声”呢?添加两个额外的索引对我来说似乎多余?谁能解释一下它的好处吗?

最佳答案

我知道你的挫败感来自哪里,只要跟着做,我相信你很快就会明白......

问题:

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

解决方案:

在电子邮件列上放置索引可以解决该问题。将其视为本书末尾的附录。在书中,要查找给定字符串(例如“foobar”)的所有出现位置,您必须扫描每一页以查找“foobar”——全表扫描的纸质版本。另一方面,使用图书索引,您只需在索引中查找“foobar”即可查看包含“foobar”的所有页面。数据库索引的工作原理本质上是相同的。

希望这对您有所帮助。

关于ruby-on-rails - 为什么 Rails Model Association 需要索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31419689/

相关文章:

ruby-on-rails - 设计 sign_in_and_redirect 导致 rspec 测试失败

javascript - JSON 上设置的转义符和撇号通过 Rails 传递给 JS

ruby-on-rails - Rails 如何修复格式错误的请求(错误代码 400)?

ruby-on-rails - rails3 devise - 没有路由匹配 "/sessions/user"

ruby - Rspec 测试 : it { should respond_to() }

sql-server - MS SQL Server 2008 - 从 MySQL 迁移时出现困惑 re : "select XYZ from TABLE"

sql - 随着表子项中记录数量的增加,DELETE FROM 表变得很重

cassandra - 通过 cqlsh 请求对 Cassandra 执行减法的最佳方法是什么?

ruby-on-rails - Rails - 仅查找存在 has_many 关联记录的记录

ruby-on-rails - 获取两个事件记录关系的交集,rails