2011-12-06 65 views
5

Mod的注意事項:我通讀了大約十幾篇似乎與這個問題有關的文章,但他們沒有回答我的問題。請不要將此帖子標記爲刪除;這不是一個重複的問題。MySQL是否需要多對多鏈接表的主鍵?

我正在構建一個包含多對多關係的網絡庫的數據庫。例如,標籤和圖像。顯然,爲了完成這個第三,鏈接,表格將被創建。我可以看到標記表和圖像表中有主鍵列的用法,但我無法想象它在鏈接表中的用法。它只會佔用服務器空間。所以,我正考慮在鏈接表中沒有主鍵列。 MySQL是否允許這樣做?或者,是否有任何令人信服的理由在鏈接表中有主鍵?謝謝。

鏈接表:

+--------------+---------+-----------+ 
| primary key? | tag ids | image ids | 
+--------------+---------+-----------+ 

澄清

請問具有在表的主鍵打破數據庫?

+0

是主鍵_required_?不是。幾乎總是有一個人的候選人?是。你可以使用一張沒有索引的表格,但這對速度來說不是一個好方法。 :-) – Wiseguy

回答

6

鏈接表中不需要主鍵。雖然複合鍵是個好主意。唯一性可以通過使用UNIQUE(tag_ids,image_ids)來實現

+1

在這種情況下,'UNIQUE'鍵實質上與'PRIMARY'鍵相同。 http://stackoverflow.com/questions/158392/primary-key-versus-unique-constraint – ceejayoz

+0

@ceejayoz - 重點是你可以在一個複雜的表中有多個唯一的約束。並且該主鍵不是強制性的。但是在這種情況下,獨特的行爲與主鍵相同。 –

5

是的,您的主鍵應該是tag_idimage_id的複合/複合鍵,即PRIMARY KEY (tag_id, image_id)。在這種情況下,不需要額外的自動增量列。

+0

複合/複合對我來說是一個新術語。那是說如果'tag_id = 23'和'image_id = 54',那麼'linke_id'(主鍵)應該是2354?擁有主鍵列有什麼優勢? –

+0

在這種情況下,主鍵會防止您多次添加相同的標記,並且會加快從表中檢索數據的速度。 – ceejayoz

+0

謝謝,這非常有幫助。 –

8

沒有要求你有一個主鍵。

但是,也不要求主鍵只有一個字段。在這種情況下,您可能會將主鍵聲明爲(tag_id,image_id)。

你有一個問題在回覆另一篇文章,讓我想到,也許你認爲你應該連接兩個字段作爲主鍵。別。定義鍵

alter table link add primary key (tag_id, image_id); 

不說

alter table link add primary key (tag_id + image_id); 

(我覺得「+」是在MySQL連接運算符,它已經有一段時間,SQL標準是「&」,但MySQL使用的是)

這兩者之間有很大的差異,即在第一種情況下,25,34和253,4是兩個不同的值,而在第二種情況下它們都變成2534.

你會不會總是從標籤到圖像,還是你還想從圖像到標籤?如果你需要在兩個方向上走,那麼你應該創建兩個索引,或者一個主鍵和一個索引,這兩個方向的字段。像:

create index link_tag_image on link(tag_id, image_id); 
create index link_image_tag on link(image_id, tag_id); 

如果您只有第一個(例如),然後再考慮這個查詢:

select tag.name 
from image 
join link on image.image_id=link.imagae_id 
join tag on tag.tag_id=link.tag_id 
where image.foo='bar' 

這似乎plausbile不夠:找到所有匹配符合特定條件的圖像的標籤。但是沒有第二個索引,這個查詢可能需要很長時間,因爲數據庫將不得不依次讀取整個鏈接表以查找具有給定image_id的所有記錄。

0

當使用MySQL Workbench時,這是非常明智的,因爲如果沒有主鍵,它將不允許除了只讀以外的任何對錶的訪問,這在嘗試測試數據庫時很痛苦。儘管擁有永遠不會被關係中引用的PK似乎是浪費。