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

Jim*_*ell 5 mysql primary-key relational-database

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

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

链接表:

+--------------+---------+-----------+
| primary key? | tag ids | image ids |
+--------------+---------+-----------+
Run Code Online (Sandbox Code Playgroud)

澄清

具有在表的主键打破数据库?

Jay*_*Jay 8

不要求您拥有主键.

但是,也不要求主键只是一个字段.在这种情况下,您可以将主键声明为(tag_id,image_id).

你有一个问题回复另一篇帖子给了我一个想法,也许你认为你应该连接两个字段来制作主键.别.将密钥定义为

alter table link add primary key (tag_id, image_id);
Run Code Online (Sandbox Code Playgroud)

别说

alter table link add primary key (tag_id + image_id);
Run Code Online (Sandbox Code Playgroud)

(我认为"+"是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);
Run Code Online (Sandbox Code Playgroud)

如果只创建第一个(例如),那么请考虑以下查询:

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'
Run Code Online (Sandbox Code Playgroud)

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


Sid*_*ani 6

链表中不需要主键.虽然复合键是个好主意.使用UNIQUE(tag_ids,image_ids)可以实现唯一性

  • 在这种情况下,`UNIQUE`键基本上与`PRIMARY`键相同.http://stackoverflow.com/questions/158392/primary-key-versus-unique-constraint (2认同)

cee*_*yoz 5

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