gpt4 book ai didi

mysql - MySQL是否需要多对多链接表的主键?

转载 作者:可可西里 更新时间:2023-11-01 06:54:46 27 4
gpt4 key购买 nike

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

我正在为将包含多对多关系的网络画廊构建数据库。例如,标签和图像。显然,要完成此操作,将创建第三个链接表。我可以看到在标签表和图像表中使用主键列的用途,但我无法想象它在链接表中的用途。它只会占用服务器空间。所以,我正在考虑在链接表中没有主键列。 MySQL 允许吗?或者,是否有任何令人信服的理由在链接表中有一个主键?谢谢。

链接表:

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

澄清

表中有主键会破坏数据库吗?

最佳答案

不要求您拥有主键。

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

你在回复另一篇帖子时提出了一个问题,这让我觉得你可能认为你应该连接两个字段以构成主键。不。定义 key 为

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'

这似乎很有道理:找到与满足特定条件的图像相匹配的所有标签。但是如果没有第二个索引,这个查询可能会花费很长时间,因为数据库必须顺序读取整个链接表才能找到具有给定 image_id 的所有记录。

关于mysql - MySQL是否需要多对多链接表的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com