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,关系数据库管理系统)应用软件之一。
相关推荐HOT
更多>>python中ndarray与list转换的方法
python中ndarray与list转换的方法在python数据类型中,list元素可以任意类型组合,而ndarray元素类型必须相同,但是ndarray可以更方便的对多维...详情>>
2023-11-10 08:51:14python中OrdereDict如何使用?
python中OrdereDict如何使用?我们在对数据进行处理时,如果能够使它们保存顺序的排序,那么用起来会非常的便利。不过字典本身就是没有顺序的,...详情>>
2023-11-10 07:05:00python中如何使用scipy.fftpack模块计算快速傅里叶变换?
python中如何使用scipy.fftpack模块计算快速傅里叶变换?在编程中,快速傅里叶变换是工程中非常有价值的一类算法,它可以将时域和频域的信号相互...详情>>
2023-11-10 05:50:23zip()函数如何在python中遍历多个列表?
zip()函数如何在python中遍历多个列表?下面我们就python中zip的说明、语法、使用注意点进行讲解,然后带来遍历多个列表的实例。1、说明zip()函...详情>>
2023-11-10 05:38:33热门推荐
python concat函数有何用法?
沸python里函数装饰器怎么使用?
热如何实现python中的continue语句?
热python中的冒泡排序是什么?
新python中str函数是什么
如何使用python实现项目进度显示?
python中ndarray与list转换的方法
python复制文件的方法整理
Python中numpy数组如何添加元素
python有几种可视化图形库?
python中xlwings是什么?
python上下文管理器的基本介绍
Python自动化测试基础必备知识点一
python中OrdereDict如何使用?