我正处于数据库计划的早期阶段,以是还没有最终功效,我正在行使“TOXI”3表计划作为我的线程,它有可选标签,但我不禁认为插手是不是真的有须要,大概我必要依赖我的帖子表中的一个简朴的标签列,我可以在个中存储相同< tag>,< secondTag>的varchar.
以是回首一下:
>是否值得在2个标签表上特殊左毗连的贫困,而不是在我的posts表中只有一个标签列. >有没有步伐可以优化我的查询?
架构
CREATE TABLE `posts` (
`post_id` INT UNSIGNED PRIMARY AUTO_INCREMENT,`post_name` VARCHAR(255)
) Engine=InnoDB;
CREATE TABLE `post_tags` (
`tag_id` INT UNSIGNED PRIMARY AUTO_INCREMENT,`tag_name` VARCHAR(255)
) Engine=InnoDB;
CREATE TABLE `post_tags_map` (
`map_id` INT PRIMARY AUTO_INCREMENT,`post_id` INT NOT NULL,`tags_id` INT NOT NULL,FOREIGN KEY `post_id` REFERENCES `posts` (`post_id`),FOREIGN KEY `post_id` REFERENCES `post_tags` (`tag_id`)
) Engine=InnoDB;
样本数据
INSERT INTO `posts` (`post_id`,`post_name`)
VALUES
(1,'test');
INSERT INTO `post_tags` (`tag_id`,`tag_name`)
VALUES
(1,'mma'),(2,'ufc');
INSERT INTO `posts_tags_map` (`map_id`,`post_id`,`tags_id`)
VALUES
(1,1,1),2);
当前查询
SELECT
posts.*,GROUP_CONCAT( post_tags.tag_name order by post_tags.tag_name ) AS tags
FROM posts
LEFT JOIN posts_tags_map
ON posts_tags_map.post_id = posts.post_id
LEFT JOIN post_tags
ON posts_tags_map.tags_id = posts_tags.tag_id
WHERE posts.post_id = 1
GROUP BY post_id
功效
假若有标签:
06003
最佳谜底
将全部标志放在差异的记录中(尺度化)意味着您可以在必要时更轻松地重定名标志并跟踪标志名称汗青记录.
譬喻,重定名SQL Server相干标签至少三次(mssql – > sqlserver – > sql-server).
将全部标志放在一个记录中(非类型化)意味着您可以行使FULLTEXT索引索引此列,并一次搜刮具有两个或更多标志的帖子:
SELECT *
FROM posts
WHERE MATCH(tags) AGAINST('+mma +ufc')
这也是也许的,但尺度化计划服从较低.
(不要健忘将@ft_min_word_len调解为3个字符或更少的索引标志,以便事变)
您可以组合两种计划:存储舆图表和非类型化列.但这必要更多的维护.
您还可以将类型化计划存储在数据库中,并行使您提供的查询将标志提供应Sphinx或Lucene.
这样,您可以行使MySQL举办汗青发掘,行使Sphinx举办全文标志搜刮,而且不必要特另外维护.
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|