1

我有一张表,必须在 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. 考虑到需要存储的记录数量,最好仅将 my AUTO_INCREMENTing ' ' 用作主键和唯一键吗?post_id

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

您能否还指出每个的优点和缺点(如果有),也许还有一些关于使用哪种 ENGINE 的建议。如果我使用第二个选项,我认为 Innodb 会是最好的。我不知道。

4

1 回答 1

1

无论您是使用自动递增字段作为主键还是使用 post_id 和 user_id 的复合键,基本上都将归结为以下内容:

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

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

如果是这样,通过使用自动递增字段,您将始终必须加入父表 ( 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字段查询子表,那么我将使用 auto-incremented post_id只要确保你定义的领域足够大。(如果除了数百万条记录之外,您不想因为 post_id 字段太小而陷入最多只有几百万条记录的困境)。

于 2012-01-08T20:17:06.140 回答