| 
                         我正处于数据库设计的早期阶段,所以还没有最终结果,我正在使用“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进行全文标记搜索,并且不需要额外的维护. 
                        (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |