通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

mysql怎么设计才能让一个文章对应多个tag

mysql让一个文章对应多个tag的设计方法:通过引入一个中间表来实现多对多的关系。具体来说,将文章和标签分别看作两个实体,通过一个中间表来建立它们之间的多对多关系。中间表包含两个外键,分别指向文章和标签表中对应的记录。

一、mysql让一个文章对应多个tag的设计方法

要让一篇文章可以对应多个tag,通常需要设计一个多对多的关系,这可以通过引入一个中间表来实现。

具体来说,将文章和标签分别看作两个实体,通过一个中间表来建立它们之间的多对多关系。中间表包含两个外键,分别指向文章和标签表中对应的记录。每当一篇文章与一个或多个标签产生关联时,就在中间表中插入相应的记录,同时记录对应的文章ID和标签ID。

这样设计的好处是,可以轻松地查询某个标签下的所有文章,也可以方便地查找某篇文章所对应的所有标签。如果需要添加或删除文章与标签之间的关系,只需在中间表中插入或删除记录即可,不会对文章或标签本身造成影响。

以下是一个简单的MySQL代码示例:

CREATE TABLE articles (
  id INT NOT NULL AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  content TEXT NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE tags (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE article_tags (
  article_id INT NOT NULL,
  tag_id INT NOT NULL,
  FOREIGN KEY (article_id) REFERENCES articles(id),
  FOREIGN KEY (tag_id) REFERENCES tags(id)
);

其中:

  • articles表:存储文章的基本信息;
  • tags表:存储标签的名称;
  • article_tags表:作为中间表,建立文章和标签之间的多对多关系。

二、3种高效的Tags标签系统数据库设计方案

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

1、数据库设计方案1

此方案分为2个表:

  • Tag表
  • 文章表

Tag表表结构代码如下:

tagid # tag标签的ID
tagname #tag内容
num #当前Tag的引用个数

文章表结构代码如下:

ID #文章ID
title #文章标题
tags #tags列表,多个以,分割
tagid #tags的ID 多个以,分割

此种方式Tag标签主要内容保存在文章表中,对于Tag表的压力较小,只是添加的时候更新一下Tag的引用数量,但是查询的时候效率不足,不是好办法。

2、数据库设计方案2

第二种方案使用2个Tag表,其中一个保存Tag信息,另一个保存映射信息:

Tag表代码如下:

tagid # tag标签的ID
tagname #tag内容
num #当前Tag的引用个数

Tagmap表代码如下:

tagid
aid

文章表代码如下:

ID #文章ID
title #文章标题
tags #tags列表,多个以,分割

这种形式,每次发布内容和修改内容的时候都去更新一下Tag表和 Tagmap表。查询的时候需要从Tagmap表中查找响应的文章ID,然后使用文章ID去查询具体的文章信息,因为每次查询都是使用索引,所以效率较高。

3、数据库设计方案3

前两种方案都是使用纯粹的Mysql来设计的,第三种方案将使用Nosql的魅力来设计。基本结构同方案2,只是在Tag表和Tagmap表中使用mongo/redis这样的nosql数据库服务器,这样可以发挥nosql数据库强大的线性查询能力。

三、MySQL数据库设计规范

1、数据命名规范

  • 所有数据库对象名称必须使用小写字母并用下划线分割。
  • 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)。
  • 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符。
  • 临时库表必须以 tmp 为前缀并以日期为后缀,备份表必须以 bak 为前缀并以日期 (时间戳) 为后缀。
  • 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)。

2、数据库基本设计规范

  • 所有表必须使用 InnoDB 存储引擎:没有特殊要求(即 InnoDB 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 InnoDB 存储引擎 MySQL 5.5 之前默认使用 Myisam,5.6 以后默认的为 InnoDBInnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。
  • 数据库和表的字符集统一使用 UTF8MB4:兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效。
  • 所有表和字段都需要添加注释:使用 comment 从句添加表和列的备注,从一开始就进行数据字典的维护。
  • 尽量控制单表数据量的大小,建议控制在 500 万以内:500 万并不是 MySQL 数据库的限制,过大会造成修改表结构、备份、恢复都会有很大的问题,可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小。
  • 谨慎使用 MySQL 分区表:分区表在物理上表现为多个文件,在逻辑上表现为一个表。谨慎选择分区键,跨分区查询效率可能更低。建议采用物理分表的方式管理大数据。
  • 尽量做到冷热数据分离,减小表的宽度:MySQL 限制每个表非常多存储 4096 列,并且每一行数据的大小不能超过 65535 字节。减少磁盘 IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的 IO)。更有效的利用缓存,避免读入无用的冷数据。经常一起使用的列放到一个表中(避免更多的关联操作)。
  • 禁止在表中建立预留字段:预留字段的命名很难做到见名识义。预留字段无法确认存储的数据类型,所以无法选择合适的类型。对预留字段类型的修改,会对表进行锁定。
  • 禁止在数据库中存储图片,文件等大的二进制数据:通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机 IO 操作,文件很大时,IO 操作很耗时。通常存储于文件服务器,数据库只存储文件地址信息。

延伸阅读1:MySQL是什么

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是较好的 RDBMS(Relational Database Management System,关系数据库管理系统)应用软件之一。

相关文章