sql - has_many :through 的索引

标签 sql ruby-on-rails ruby database has-many

假设您有两个模型,User 和 City,由第三个模型 CityPermission 加入:

class CityPermission < ActiveRecord::Base
  belongs_to :city
  belongs_to :user
end

class City < ActiveRecord::Base
  has_many :city_permissions
  has_many :users, :through => :city_permissions
end

class User < ActiveRecord::Base
  has_many :city_permissions
  has_many :cities, :through => :city_permissions
end

目前,我使用以下迁移代码片段创建连接表和表索引:

create_table :city_permissions do |t|
      t.integer :user_id, :city_id
      t.other_fields ...
end

add_index(:city_permissions, :user_id)
add_index(:city_permissions, :city_id)

这些是要创建的最佳索引吗?这些索引是否允许通过连接表来回快速访问,以及在表本身内进行快速查找,还是有其他更好的方法?换句话说,给定 cityuser 是 City 和 User 类的实例变量,这些索引是否允许 city.userscity.city_permissionsuser.citiesuser.city_permissions 都表现得一样好吗?

最佳答案

我觉得不错。

生成的连接应该只是在实体表的 PK ID 上,或者在连接表中的 FK ID 上——它们都是索引。

查看生成的 ActiveRecord SQL 并将其与索引进行比较可能会很好。

根据您使用的数据库,您可以通过解释计划(或任何存在的工具,我在这里考虑 Oracle)运行该 SQL

为了简化您的代码,您可以考虑使用 has_and_belongs_to_many以及。这会让你摆脱 CityPermission 对象(除非你想用它来存储数据本身)

关于sql - has_many :through 的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/223804/

相关文章:

php - UPDATE JOIN,错误的数据插入

mysql - 删除重复记录需要太多时间

ruby-on-rails - Capybara 选择器匹配但不是所有过滤器,这是什么意思?

ruby - method_missing 中的 attr_accessor

ruby-on-rails - GraphQL Ruby N+1 批处理问题

sql - 如何在 SQL 中从整个数据库中查找特定值

mysql - 计算未查看帖子的数量

sql - 事件记录多个连接返回错误值和重复 Rails

ruby-on-rails - Rails 和 Authlogic。显示当前登录的用户

ruby-on-rails - Rails 4 在单独的 Controller 中搜索多个模型