软件系统【标签tag功能】的两种数据库设计

简介: 软件系统中的标签功能可采用两种数据库设计。方案一,文章和Tag各一表,Tag信息存储在文章表内(`tags`和`tagids`字段),优点是模型简单,但查询效率低且易引发数据冗余和一致性问题。方案二,增加Tagmap表,用于存储标签-文章映射,利于索引查询和数据更新,适用于高效率需求,但结构更复杂。

软件系统【标签tag功能】的两种数据库设计

需求: 简介: 需求背景 目前主流的博客系统、CMS都会有一个TAG标签系统,不仅可以让内容链接的结构化增强,而且可以让文章根据Tag来区分。相比传统老式的Keyword模式,这种Tag模式可以单独的设计一个Map的映射表来增加系统的负载和查询的效率。

数据库设计方案1:两个表结构

两个表

  • Tag表
  • 文章表

Tag表表结构:

字段 描述
id tag标签的ID
tagname tag内容
num 当前Tag的引用个数

文章表结构:

字段 描述
id 文章ID
title 文章标题
tags tags列表,多个以,分割
tagids tags的ID 多个以,分割

优点

  1. 简化的数据模型:只有两个表,模型简单,易于理解和维护。
  2. 减少表连接:由于标签信息直接存储在文章表中,查询特定文章的标签时不需要进行表连接,可能提高查询速度。
  3. 快速更新:当添加或删除标签时,只需更新Tag表中的引用计数,操作简单快捷。

缺点

  1. 查询效率问题
    • 当需要根据标签查找文章时,由于标签信息存储在文章表的tags字段(以逗号分隔的字符串),需要对字符串进行解析,这可能降低查询效率。
    • 对于复杂的查询,如查找具有多个标签中任意一个的文章,可能需要更复杂的处理逻辑。
  2. 扩展性限制
    • 如果标签数量很多或文章数量很大,文章表中的tagstagids字段可能会变得非常长,影响性能和存储效率。
  3. 数据冗余
    • 每个文章记录都包含标签信息的副本,这可能导致数据冗余和存储空间的浪费。
  4. 数据一致性问题
    • 如果文章表中的tags字段和Tag表中的信息不同步,可能会导致数据一致性问题。
  5. 缺乏灵活性
    • 对于需要对标签进行复杂操作的场景(如标签的层级关系、标签的属性等),这种设计可能不够灵活。
  6. 难以维护
    • 当文章的标签需要更新时,可能需要同时更新文章表和Tag表,增加了维护的复杂性。
  7. 不支持全文搜索
    • 如果数据库或搜索引擎不支持对逗号分隔的字符串字段进行全文搜索,那么实现基于标签的搜索可能会更加困难。
  8. 性能瓶颈
    • 如果系统需要处理大量的标签或高并发的标签查询请求,文章表可能会成为性能瓶颈。

数据库设计方案2

三个表

  • Tag表
  • 文章表
  • tag与文章映射信息表

Tag表表结构:

字段 描述
id tag标签的ID
tagname tag内容
num 当前Tag的引用个数

文章表结构:

字段 描述
id 文章ID
title 文章标题
tags tags列表,多个以,分割

Tagmap表结构:

字段 描述
id 映射ID
tag_id 标签id
a_id 文章id

image-20211124181325452

每次发布内容和修改内容的时候 都去更新一下Tag表和 Tagmap表。

代码端查询过程:

1, 用户输入内容模糊匹配到标签

2, 标签去映射表里,找到多个标签id与文章对应的id.

3, 通过多个文章id, 找到文章

因为每次查询都是使用索引,所以效率较高。

优点

  • 索引使用:每次查询都利用索引,提高了查询效率。
  • 数据更新:发布或修改内容时,只需更新Tag表和Tagmap表,简化了数据维护流程。

结论

数据库设计方案2通过引入映射表,优化了标签与文章之间的关系管理,提高了查询效率和系统的可维护性。这种方案更适合需要高效检索和频繁更新内容的系统。

目录
相关文章
|
1月前
|
Cloud Native 数据管理 数据挖掘
核心系统转型问题之阿里云数据库用户需求的通用性和差异性如何平衡
核心系统转型问题之阿里云数据库用户需求的通用性和差异性如何平衡
|
2天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
3天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
29天前
|
SQL Oracle 关系型数据库
DBeaver,一款好用的开源数据库管理软件
DBeaver,一款好用的开源数据库管理软件
|
1月前
|
前端开发 数据库 虚拟化
太6了!用Python快速开发数据库入库系统
太6了!用Python快速开发数据库入库系统
|
1月前
|
缓存 NoSQL 数据库
Web服务器与数据库优化:提升系统性能的最佳实践
【8月更文第28天】在现代的Web应用中,Web服务器与后端数据库之间的交互是至关重要的部分。优化这些组件及其相互作用可以显著提高系统的响应速度、吞吐量和可扩展性。本文将探讨几种常见的优化策略,并提供一些具体的代码示例。
54 1
|
1月前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的选课管理系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js技术栈的高校选课管理系统的设计与实现。该系统采用前后端分离架构,旨在提高选课效率、优化资源分配及提升用户体验。技术栈包括:后端Spring Boot 2.0、前端Vue 2.0、数据库MySQL 8.0、开发环境JDK 1.8和Maven 3.6等。系统功能覆盖登录、学生信息管理、选课管理、成绩查询等多个方面,并针对学生、教师和管理员提供了不同的操作界面。系统采用了响应式设计,支持多设备访问,并通过Element UI增强了界面的友好性和交互性。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的选课管理系统(含教程&源码&数据库数据)
|
27天前
|
存储 SQL NoSQL
详解数据库管理系统(DBMS)
【8月更文挑战第31天】
26 0
|
11天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
13天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
138 11