当前位置: 首页 > article >正文

【业务实战】mysql数据库中<标签tag功能>一般是怎么设计的?

【业务实战】mysql数据库中<标签tag功能>一般是怎么设计的?

在 MySQL 数据库中设计标签系统,可以采用以下两种常见的设计方案:

  1. 标签关联表:

    • 创建一个标签表,用于存储所有可用的标签。该表可以包含字段如标签ID(唯一标识符)、标签名称等。
    • 创建一个关联表,用于将标签与其他实体(如文章、产品等)进行关联。该表可以包含字段如关联ID(唯一标识符)、实体ID(关联的实体的唯一标识符)、标签ID(关联的标签的唯一标识符)等。
    • 通过在关联表中插入适当的行,可以将实体与标签进行关联。查询时,可以通过关联表进行关联查询,获取实体的标签信息。
  2. 标签字段:

    • 在实体表中添加一个标签字段,用于存储标签信息。该字段可以是一个字符串,多个标签之间使用特定的分隔符进行分隔(如逗号)。
    • 在查询时,可以使用字符串函数(如 FIND_IN_SET)或正则表达式来查询包含特定标签的实体。

这两种设计方案各有优缺点。标签关联表的设计更加规范和灵活,可以方便地进行标签的管理和查询,但需要进行多表关联操作。标签字段的设计简单直接,但不够灵活,不便于查询和管理标签。

具体选择哪种方案应根据应用需求、数据量、查询频率等因素进行综合考虑。同时,根据实际情况,可以结合索引、查询优化等技术手段来提高查询效率。

文章模块实例

比如一个文章系统中,要设计文章的标签,要如何设计?是字符串呢还是json字符串,还是另外一张表

在一个文章系统中设计文章的标签,可以采用以下两种常见的设计方案:

  1. 字符串字段:

    • 在文章表中添加一个标签字段,用于存储文章的标签信息。该字段可以是一个字符串,多个标签之间使用特定的分隔符进行分隔(如逗号)。
    • 例如,文章表可以包含字段如文章ID、文章标题、文章内容、标签等。标签字段可以存储文章的标签信息,如 “技术,编程,数据库”。
    • 这种设计方案简单直接,适用于标签数量较少且不需要复杂查询的情况。但是,不便于对标签进行管理和查询。
  2. 关联表:

    • 创建一个标签表,用于存储所有可用的标签。该表可以包含字段如标签ID(唯一标识符)、标签名称等。
    • 创建一个关联表,用于将文章与标签进行关联。该表可以包含字段如关联ID(唯一标识符)、文章ID(关联的文章的唯一标识符)、标签ID(关联的标签的唯一标识符)等。
    • 通过在关联表中插入适当的行,可以将文章与标签进行关联。查询时,可以通过关联表进行关联查询,获取文章的标签信息。
    • 这种设计方案更加规范和灵活,适用于标签数量较多且需要进行复杂查询和管理的情况。

使用 JSON 字符串作为标签字段也是一种选择,可以将标签信息以 JSON 格式存储在字符串字段中。这种设计方案可以更灵活地存储和查询标签信息,但需要在应用层进行 JSON 解析和处理。

字符串字段设计文章标签

针对第一种字符串字段的设计方案,你可以按照以下步骤来设计文章表:

  1. 创建文章表:

    • 创建一个文章表,用于存储文章的信息。该表可以包含字段如文章ID(唯一标识符)、文章标题、文章内容、标签等。
    • 例如,可以创建一个名为 “articles” 的表,包含字段如 “article_id”、“title”、“content”、“tags” 等。
  2. 设计标签字段:

    • 在文章表中添加一个标签字段,用于存储文章的标签信息。该字段可以是一个字符串,多个标签之间使用特定的分隔符进行分隔(如逗号)。
    • 例如,可以在 “articles” 表中添加一个名为 “tags” 的字段,用于存储文章的标签信息。
  3. 插入数据:

    • 当插入一篇新文章时,将文章的标签信息以字符串的形式存储在 “tags” 字段中。多个标签之间使用逗号进行分隔。
    • 例如,如果一篇文章的标签是 “技术,编程,数据库”,则将该字符串存储在 “tags” 字段中。
  4. 查询数据:

    • 当需要查询包含特定标签的文章时,可以使用字符串函数(如 FIND_IN_SET)或正则表达式来查询包含特定标签的文章。
    • 例如,可以使用类似以下的 SQL 查询语句来查询包含标签 “编程” 的文章:
      SELECT * FROM articles WHERE FIND_IN_SET('编程', tags) > 0;
      

数据库语句

以下是一个简单的示例,展示了如何创建文章表、插入数据和进行标签查询的 SQL 语句:

创建文章表的 SQL 语句:
CREATE TABLE articles (
  article_id INT PRIMARY KEY,
  title VARCHAR(255),
  content TEXT,
  tags VARCHAR(255)
);
插入数据的 SQL 语句:
INSERT INTO articles (article_id, title, content, tags)
VALUES (1, '文章标题1', '文章内容1', '技术,编程,数据库');

INSERT INTO articles (article_id, title, content, tags)
VALUES (2, '文章标题2', '文章内容2', '编程,Web开发');

INSERT INTO articles (article_id, title, content, tags)
VALUES (3, '文章标题3', '文章内容3', '技术,数据库');
单标签查询

.查询包含特定标签的文章的 SQL 语句:

SELECT * FROM articles WHERE FIND_IN_SET('编程', tags) > 0;

该查询语句将返回包含标签 “编程” 的所有文章。

多标签查询

如果需要进行多标签查询,可以使用 SQL 的 INLIKE 条件来实现。以下是一个示例 SQL 查询语句,用于查询同时包含多个标签的文章:

SELECT * FROM articles WHERE tags LIKE '%编程%' AND tags LIKE '%技术%';

上述查询语句将返回同时包含标签 “编程” 和 “技术” 的所有文章。

请注意,使用 LIKE 条件进行多标签查询时,需要在每个标签的前后添加通配符 %,以便匹配包含该标签的字符串。同时,使用 AND 连接多个 LIKE 条件,确保同时满足所有标签的条件。

如果需要进行更复杂的多标签查询,可以考虑使用关联表的设计方案。通过关联表,可以更灵活地进行多标签的查询和管理。

【关联表】设计文章标签

针对第二种关联表的设计方案,你可以按照以下步骤来设计文章表:

  1. 创建文章表:

    • 创建一个文章表,用于存储文章的信息。该表可以包含字段如文章ID(唯一标识符)、文章标题、文章内容等。
    • 例如,可以创建一个名为 “articles” 的表,包含字段如 “article_id”、“title”、“content” 等。
  2. 创建标签表:

    • 创建一个标签表,用于存储所有可能的标签。该表可以包含字段如标签ID(唯一标识符)、标签名称等。
    • 例如,可以创建一个名为 “tags” 的表,包含字段如 “tag_id”、“tag_name” 等。
  3. 创建文章标签关联表:

    • 创建一个文章标签关联表,用于建立文章和标签之间的关系。该表可以包含字段如文章ID、标签ID等。
    • 例如,可以创建一个名为 “article_tags” 的表,包含字段如 “article_id”、“tag_id” 等。
  4. 插入数据:

    • 当插入一篇新文章时,首先将文章的信息插入到 “articles” 表中,然后将文章与对应的标签建立关联,将关联信息插入到 “article_tags” 表中。
    • 例如,如果一篇文章的标签是 “编程” 和 “技术”,则可以先插入文章信息到 “articles” 表中,然后插入两条关联记录到 “article_tags” 表中,分别对应 “编程” 和 “技术” 这两个标签。
  5. 查询数据:

    • 当需要查询包含特定标签的文章时,可以使用关联表进行查询。通过联结 “articles” 表和 “article_tags” 表,根据标签条件进行筛选。
    • 例如,可以使用类似以下的 SQL 查询语句来查询包含标签 “编程” 的文章:
      SELECT a.* FROM articles a
      INNER JOIN article_tags at ON a.article_id = at.article_id
      INNER JOIN tags t ON at.tag_id = t.tag_id
      WHERE t.tag_name = '编程';
      

需要注意的是,使用关联表的设计方案可以更灵活地进行多标签的查询和管理,但需要进行额外的表关联操作。此外,需要在应用层进行关联表的插入和查询操作。


http://www.kler.cn/a/148409.html

相关文章:

  • 前端面试笔试(二)
  • 深度学习和图像处理
  • flink sql + kafka + mysql 如何构建实时数仓
  • AI写作(二)NLP:开启自然语言处理的奇妙之旅(2/10)
  • PYNQ 框架 - 中断(INTR)驱动
  • 使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
  • 【RLChina2023】CCF 苏州 记录
  • 微信小程序开发——项目开发入门
  • C++ 泛型编程,函数模版和类模版
  • 高等数学零基础篇复习笔记
  • 离线配置conda环境
  • 基于Python的网络爬虫设计与实现
  • LeetCode-805.保持城市天际线 C/C++实现 超详细思路及过程[M]
  • Android BSP 开发之六
  • 什么是网络爬虫技术?它的重要用途有哪些?
  • 商用车的智慧眼车规级激光雷达
  • java 系统属性和环境属性
  • 计算机网络基础知识自用
  • 【微服务专题】微服务架构演进
  • Spring Boot 3.2.0 虚拟线程初体验 (部分装配解析)
  • Linux内存管理(六十四):ION 内存管理器——system heap
  • VMware虚机重启后静态IP不生效
  • QT linux下应用程序打包
  • uni-app中vue3+setup实现下拉刷新、上拉加载更多效果
  • 角色管理--高级产品经理岗
  • uniapp 导航分类