2011-11-16 42 views
1

我對選擇表主鍵有疑問。 假設我們有3個相關的表如下所述:表索引性能。關於選擇主鍵的選項

TBL_A 
{ 
'A1' varchar (64), // assume this is the unique attribute. 
'A2' varchar (64), 
} 

TBL_B 
{ 
'B1' varchar (64), // assume this is the unique attribute. 
'B2' varchar (64), 
} 

TBL_C 
{ 
'C1' varchar (64), // assume this is the unique attribute. 
'C2' varchar (64), 
} 

關係:

  • TBL_A和TBL_B爲多對多之間,
  • TBL_AB和TBL_C之間的一對多

的問題是:

  1. 哪一個更好:選項A:將每個表的唯一屬性設置爲表的主鍵?或者選項B:創建另一個屬性作爲一個id(自動編號)並用唯一約束來設置表的唯一屬性。 (將應用於所有這三個表)。

  2. 然後TBL_AB將需要複製TBL_A和TBL_B中的主鍵作爲參考鍵。這個問題和我以前的問題一樣,我們是否應該將這兩個引用鍵保留爲TBL_AB的主鍵。或者創建一個新的唯一屬性(自動編號)作爲TBL_AB的主鍵,並使兩個引用的屬性具有唯一約束條件更好。

  3. 因爲od TBL_C將引用TBL_AB的主鍵,當然我們在前兩個問題中選擇的選項將會生效。如果我們選擇第一個選項,將會有兩個引用屬性,但是如果我們選擇第二個選項,我們將只有一個引用屬性。你怎麼看,。?

的想法是當我們在搜索的情況下,將查詢一個整數(或數字)輸入主鍵進行比VARCHAR類型的主鍵快,。? 哪一個更好?當然如果你有'爲什麼',。

謝謝你的每一個答案和建議。 關於,

+0

_Why_你有'b1'和'c1'作爲他們表的屬性嗎?僅僅因爲那是'Tbl_A'中的關鍵,還是它的唯一鍵的一部分呢?並且您有多少行存儲/處理(請記住,在連接期間處理的行數會增加!)? 「Tbl_AB」的定義是什麼/在哪裏?是聯合/視圖還是什麼,爲什麼要合併這些表? –

+0

嗨Christian,a1,b1, – simaremare

回答

1

我不會太擔心主鍵是varchar。如果將自動編號作爲主鍵的單獨字段使用,速度的小幅增加(如果有的話)可能需要將varchar添加到索引,否則每次查找都需要進行偏移並訪問表在需要時獲取varchar。 除非你的表是數百萬條記錄,否則就按照自然的方式設置主鍵。

+0

謝謝Rodolfo,我想我會對你的答案進行表決,並以自然的方式去做。 非常感謝。 :) – simaremare