2014-02-10 29 views
-1

創建映射表時,我看到人們不使用主鍵,而其他人使用它們。有沒有它提供的有什麼好處。映射表SQL自動增量列或不是

請記住,我正在考慮一個簡單的映射表,它有兩個數字值映射回另一個表中的代理鍵。

Cars 
id - 1 
name - Honda 

Car_Parts 
id - 3 
name - Hood 

Cars_Parts_Mapping 
cars_id - 1 
car_parts - 3 
+3

始終使用主鍵。在這種情況下,您的主鍵是'(cars_id,car_parts)'。兩全其美:主鍵,沒有額外的專欄。然而,很多人使用自動遞增整數主鍵創建_extra_列的原因是因爲他們懶惰地構建了基於_2_字段而不是一個字段來操縱行的_interface_。 – Wrikken

+0

你似乎認爲「主鍵」與「自動整數列」是一樣的 - 事實並非如此。 Wrikken是正確的:在你的情況下'(cars_id,car_parts)'*是一個完美的主鍵。 –

+0

對不起想說自動遞增ID – Jason

回答

0

嘗試儘可能使用主鍵。他們通常是最快到JOIN反對,並保證是唯一的。

鏈接到除主鍵之外的其他東西應該作爲最後的手段。

3

(升級評論回答)

務必使用一個主鍵。在這種情況下,您的主鍵是(cars_id,car_parts)。兩全其美:主鍵,沒有額外的專欄。然而,很多人使用自動遞增整數主鍵創建額外列的原因是因爲他們懶得構建一個基於2個字段而不是1個字段來操縱行的接口。

孤男寡女共處一PRIMARY KEYInnoDB表尤其如此:如果你沒有一個定義,發動機只會create a hidden one for you

如果不定義你的表的主鍵,MySQL的位於第一UNIQUE索引,其中所有關鍵列都不是NULL,InnoDB將它用作聚集索引。

如果該表沒有PRIMARY KEY或合適的UNIQUE索引,InnoDB會在包含行ID值的合成列內部生成一個隱藏聚簇索引。這些行按照InnoDB分配給此表中的行的ID進行排序。行ID是一個6字節的字段,隨着新行的插入而單調遞增。因此,由行ID排序的行在物理上處於插入順序。

的情況並不少見,以確定在此類表的第二索引能夠car_parts快速搜索(現在只有很好地響應搜索上car_id),通過創建一個反向指標,以及:INDEX(car_parts,car_id)。這意味着在INSERT中的性能損失很小,但如果您更多的是操縱數據(通常是這種情況),這可以通過更快的SELECT來證明。

+0

這是有道理的。我不知道innodb在幕後爲您添加了主鍵。那麼在映射表上沒有主鍵是沒有意義的。 – Jason