MySQL是否需要主键用于多对多链接表?

时间:2011-12-06 22:21:14

标签: mysql relational-database primary-key

Mod的注意事项:我通读了大约十几篇似乎与此问题有关的帖子,但没有人回答我的问题。请不要将此帖标记为删除;这不是一个重复的问题。

我正在为包含多对多关系的网络库构建数据库。例如,标签和图像。显然,为了实现这一点,将创建第三个链接表。我可以看到在tags表和images表中使用主键列的用法,但我无法想象在链接表中使用它。它只会占用服务器空间。所以,我想在链表中没有主键列。 MySQL是否允许这样做?或者,是否有任何令人信服的理由在链接表中拥有主键?感谢。

链接表:

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

澄清

在表中使用主键会破坏数据库吗?

4 个答案:

答案 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'

这似乎很合理:找到符合特定条件的匹配图像的所有标签。但是没有第二个索引,这个查询可能需要很长时间,因为db必须按顺序读取整个链接表以查找具有给定image_id的所有记录。

答案 1 :(得分:6)

链接表中不需要主键。虽然复合键是个好主意。使用UNIQUE(tag_ids,image_ids)

可以实现唯一性

答案 2 :(得分:5)

是的,您的主键应该是tag_idimage_id的复合/复合键,即PRIMARY KEY (tag_id, image_id)。在这种情况下,不需要额外的自动增量柱。

答案 3 :(得分:0)

当使用MySQL Workbench时,这是非常明智的,因为没有主键,除了只读之外,它不允许对表进行任何访问,这在尝试测试数据库时会很痛苦。虽然拥有一个永远不会在关系中被引用的PK似乎很浪费。