千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > mysql怎么设计才能让一个文章对应多个tag?

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

来源:千锋教育
发布人:xqq
时间: 2023-10-13 20:41:39 1697200899

一、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,关系数据库管理系统)应用软件之一。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT