【业务实战】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.mzph.cn/news/182585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银河麒麟高级服务器操作系统V10安装达梦数据库管理系统DM8——单实例

一、介绍 之前介绍过供个人学习在VMware虚拟机上安装银河麒麟高级服务器操作系统V10&#xff0c;有兴趣的可以去看看&#xff08;银河麒麟V10安装&#xff09;&#xff0c;本次主要学习在银河麒麟V10上安装达梦数据库-DM8。DM8是达梦公司在总结DM系列产品研发与应用经验的基础…

Unity优化篇:对于unity DrawCall/Mesh/纹理压缩/内存等方面的常规调试和优化手段

对于Unity的DrawCall、Mesh、纹理压缩、内存等方面的常规调试和优化手段&#xff0c;我都有一定的了解。以下是一些常见的优化手段&#xff1a; 减少DrawCall&#xff1a;这是提高性能的关键。尽可能合并相同的材质和纹理&#xff0c;使用LOD&#xff08;Levels of Detail&…

记录一次YAMLException异常

记录一次YAMLException异常 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及B…

C语言——深入理解指针(3)

目录 1. 字符指针 2. 数组指针 2.1 数组指针变量 2.2 数组指针变量的初始化 3.二维数组传参&#xff08;本质&#xff09; 4. 函数指针 4.1 函数指针变量的创建 4.2 函数指针的使用 4.3 typedef 5. 函数指针数组 6. 转移表&#xff08;函数指针数组的使用&#xff…

Opencv颜色追踪

废话不多说直接上代码&#xff01;&#xff01; # 这是一个示例 Python 脚本。 import cv2 import numpy as npdef track_object():# 打开摄像头外接cap cv2.VideoCapture(0)while True:# 读取摄像头帧# ret&#xff08;Return Value&#xff09;是一个布尔值&#xff0c;表示…

@RequestMapping详解:请求映射规则

目录 请求-相应模式&#xff1a; 设置请求映射规则RequestMapping POST 请求&#xff1a; GET 请求 请求-相应模式&#xff1a; 前端作为客户端向后端发送请求&#xff08;请求可以分为请求头和请求体两部分&#xff0c;请求头包含了一些元数据信息&#xff0c;如请求方式、…

硬盘录像机无法注册到视频监控平台EasyCVR上是什么原因?该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;也…

【20年扬大真题】试写一算法在带头结点的单链表结构上实现线性表操作LENGTH(L)

【20年扬大真题】 试写一算法在带头结点的单链表结构上实现线性表操作LENGTH&#xff08;L&#xff09;。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdbool.h> #include<malloc.h> //单链表定义 //链表结点 int A[10] { 1,2,3,4,5,6,…

开源C++智能语音识别库whisper.cpp开发使用入门

whisper.cpp是一个C编写的轻量级开源智能语音识别库&#xff0c;是基于openai的开源python智能语音模型whisper的移植版本&#xff0c;依赖项少&#xff0c;内存占用低&#xff0c;性能更优&#xff0c;方便作为依赖库集成的到应用程序中提供语音识别功能。 以下基于whisper.c…

低调使用。推荐一个 GPT4 Turbo、Vision、GPTs、DELL·E3 等所有最新功能同步可用国内网站

在 11 月 6 日&#xff0c;万众期待的 OpenAI DevDay&#xff0c;ChatGPT 发布了一系列新的产品&#xff0c;其中推出了 GPT4 Turbo&#xff0c;并且将GPT4 Vision&#xff0c;DELLE3 等等能力全部集合到一起&#xff0c;不需要再分开使用&#xff0c;原来的局限的文本聊天也进…

python类的多重继承继承和查找顺序

1 python类的多重继承继承和查找顺序 python中&#xff0c;类的多重继承允许子类继承多个基类&#xff0c;子类可以访问多个基类的属性和方法。 1.1 多重继承基础 用法 class MulClass(BaseC1,BaseC2,...BaseCn):pass描述 Mulclass&#xff1a;子类&#xff08;或者称混合…

JavaScript包装类型

前端面试大全JavaScript包装类型 &#x1f31f;经典真题 &#x1f31f;包装类型 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 是否了解 JavaScript 中的包装类型&#xff1f; &#x1f31f;包装类型 在 ES 中&#xff0c;数据的分类分为基本数据类型…

微信预约小程序制作

对于许多新手来说&#xff0c;制作微信预约小程序可能是一项挑战&#xff0c;但并非不可能。本文将通过详细的步骤&#xff0c;指导您从零开始制作一个微信预约小程序。首先&#xff0c;您需要找一个合适的第三方制作平台或工具&#xff0c;乔拓云网就是其中之一。 找一个合适的…

【数据结构】八大排序 (三)

目录 前言&#xff1a; 快速排序 快速排序非递归实现 快速排序特性总结 归并排序 归并排序的代码实现 归并排序的特性总结 计数排序 计数排序的代码实现 计数排序的特性总结 前言&#xff1a; 前文快速排序采用了递归实现&#xff0c;而递归会开辟函数栈帧&#xff0…

信号类型(通信)——最小频移键控(MSK)

系列文章目录 《信号类型&#xff08;通信&#xff09;——仿真》 《信号类型&#xff08;通信&#xff09;——QAM调制信号》 《信号类型&#xff08;通信&#xff09;——QPSK、OQPSK、IJF_OQPSK调制信号》 目录 前言 一、MSK信号特点 1.1、最小频移 1.2、相位连续 二…

小红书API接口测试 | 小红书笔记详情 API 接口测试指南

一、引言 随着互联网的发展&#xff0c;越来越多的应用开始使用API接口来提供服务。而API接口的测试也变得越来越重要。本文将介绍如何使用Python语言进行小红书笔记详情API接口的测试。 二、小红书笔记详情API接口介绍 小红书笔记详情API接口是用于获取指定笔记详细信息的接…

Ubuntu16.04.4系统本地提权实验

目录 1.介绍&#xff1a; 2.实验&#xff1a; 3.总结&#xff1a; 1.介绍&#xff1a; 1.1&#xff1a;eBPF简介&#xff1a;eBPF(extendedBerkeleyPacketFilter)是内核源自于BPF的一套包过滤机制&#xff0c;BPF可以理解成用户与内核之间的一条通道&#xff0c;有非常强大的…

Python的控制流语句使用

Python的控制流语句使用 判断语句 if分支示意图语法介绍注意事项示例 for循环示意图语法介绍列表推导式示例 while循环与for的区别语法介绍示例 判断语句 if分支 示意图 单、双、多分支&#xff1a; 语法介绍 # 单分支 if condition:expression # 双分支 if condition:exp…

Spark-java版

SparkContext初始化 相关知识 SparkConf 是SparkContext的构造参数&#xff0c;储存着Spark相关的配置信息&#xff0c;且必须指定Master(比如Local)和AppName&#xff08;应用名称&#xff09;&#xff0c;否则会抛出异常&#xff1b;SparkContext 是程序执行的入口&#xf…

设计好的测试用例,6大注意事项

设计好的测试用例对于发现缺陷、验证功能、提高可靠性、降低风险和提高效率都具有重要的作用&#xff0c;是保证产品质量和稳定性的重要环节。如果测试用例有问题&#xff0c;可能会导致遗漏缺陷、功能验证不充分、测试效率低下以及误报漏报等问题&#xff0c;从而影响项目的质…