0

我有,我通过以下迁移所产生的多态性参考的表:订单在多列索引的轨道的多态关联

def change     
    add_reference :table_name, :thing, polymorphic: true, index: true 
end 

当我跑的迁移它生成以下:

add_index "workflow_engine_task_bases", ["thing_type", "thing_id"], name: "index_workflow_engine_task_bases_on_thing_type_and_thing_id", using: :btree 

为什么最左边一列是thing_type?对我来说,这似乎并不理想,因为它不太具体。

回答

0

http://apidock.com/rails/v4.2.7/ActiveRecord/ConnectionAdapters/SchemaStatements/add_reference

在源代码中对add_reference

add_index(table_name, polymorphic ? [type id].map{ |t| "#{ref_name}_#{t}" } : "#{ref_name}_id", index_options.is_a?(Hash) ? index_options : {}) if index_options

它只是从一个数组,其中type是提前id映射。不知道为什么它是这样设计的,但用add_index代替它可能会更好。

add_index(:table, [:thing_id, :thing_type])

5

这是在轨道上的commit通过德里克之前的更新add_reference一种用于多态关联生成索引时id之前使用type。这一变化主要理由转载如下:在多列索引第一

使用类型列

add_reference当您使用 它来添加一个多态引用可以非常有益补充一个多列索引。但是, 索引中的第一列是id列,这并不理想。

的〔PostgreSQL的文档] [1]表示:

阿多列B树索引可以与查询条件 涉及索引的列的任意子集来使用,但该指数是最 效率时有前导(最左边) 列的限制。

的〔MySQL的文档] [2]表示:

MySQL能使用多列索引为测试在所有索引 列的查询或查询该测试仅仅是第一列中, 前两个列,前三列等等。如果您在索引定义中以正确的顺序指定 列,则单个 组合索引可以在同一个 表上加速多种查询。

在多态关系中,类型列更有可能是 作为索引中的第一列而非id列。也就是说,我是 更有可能查询没有id的类型,而不是查询id为 而没有类型。

[1]:http://www.postgresql.org/docs/9.3/static/indexes-multicolumn.html

[2]:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

我认为在大多数情况下,这种顺序是有道理的。它允许你有一个单一的索引,在包括typeidtype在内的查询中表现良好。尽管如此,根据您使用的数据库,数据集以及您计划运行的查询,您的用例可能会不同。您最好的选择是在生产转储中分析您最常见的使用案例,并相应地选择您的索引策略。