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