2013-10-06 94 views
0

我正在規範我的數據庫結構,但我不完全確定要應用哪些索引。我有以下結構:適用於規範化SQL數據庫的索引是什麼?

我的個人檔案表有2列(profile_id,profile_name),我的關鍵字表有2列(keyword_id,keyword_name),我的profiles_keyword表有2列(profile_id,keyword_id)。

將索引應用於所有列是否合理?我應該在profile_id,keyword_id上製作PRIMARY COMPOSITE鍵嗎?我還應該將參照鍵添加到profiles_keyword表中?

不知道哪個是最好的,哪些關鍵doens與另一個工作!

謝謝。

+0

針對您針對您的數據運行的查詢使用執行計劃。它會告訴你索引何時丟失。除PK和FK之外,您需要的索引取決於您如何查詢數據。 –

+0

請注意,主鍵可以使記錄具有唯一性,使您能夠識別它。請記住您關於複合主鍵的決定。話雖如此,就你所描述的看來,這似乎是正確的路要走。 –

回答

0

在profiles_keyword上,您應該爲每個表添加2個外鍵。

爲每個添加FK的列添加索引是一種很好的做法,因此需要2個索引。

根據您的疑問,您應該決定是否同時爲2列添加索引。

如果按名稱從Profiles表或從keyword表你可以和在Name列的索引做選擇,但你必須考慮到對字符串字段索引會在磁盤上更多的空間。

對於所有索引,請記住,因爲數據庫需要更新索引,所以您在執行插入和更新時付出代價。

0

由於它們是主鍵,因此profile_id和keyword_id都會自動建立索引,以便優化聯接。只需要關係表上的複合主鍵以確保對的唯一性,如果這不是約束條件,即相同的配置文件可以使用相同的關鍵字多次關聯,則不需要該索引。但是,您可以創建一個非唯一索引來優化連接性能。無論如何將是很好的指定外鍵來正確管理實體完整性之間的關係。

+0

數據庫引擎沒有提及,但有沒有不會自動索引主鍵? –

+0

@DanBracuk你是對的我編輯了我的答案 – remigio

1

這裏有兩個相關但概念上相互分離的概念。

首先,有鑰匙的概念 - 主要和外國。這些是概念實體,用於確定表格及其關係的性質。例如,一個主鍵說「這是你如何唯一標識這個表中的另一行」。原則上,「鑰匙」本身不具備實體存在。

密鑰通常使用索引實現 - 例如,主鍵需要唯一索引。我建議您將索引應用於主鍵和外鍵。

索引是一個物理的東西 - 它存在於您的硬盤上。您使用索引有兩個原因:爲您的密鑰提供物理形狀(請參閱上文),並優化查詢。例如,儘管「profile_name」和「keyword_name」不是模式中的關鍵字,但很可能它們將用於搜索。因此,您可能需要在這些列上使用索引。

+0

PK索引不僅是唯一的,它也是* clustered * :) –

+0

並不總是 - 不是每個數據庫引擎都支持聚集索引。當然,如果你的數據庫支持它,爲主鍵使用聚集唯一索引幾乎​​總是一個好主意。 –