Jim*_*ell 5 mysql primary-key relational-database
Mod的注意事项:我阅读了大约十几篇与此问题相关的帖子,但没有一篇回答我的问题.请不要将此帖标记为删除; 这不是一个重复的问题.
我正在为包含多对多关系的网络库构建数据库.例如,标签和图像.显然,为了实现这一点,将创建第三个链接表.我可以看到在tags表和images表中使用主键列的用法,但我无法想象在链接表中使用它.它只会占用服务器空间.所以,我想在链表中没有主键列.MySQL是否允许这样做?或者,是否有任何令人信服的理由在链接表中拥有主键?谢谢.
链接表:
+--------------+---------+-----------+
| primary key? | tag ids | image ids |
+--------------+---------+-----------+
Run Code Online (Sandbox Code Playgroud)
澄清
将不具有在表的主键打破数据库?
不要求您拥有主键.
但是,也不要求主键只是一个字段.在这种情况下,您可以将主键声明为(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的所有记录.
链表中不需要主键.虽然复合键是个好主意.使用UNIQUE(tag_ids,image_ids)可以实现唯一性
| 归档时间: |
|
| 查看次数: |
5047 次 |
| 最近记录: |