sql – 规范化“Toxi”方式真的值得吗? (3NF)

前端之家收集整理的这篇文章主要介绍了sql – 规范化“Toxi”方式真的值得吗? (3NF)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正处于数据库设计的早期阶段,所以还没有最终结果,我正在使用“TOXI”3表设计作为我的线程,它有可选标签,但我不禁觉得加入是不是真的有必要,也许我需要依靠我的帖子表中的一个简单的标签列,我可以在其中存储类似< tag>,< secondTag>的varchar.

所以回顾一下:

>是否值得在2个标签表上额外左连接的麻烦,而不是在我的posts表中只有一个标签列.
>有没有办法可以优化我的查询

架构

  1. CREATE TABLE `posts` (
  2. `post_id` INT UNSIGNED PRIMARY AUTO_INCREMENT,`post_name` VARCHAR(255)
  3. ) Engine=InnoDB;
  4. CREATE TABLE `post_tags` (
  5. `tag_id` INT UNSIGNED PRIMARY AUTO_INCREMENT,`tag_name` VARCHAR(255)
  6. ) Engine=InnoDB;
  7. CREATE TABLE `post_tags_map` (
  8. `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`)
  9. ) Engine=InnoDB;

样本数据

  1. INSERT INTO `posts` (`post_id`,`post_name`)
  2. VALUES
  3. (1,'test');
  4. INSERT INTO `post_tags` (`tag_id`,`tag_name`)
  5. VALUES
  6. (1,'mma'),(2,'ufc');
  7. INSERT INTO `posts_tags_map` (`map_id`,`post_id`,`tags_id`)
  8. VALUES
  9. (1,1,1),2);

当前查询

  1. SELECT
  2. posts.*,GROUP_CONCAT( post_tags.tag_name order by post_tags.tag_name ) AS tags
  3. FROM posts
  4. LEFT JOIN posts_tags_map
  5. ON posts_tags_map.post_id = posts.post_id
  6. LEFT JOIN post_tags
  7. ON posts_tags_map.tags_id = posts_tags.tag_id
  8. WHERE posts.post_id = 1
  9. GROUP BY post_id

结果

如果有标签

06003

最佳答案
将所有标记放在不同的记录中(标准化)意味着您可以在需要时更轻松地重命名标记并跟踪标记名称历史记录.

例如,重命名sql Server相关标签至少三次(mssql – > sqlserver – > sql-server).

将所有标记放在一个记录中(非规范化)意味着您可以使用FULLTEXT索引索引此列,并一次搜索具有两个或更多标记的帖子:

  1. SELECT *
  2. FROM posts
  3. WHERE MATCH(tags) AGAINST('+mma +ufc')

这也是可能的,但标准化设计效率较低.

(不要忘记将@ft_min_word_len调整为3个字符或更少的索引标记,以便工作)

您可以组合两种设计:存储地图表和非规范化列.但这需要更多的维护.

您还可以将规范化设计存储在数据库中,并使用您提供的查询标记提供给Sphinx或Lucene.

这样,您可以使用MysqL进行历史挖掘,使用Sphinx进行全文标记搜索,并且不需要额外的维护.

猜你在找的MySQL相关文章