php - 将标签插入表格的最有效方法是什么

标签 php mysql tags

我有以下表格;

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”表.

这可能是解决此类问题的糟糕方法。

欢迎所有建议。

最佳答案

是的,你正在做的是最好的方法。您创建了一个 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,不需要额外的字段。<

I suppose that the 'tag_text' should be unique? Is if effective that I run a function each time I submit a new post to go through the 'tags' table to check if a tag already exists, and if yes, return its 'tag_id' so I can insert it into 'user_post_tag' table.

是的,它应该是独一无二的。最好在插入之前检查标签是否存在,如果不存在则插入,而不是有冗余并且必须执行 SELECT ... count(*) 以了解标签已使用了多少次。与帖子选择相比,帖子创建的频率要低得多,因此如果您必须在插入和选择的查询密集型之间做出选择,当然选择插入。

顺便说一句,如果你想知道有多少帖子有相同的标签,比如在堆栈溢出中,你需要另一个表,主键 tag_id,然后,比如 user_tags,每次帖子获得特定标签时,您都会增加 count 字段。

关于php - 将标签插入表格的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2009595/

相关文章:

MySql联合查询中的链接表

java - 在Android中为Imageview设置唯一的标签ID

php - 将旧用户迁移到 symfony2

php - 如何检查mysql中的参数是否为null或为空?

javascript - 尝试使用表单登录时 PHP 重定向到错误的 URL

php - 在 PHP 中转换日期格式

php - 使用 PHP 从 mysql 数据库查询数据

mysql - 一个表中的变量在另一个表中不存在

php - 使用 PHP 从字符串的开头和结尾删除标签

ios - 使用标记符号访问 UILabel