假设您有两个模型,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)
这些是要创建的最佳索引吗?这些索引是否允许通过连接表来回快速访问,以及在表本身内进行快速查找,还是有其他更好的方法?换句话说,给定 city
和 user
是 City 和 User 类的实例变量,这些索引是否允许 city.users
, city.city_permissions
、user.cities
和 user.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/