想象一下,我们在MySQL数据库中有三个表:
帖子与类别之间存在一对多关系,因此单个帖子可能包含多个类别。
category_post 表是类别和帖子之间的数据透视表,其中包含以下列:
让我们假设我们的 category_post 表中有1,000,000行。
我的问题是:
在 category_post 表中使用 id 列是否有任何性能优势,还是只占用额外空间?
答案 0 :(得分:7)
帖子和类别可能是多对多,而不是一对多。
多对多关系表最好像
那样CREATE TABLE a_b (
a_id ... NOT NULL,
b_id ... NOT NULL,
PRIMARY KEY (a_id, b_id),
INDEX(b_id, a_id) -- include this if you need to go both directions
) ENGINE = InnoDB;
通过这种方式,您可以自动获得两个方向的“聚集”查找,并避免表格中不必要的人工ID。
(顺便说一下,N.B。,一个隐含的PK是6个字节,而不是8. Jeremy Cole在这个主题上有一篇很长的帖子。)
一对多关系不需要这个额外的表。相反,在另一个表中有一个id。例如,City表将包含其中Country的ID。
答案 1 :(得分:5)
将category_id和post_id作为复合主键将具有比将额外id作为主键更好的性能。这是因为将其作为主键也会自动在其上创建index。如果您真的需要额外的Id列,可以通过在category_id和post_id上手动定义索引来提高性能。有一个额外的关键列没有任何好处,这通常是一个不好的做法。
答案 2 :(得分:1)
没有id是好的,但是当你关心通过数据透视表进行排序时,你需要在数据透视表中有id或时间戳