2014-04-18 27 views
6

假设我们有一个MySQL数据库三个表:在MySQL数据透视表中自动递增主键有什么好处吗?

  • 帖子
  • 类别
  • category_post

帖子类别间的一种一对多的关系所以一个帖子可能有很多类别。

category_post表是类别职位和具有以下的列之间的枢转表:

  • ID(主键,自动递增,大整数)
  • CATEGORY_ID
  • post_id

我们还可以想象,我们在category_post表中有1,000,000行。

我的问题是:

是否有任何性能上的提高具有在category_postID柱或者它只是占用额外的空间?

+1

ID或时间戳如果没有主键,InnoDB的将一个用于其内部使用,这意味着你不能避免它(它将是一个8字节的整数)。为了这种目的(路口),我个人总是有主键。我这样做的理由是,我可以正确识别一行,即使在99.9%的情况下,我甚至可能不会手动查询该表以查看其中的内容。但是,由于应用程序发展并且需要更改 - 想象这种情况 - 您突然需要将您的帖子和类别之间的链接用于其他目的。让一个关键字与复合关键字相反是不是更容易? –

回答

6

帖子和类别可能是多对多的,而不是一对多。

一个多一对多的关系表,最好做类似

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。

(顺便说一句,NB,一个隐含的PK是6个字节,不8.是一个漫长的职位由杰里米·科尔的话题。)

一到一对多的关系并不需要这些额外的表。相反,在另一个表中有一个ID。例如,城市表格中将包含国家/地区的ID。

+0

@AucT - 任何排序可能来自'a'或'b',而不是许多映射表。我已经看到关于关系的额外专栏,但很少有任何“订购”它们的东西。一个例外:'tags'和'articles',其中映射表的目的是作为一个[_列表list_](http://mysql.rjweb.org/doc.php/lists)。 (糟糕 - 提示此事的评论已被删除。) –

5

将category_id和post_id作为复合主键将具有比使用额外ID作为主键更好的性能。这是因为使其成为主键也会自动创建一个index。如果您确实需要额外的Id列,则可以通过在category_id和post_id上手动定义索引来提高性能。尽管有一个额外的关键列没有任何好处,这通常是一个不好的做法。

+0

我同意@Glenn Vandamme,有没有额外的专栏,特别是如果它将是一个有100万行的大表。任何添加到表格的列都占用空间。查询这些表时,数据也被拖动,导致查询速度变慢。您还需要一个额外的索引,每次插入时都需要更新索引。 –

1

没有ID是好的,但是当你关心的数据透视表命令你将需要在数据透视表

相关问题