Mod的注意事项:我通读了大约十几篇似乎与此问题有关的帖子,但没有人回答我的问题。请不要将此帖标记为删除;这不是一个重复的问题。
我正在为包含多对多关系的网络库构建数据库。例如,标签和图像。显然,为了实现这一点,将创建第三个链接表。我可以看到在tags表和images表中使用主键列的用法,但我无法想象在链接表中使用它。它只会占用服务器空间。所以,我想在链表中没有主键列。 MySQL是否允许这样做?或者,是否有任何令人信服的理由在链接表中拥有主键?感谢。
链接表:
+--------------+---------+-----------+
| primary key? | tag ids | image ids |
+--------------+---------+-----------+
的澄清 的
不在表中使用主键会破坏数据库吗?
答案 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_id
和image_id
的复合/复合键,即PRIMARY KEY (tag_id, image_id)
。在这种情况下,不需要额外的自动增量柱。
答案 3 :(得分:0)
当使用MySQL Workbench时,这是非常明智的,因为没有主键,除了只读之外,它不允许对表进行任何访问,这在尝试测试数据库时会很痛苦。虽然拥有一个永远不会在关系中被引用的PK似乎很浪费。