2011-12-06 44 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似乎是浪费。