2010-01-05 208 views
2

我有以下表格;将标签插入表格的最有效方法是什么

CREATE TABLE IF NOT EXISTS `tags` (
    `tag_id` int(11) NOT NULL auto_increment, 
    `tag_text` varchar(255) NOT NULL, 
    PRIMARY KEY (`tag_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 


CREATE TABLE IF NOT EXISTS `users` (
    `user_id` int(11) NOT NULL auto_increment, 
    `user_display_name` varchar(128) default NULL, 
    PRIMARY KEY (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; 

CREATE TABLE IF NOT EXISTS `user_post_tag` (
    `upt_id` int(11) NOT NULL auto_increment, 
    `upt_user_id` int(11) NOT NULL, 
    `upt_post_id` int(11) NOT NULL, 
    `upt_tag_id` int(11) NOT NULL, 
    PRIMARY KEY (`upt_id`), 
    KEY `upt_user_id` (`upt_user_id`), 
    KEY `upt_post_id` (`upt_post_id`), 
    KEY `upt_tag_id` (`upt_tag_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 

CREATE TABLE IF NOT EXISTS `view_post` (
`post_id` int(11) 
,`post_url` varchar(255) 
,`post_text` text 
,`post_title` varchar(255) 
,`post_date` datetime 
,`user_id` int(11) 
,`user_display_name` varchar(128) 
); 

这个想法是,我想使用最有效的方式来保存标签,为一个职位和用户。简单地说,一旦我添加一篇文章,我会在帖子和用户身上传递一些标签。稍后我希望能够为每个用户和帖子计数标签。与Stack Overflow非常相似。

我想'tag_text'应该是唯一的吗?如果我每次提交一个新帖子来检查'标签'表以检查标签是否已经存在,并且如果是,则返回'tag_id',以便我可以将其插入'user_post_tag'表中。

这可能是一种解决这类问题的不好方法。

欢迎您提出任何建议。

+0

完成后,你会以开放源码的形式发布吗?与“与堆栈溢出非常相似” – ant 2010-01-05 22:37:58

回答

2

是的,你正在做的是做到这一点的最好方法。您创建了一个n到m的关系,因为帖子可以有多个标签,同一个标签可以在多个帖子上。您不想为每个帖子存储标签名称,因此您需要存储该ID。

但是,您应该 - 不应该 - 对于同一个用户,这个存储多次存储的次数是相同的tag_id。如果用户有多个标签,并且您必须为每个标签执行SELECT count(...),它将会严重影响您的服务器。你明白我在说什么吗?因为现在,如何获得用户A有多少次标签B?你必须做SELECT count(*) FROM user_post_tag INNER JOIN tags ON (...) WHERE user_id=A and tag_id=B

我的建议是user_post_tag分成两个表:

  1. user_tags,算用户有多少次这样的标签,主键是user_idtag_id,你就会有一个count领域,每当此用户使用标签发布新帖子时,您只需更新count=count+1。这样,您只需执行SELECT tag_text, count FROM user_tags INNER JOIN tags ON (...) WHERE user_id=A即可选择给定用户的所有标签(使用次数)。您正在使用完全索引的查询。你不要求MySQL翻过桌子,寻找一堆行并对它们进行计数,你要告诉MySQL,在这张桌子和另一张桌子上放这一行,加入它们并快速给我!
  2. post_tags,要存储某个帖子的标签,主键为post_idtag_id,不需要额外的字段。

我想的是, 'tag_text' 应该 是唯一的?如果我有效运行 函数,每次我提交一个新的 帖子去'标签'表 检查标签是否已经存在,如果 是,返回它的'tag_id',这样我就可以 插入它到'user_post_tag'表中。

是的,它应该是唯一的。在插入和插入前检查一个标签是否存在,如果它没有冗余,并且必须执行SELECT ... count(*)以知道标签已被使用多少次,那么检查它是否更好。与帖子选择相比,创建帖子的频率会更低,因此如果您必须在插入和选择的查询密集之间进行选择,那么肯定会选择插入。顺便说一句,如果你想计算有多少帖子具有相同的标签,就像堆栈溢出一样,你需要另外一个表,主键为tag_id,然后,就像user_tags一样,每当帖子获得特定标签时,您就会增加count字段。

0

嗯,如果你的标签都是唯一的,那么你不需要标签表中的tag_id和tag_text。只需使用tag_text并将其作为主键即可。然后查看REPLACE INTO(http://dev.mysql.com/doc/refman/5.0/en/replace.html)以处理新标签。

将标签与用户或帖子关联? user_tags表和post_tags表。没有自动递增值,只有带有user_id和tag_text或post_id和tag_text的复合键。我不知道您是否正在查看user_post_tags表,以便通过加入包含帖子和用户的post_tags表来提高性能。尽管如此,“替换成”也应该成为你的朋友。

+0

我建议坚持数字键。如果您将文本字段设置为唯一键,那么'REPLACE INTO'技巧仍然可以工作,并且会使整个标签的重命名变得更加容易。 – nickf 2010-01-05 23:32:34

相关问题