has_many的索引:通过

jcn*_*ghm 7 ruby sql database ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

这些是创建的最佳指标吗?这些索引是否允许通过连接表来回快速访问,以及在表格内快速查找,还是有其他更好的方法?以不同的方式重申这一点,将这些指标,因为cityuser有级市和用户的实例变量,允许city.users,city.city_permissions,user.cities,和user.city_permissions所有同样表现出色?

mad*_*lep 4

在我看来很好。

生成的联接应该仅位于实体表的 PK ID 上,或者位于联接表中的 FK ID 上 - 这两者都是索引。

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

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

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