【问题标题】:What's better between natural and composite keys in this situation在这种情况下,自然键和复合键之间有什么更好
【发布时间】:2012-01-08 19:49:08
【问题描述】:

我有一个表,它必须在 mysql 中存储数百万个帖子(在不久的将来)。这是简化的结构(我没有指出我的主键,因为我的问题是基于此的):

CREATE TABLE `posts` (
    `post_id` INT NOT NULL AUTO_INCREMENT,
    `user_id` BIGINT(20) NOT NULL,
    `title` VARCHAR(100),
    `content` TEXT
) ENGINE = MyISAM;

我的问题是:定义密钥的最佳方式是什么?

  1. 考虑到需要存储的记录数量,是否最好只使用我的AUTO_INCREMENTing 'post_id' 作为主键和唯一键?

  2. 我必须同时使用“post_id”和“user_id”作为复合键才能用作主键和唯一键吗?如果这是最好的,我如何在其他表中使用它作为外键?我是否只是将它们作为列添加到这些表中?

能否请您指出每种引擎的优点和缺点(如果有的话),并可能就使用哪种 ENGINE 提出一些建议。如果我使用第二个选项,我认为 Innodb 将是最好的。我不知道。

【问题讨论】:

标签: mysql innodb myisam key composite-primary-key


【解决方案1】:

您是使用自动递增字段作为主键还是使用 post_id 和 user_id 的复合键将归结为基本上如下:

如果您的posts 表有子表,您是否想使用帖子的user-id 查询这些表?

例如,如果允许其他用户对帖子发表评论,并且您有一个 comments 表,您是否看到为什么要从您在 user_id 上查询的 cmets 表中获取数据的原因原帖?

如果是这样,通过使用自动递增字段,您将始终必须加入父表 (posts) 才能根据 user_id 查询子表上的数据:

SELECT comments.* 
FROM comments
INNER JOIN posts ON
    posts.post_id=comments.post_id
WHERE posts.user_id='scott.korin'

这可能会导致性能下降,尤其是当您预计 posts 表中有数百万行数据时。

如果您不需要使用user_id 字段查询子表,那么我会使用自动递增的post_id只要确保你定义了足够大的字段。(如果你除了几百万条记录,你不想因为你把 post_id 字段设置得太小而被困在最多几百万条记录中)。

【讨论】:

  • 谢谢。这真的很有帮助。只是一个后续问题:AUTO_INCREMENT 主键是否可靠?他们有什么我可能不知道的问题吗?我不打算使用user_id 来检索 cmets。我只是在做一个例子,我找不到任何其他可以使用的字段。对此感到抱歉。
  • 据我所知,它们非常可靠,但我更熟悉它们在 Microsoft SQL Server 中的使用:)
猜你喜欢
  • 2015-07-08
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多