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在內的查詢中表現良好。儘管如此,根據您使用的數據庫,數據集以及您計劃運行的查詢,您的用例可能會不同。您最好的選擇是在生產轉儲中分析您最常見的使用案例,並相應地選擇您的索引策略。