我们有一个这样的表来维护每个"article"的"comments"。我们有数百万篇文章,每一篇文章都可能有多条评论。
我们要求"id"对于每个"article"是唯一的,但不一定在所有文章中都是唯一的。
在当前的方法中,我们插入并使用mysql_insert_id()来获取"id",因此不需要额外的查询来获取生成的"id"。
CREATE TABLE `comments` (
id bigint unsigned NOT NULL AUTO_INCREMENT,
article int unsigned int default 0,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这种方法是有效的,但从某种意义上说,我们需要使用bigint来表示"id",尽管我们不希望每篇文章的评论超过几千条。我们可以手动维护id,但缺点是它需要额外的查询来获得"id",我们只需调用mysql_insert_id()就可以获得它。如果可以在项目范围内自动增加"id",这将很容易。
任何关于更好的方法的建议,以便
- 我们可以生成一个较小的"id",它对一篇文章是唯一的,但不一定对所有文章都是唯一的
- 没有其他查询可获取生成的"id">
感谢
这种方法有效,但从我们需要使用bigint表示"id",即使我们不希望每篇文章都有评论超过几千人。
我认为这没有必要是真的。想象一下,您想在应用程序的某个部分输出最近的评论:
- 使用当前设计,您可以显示信息并具有类似
url/viewComment/commentId={commentId}
的链接 - 如果注释可以用
articleId
和commentInternalId
识别,则所有url都需要这两个id
生成id
的一种方法如下(基于1):
(COUNT(1) FROM `comments` WHERE article = {article}) + 1
但它显然比使用自动增量更复杂、更昂贵。