软件系统【标签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通过引入映射表,优化了标签与文章之间的关系管理,提高了查询效率和系统的可维护性。这种方案更适合需要高效检索和频繁更新内容的系统。

目录
相关文章
|
12天前
|
存储 安全 API
陪玩平台中支付与结算模块的代码,陪玩系统数据库设计与代码实现
第三方支付平台对接涉及与微信支付、支付宝等API接口的调用,确保用户支付流程顺畅。结算模块根据业务规则计算陪玩师收益,强调安全性、异常处理、可扩展性和日志记录。数据库设计涵盖用户、陪玩者、订单等信息的存储管理,确保系统稳定运行。
|
11天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
36 6
|
11天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
26 4
|
11天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
24 2
|
20天前
|
存储 Java 数据库连接
时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级
TDengine 3.3.5.0 版本正式发布,带来多项更新与优化。新特性包括提升 MQTT 稳定性和高并发性能、新增 taosX 增量备份与恢复、支持 JDBC 和 Rust 连接器 STMT2 接口、灵活配置 Grafana Dashboard 等。性能优化涵盖查询内存管控、多级存储迁移、强密码策略等,全面提升时序数据管理的效率和可靠性。欢迎下载体验并提出宝贵意见。
29 5
|
11天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的冬奥会科普平台设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
25 0
|
11天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
15天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
129 0
|
2月前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
66 3

热门文章

最新文章