我有以下表格;
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
分成两个表:
user_tags
,要计算用户有多少次这个标签,主键是user_id
和tag_id
,你有一个count
字段,每次该用户使用该标签发布新帖子时,您只需使用count=count+1
更新该字段。这样,您只需执行SELECT tag_text, count FROM user_tags INNER JOIN tags ON (...) WHERE user_id=A
即可选择给定用户的所有标签(使用次数)。您正在使用完全索引的查询。你不是在要求 MySQL 检查表格,寻找一堆行并计算它们,你是在告诉 MySQL,在这个表和另一个表中找到这一行,加入它们并给我,快!post_tags
,用于存储某个帖子的标签,主键是post_id
和tag_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/