2012-04-26 57 views
2

這是一種常見的DB設計問題。如果有一個關聯實體表(即交叉引用)包含基本上由兩個FK引用組成的記錄,它是否應以某種方式進行索引?是否有必要明確索引該表,因爲關聯表中的PK已按定義編入索引?如果需要索引它,它應該是一個組合索引,由兩個FK字段組成?DB關聯實體和索引

+0

難道你在這裏發佈一個示例表結構嗎? – vyegorov 2012-04-26 15:15:53

+2

@vyegorov:我認爲我們需要的所有信息已經在這裏。 – 2012-04-26 15:17:51

回答

3

其他表中引用的pk列上的索引不包括它。

通過將「關聯實體」表的兩個fk列定義爲複合主鍵(在大多數情況下應該如此(假設關聯是唯一的)),可以隱式創建多列索引。

涵蓋所有涉及的查詢或最佳列
它還包括對第二列的查詢,但效率不高。
如果您有涉及第二列的重要查詢,請在該列上另外創建一個索引。

在此related question on dba.SE閱讀有關該主題的所有詳細信息。
this question on SO,也涵蓋此主題。

1

假設您的關聯表有模式,如:

CREATE TABLE Association 
(
    ReferenceA INTEGER NOT NULL REFERENCES TableA CONSTRAINT FK1_Association, 
    ReferenceB INTEGER NOT NULL REFERENCES TableB CONSTRAINT FK2_Association, 
    PRIMARY KEY(ReferenceA, ReferenceB)   CONSTRAINT PK_Association 
); 

有機會,你的DBMS會自動創建一些索引。

某些DBMS將爲這兩個外鍵中的每一個創建一個索引,併爲主鍵創建唯一索引。這有點浪費,因爲PK索引也可用於訪問ReferenceA。

理想情況下,只有兩個索引:ReferenceB的PK(唯一)索引和(允許重複的)FK索引,假定PK索引具有ReferenceA作爲第一列。

如果DBMS不會自動創建索引來強制執行參照完整性約束,則需要創建RI或FK重複項允許的索引。如果它不會自動創建一個索引來強制執行PK約束,那麼您也需要創建該唯一索引。好處是你只能爲理想情況創建索引。

根據您的數據庫管理系統,您可能發現創建沒有約束的表更有效,然後添加索引,然後添加約束(然後使用您創建的索引)。分裂計劃等事情也可以成爲這個因素;我忽略了他們上面。

這個概念依然很簡單—您希望總共有兩個索引,一個用於在兩列上強制實現唯一性,並在前導列上提供快速訪問權限,並在尾隨列上提供非唯一或重複允許的索引。

+1

問題被標記爲與PostgreSQL相關,並且PostgreSQL從不爲外鍵創建索引;它確實爲主鍵或唯一約束創建了唯一的btree索引。 – kgrittn 2012-04-26 17:46:26

+0

我同意這裏有一個PostgreSQL標籤;還有一個評論說它是一個通用的數據庫設計問題。我試圖覆蓋一般基礎,考慮到'PostgreSQL不會創建FK約束索引'(我並不知道這一點,並且有點驚訝,但是有點驚訝)。與之形成鮮明對比的是,Informix正處於「爲所有人創建索引」的學校。桌上有三個足夠的索引。 – 2012-04-26 18:08:29

+0

某些DBMS還允許使用索引表。我不確定這是否有意義。如果您有兩個「僅索引」索引,則可能會有一個索引(ReferenceA,ReferenceB),另一個索引爲另一個索引。更可能的是,這種情況沒有意義。 – 2012-04-26 18:13:19