美文网首页
MySQL 中的标签系统设计实践分享

MySQL 中的标签系统设计实践分享

作者: 且须文雅 | 来源:发表于2025-04-16 07:25 被阅读0次

MySQL 中的标签系统设计实践分享

在项目中,我们经常需要给数据打上标签,比如产品的属性、用户的兴趣、文章的分类等。标签的设计好坏会直接影响到数据的可扩展性、查询效率以及后续的统计分析能力。本文总结了几种常见的标签设计方式,并结合实际项目场景,给出推荐方案与查询优化实践。


方式一:使用 SET 类型(不推荐)

CREATE TABLE items (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    tags SET('手机', '苹果', '旗舰', '国产')
);
  • ✅ 优点:简单、存储紧凑、插入和读取方便。
  • ❌ 缺点:
    • 不支持标签扩展(新增需修改表结构)。
    • 查询不灵活,需使用 FIND_IN_SET(),效率差。
    • 无法关联标签表,不支持规范化管理。

适用场景:小型项目,标签固定且不需要灵活查询时使用。


方式二:用字符串字段保存多个标签(如 "手机,苹果,旗舰")

CREATE TABLE items (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    tags VARCHAR(255)  -- 如 '手机,苹果,旗舰'
);
  • ✅ 优点:开发简单,插入方便。
  • ❌ 缺点:
    • 查询复杂、效率低(需用 LIKEFIND_IN_SET)。
    • 容易出现拼写不一致、大小写不统一。
    • 无法统计标签使用情况。

适用场景:前期原型或展示为主的轻量应用。


✅ 推荐方式:多对多关联表设计

CREATE TABLE items (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE tags (
    id INT PRIMARY KEY,
    name VARCHAR(100) UNIQUE
);

CREATE TABLE item_tags (
    item_id INT,
    tag_id INT,
    PRIMARY KEY (item_id, tag_id),
    FOREIGN KEY (item_id) REFERENCES items(id),
    FOREIGN KEY (tag_id) REFERENCES tags(id)
);
  • ✅ 优点:
    • 灵活扩展,标签可复用。
    • 查询、统计、搜索都方便。
    • 数据结构规范,支持维护。
  • ❌ 缺点:写法稍复杂,需要多表 join。

适用场景:大部分需要灵活标签管理、可维护、可查询的业务系统。


标签查询示例:带出所有标签

SELECT 
    i.id,
    i.name,
    GROUP_CONCAT(t.name ORDER BY t.name SEPARATOR ',') AS tags
FROM 
    items i
LEFT JOIN item_tags it ON i.id = it.item_id
LEFT JOIN tags t ON it.tag_id = t.id
GROUP BY i.id, i.name;

示例输出:

id name tags
1 iPhone 15 手机,苹果,旗舰
2 小米13 国产,手机

查询含指定标签的数据(如同时有“旗舰”和“苹果”的)

SELECT 
    i.id,
    i.name,
    GROUP_CONCAT(t.name ORDER BY t.name) AS tags
FROM 
    items i
JOIN item_tags it ON i.id = it.item_id
JOIN tags t ON it.tag_id = t.id
WHERE 
    t.name IN ('旗舰', '苹果')
GROUP BY 
    i.id, i.name
HAVING 
    COUNT(DISTINCT t.name) = 2;

创建视图简化查询

CREATE VIEW item_with_tags AS
SELECT 
    i.id,
    i.name,
    GROUP_CONCAT(t.name ORDER BY t.name) AS tags
FROM 
    items i
LEFT JOIN item_tags it ON i.id = it.item_id
LEFT JOIN tags t ON it.tag_id = t.id
GROUP BY i.id, i.name;

之后可以像查普通表一样查带标签的数据:

SELECT * FROM item_with_tags WHERE tags LIKE '%旗舰%';

总结

类型 适用场景 推荐程度
SET 标签固定,不需要查询 ⭐⭐
字符串 小项目,原型,展示用途 ⭐⭐⭐
多对多表结构 可扩展、可查询、可维护系统 ⭐⭐⭐⭐⭐

设计标签系统时,优先考虑未来是否需要灵活查询、统计分析、批量管理等功能。如果答案是“是”,就建议使用多对多结构搭配 GROUP_CONCAT() 实现查询聚合,这种方式灵活、标准、扩展性强,已经被广泛应用于生产环境中。

相关文章

  • monolake 的GeekBand C++开发学习笔记(十二)

    前记:本周进入C++开发课程最后一门课:系统设计与实践。董飞老师从实践的角度讲解了系统设计中的要点;系统设计中的七...

  • 千万级MySQL数据库建立索引,提高性能的秘诀

    实践中如何优化MySQL 实践中,MySQL的优化主要涉及SQL语句及索引的优化、数据表结构的优化、系统配置的优化...

  • 如何设计一套标签系统

    NOTE:本篇文章讨论的标签系统设计和设计一套数据库标签系统是不同的,本文针对的是UI/UE设计为基础设计标签,注...

  • 如何进行非标设计

    标签: 设计实践 1.关于非标设计的思考 小编在此篇中主要论述下非标设计的定义,非标设计考虑的内容,设计的基本流程...

  • 推荐系统实践-标签系统

    此文是根据《推荐系统实践》部分整理而来。 PART 1 介绍 GroupLens在一篇文章中表示目前流行的推荐...

  • 标签学问

    标签系统在很多的模块中会使用到,如何设计标签系统。1、标签是否系统内置标签(用户只做选择)2、标签的长度限制3、每...

  • 标签系统的设计

    推荐、精准营销作为重要的业务场景,广泛存在于当今互联网。一些主要的领域、公司都推出了相关的产品和服务,包括: 亚马...

  • Mac下 MySQL重置初始密码

    去年安装MySQL,一直没有实践。如今实践,却知道安装好MySQL以后,系统给了个默认的的密码,但是本人给忘了,需...

  • 第二章 在线教育平台(数据库设计)

    数据库设计(model分层设计) 标签:mysql python2.7 django1.9.8 APP分类 Use...

  • 数据库与Mariadb

    标签(空格分隔): Linux 运维 MySQL sql文件hellodb.sql 架构 MySQL被设计为一个单...

网友评论

      本文标题:MySQL 中的标签系统设计实践分享

      本文链接:https://www.haomeiwen.com/subject/tsgsbjtx.html