千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > mysql怎么設(shè)計(jì)才能讓一個(gè)文章對(duì)應(yīng)多個(gè)tag?

mysql怎么設(shè)計(jì)才能讓一個(gè)文章對(duì)應(yīng)多個(gè)tag?

來(lái)源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-10-13 20:41:39 1697200899

一、mysql讓一個(gè)文章對(duì)應(yīng)多個(gè)tag的設(shè)計(jì)方法

要讓一篇文章可以對(duì)應(yīng)多個(gè)tag,通常需要設(shè)計(jì)一個(gè)多對(duì)多的關(guān)系,這可以通過(guò)引入一個(gè)中間表來(lái)實(shí)現(xiàn)。

具體來(lái)說(shuō),將文章和標(biāo)簽分別看作兩個(gè)實(shí)體,通過(guò)一個(gè)中間表來(lái)建立它們之間的多對(duì)多關(guān)系。中間表包含兩個(gè)外鍵,分別指向文章和標(biāo)簽表中對(duì)應(yīng)的記錄。每當(dāng)一篇文章與一個(gè)或多個(gè)標(biāo)簽產(chǎn)生關(guān)聯(lián)時(shí),就在中間表中插入相應(yīng)的記錄,同時(shí)記錄對(duì)應(yīng)的文章ID和標(biāo)簽ID。

這樣設(shè)計(jì)的好處是,可以輕松地查詢某個(gè)標(biāo)簽下的所有文章,也可以方便地查找某篇文章所對(duì)應(yīng)的所有標(biāo)簽。如果需要添加或刪除文章與標(biāo)簽之間的關(guān)系,只需在中間表中插入或刪除記錄即可,不會(huì)對(duì)文章或標(biāo)簽本身造成影響。

以下是一個(gè)簡(jiǎn)單的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表:存儲(chǔ)文章的基本信息;tags表:存儲(chǔ)標(biāo)簽的名稱;article_tags表:作為中間表,建立文章和標(biāo)簽之間的多對(duì)多關(guān)系。

二、3種高效的Tags標(biāo)簽系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)方案

目前主流的博客系統(tǒng)、CMS都會(huì)有一個(gè)TAG標(biāo)簽系統(tǒng),不僅可以讓內(nèi)容鏈接的結(jié)構(gòu)化增強(qiáng),而且可以讓文章根據(jù)Tag來(lái)區(qū)分。相比傳統(tǒng)老式的Keyword模式,這種Tag模式可以單獨(dú)的設(shè)計(jì)一個(gè)Map的映射表來(lái)增加系統(tǒng)的負(fù)載和查詢的效率。

1、數(shù)據(jù)庫(kù)設(shè)計(jì)方案1

此方案分為2個(gè)表:

Tag表文章表

Tag表表結(jié)構(gòu)代碼如下:

tagid # tag標(biāo)簽的ID
tagname #tag內(nèi)容
num #當(dāng)前Tag的引用個(gè)數(shù)

文章表結(jié)構(gòu)代碼如下:

ID #文章ID
title #文章標(biāo)題
tags #tags列表,多個(gè)以,分割
tagid #tags的ID 多個(gè)以,分割

此種方式Tag標(biāo)簽主要內(nèi)容保存在文章表中,對(duì)于Tag表的壓力較小,只是添加的時(shí)候更新一下Tag的引用數(shù)量,但是查詢的時(shí)候效率不足,不是好辦法。

2、數(shù)據(jù)庫(kù)設(shè)計(jì)方案2

第二種方案使用2個(gè)Tag表,其中一個(gè)保存Tag信息,另一個(gè)保存映射信息:

Tag表代碼如下:

tagid # tag標(biāo)簽的ID
tagname #tag內(nèi)容
num #當(dāng)前Tag的引用個(gè)數(shù)

Tagmap表代碼如下:

tagid
aid

文章表代碼如下:

ID #文章ID
title #文章標(biāo)題
tags #tags列表,多個(gè)以,分割

這種形式,每次發(fā)布內(nèi)容和修改內(nèi)容的時(shí)候都去更新一下Tag表和 Tagmap表。查詢的時(shí)候需要從Tagmap表中查找響應(yīng)的文章ID,然后使用文章ID去查詢具體的文章信息,因?yàn)槊看尾樵兌际鞘褂盟饕孕瘦^高。

3、數(shù)據(jù)庫(kù)設(shè)計(jì)方案3

前兩種方案都是使用純粹的Mysql來(lái)設(shè)計(jì)的,第三種方案將使用Nosql的魅力來(lái)設(shè)計(jì)。基本結(jié)構(gòu)同方案2,只是在Tag表和Tagmap表中使用mongo/redis這樣的nosql數(shù)據(jù)庫(kù)服務(wù)器,這樣可以發(fā)揮nosql數(shù)據(jù)庫(kù)強(qiáng)大的線性查詢能力。

三、MySQL數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范

1、數(shù)據(jù)命名規(guī)范

所有數(shù)據(jù)庫(kù)對(duì)象名稱必須使用小寫字母并用下劃線分割。所有數(shù)據(jù)庫(kù)對(duì)象名稱禁止使用 MySQL 保留關(guān)鍵字(如果表名中包含關(guān)鍵字查詢時(shí),需要將其用單引號(hào)括起來(lái))。數(shù)據(jù)庫(kù)對(duì)象的命名要能做到見名識(shí)意,并且最后不要超過(guò) 32 個(gè)字符。臨時(shí)庫(kù)表必須以 tmp?為前綴并以日期為后綴,備份表必須以 bak?為前綴并以日期 (時(shí)間戳) 為后綴。所有存儲(chǔ)相同數(shù)據(jù)的列名和列類型必須一致(一般作為關(guān)聯(lián)列,如果查詢時(shí)關(guān)聯(lián)列類型不一致會(huì)自動(dòng)進(jìn)行數(shù)據(jù)類型隱式轉(zhuǎn)換,會(huì)造成列上的索引失效,導(dǎo)致查詢效率降低)。

2、數(shù)據(jù)庫(kù)基本設(shè)計(jì)規(guī)范

所有表必須使用 InnoDB 存儲(chǔ)引擎:沒有特殊要求(即 InnoDB 無(wú)法滿足的功能如:列存儲(chǔ),存儲(chǔ)空間數(shù)據(jù)等)的情況下,所有表必須使用 InnoDB 存儲(chǔ)引擎 MySQL 5.5 之前默認(rèn)使用 Myisam,5.6 以后默認(rèn)的為 InnoDBInnoDB 支持事務(wù),支持行級(jí)鎖,更好的恢復(fù)性,高并發(fā)下性能更好。數(shù)據(jù)庫(kù)和表的字符集統(tǒng)一使用 UTF8MB4:兼容性更好,統(tǒng)一字符集可以避免由于字符集轉(zhuǎn)換產(chǎn)生的亂碼,不同的字符集進(jìn)行比較前需要進(jìn)行轉(zhuǎn)換會(huì)造成索引失效。所有表和字段都需要添加注釋:使用 comment 從句添加表和列的備注,從一開始就進(jìn)行數(shù)據(jù)字典的維護(hù)。盡量控制單表數(shù)據(jù)量的大小,建議控制在 500 萬(wàn)以內(nèi):500 萬(wàn)并不是 MySQL 數(shù)據(jù)庫(kù)的限制,過(guò)大會(huì)造成修改表結(jié)構(gòu)、備份、恢復(fù)都會(huì)有很大的問(wèn)題,可以用歷史數(shù)據(jù)歸檔(應(yīng)用于日志數(shù)據(jù)),分庫(kù)分表(應(yīng)用于業(yè)務(wù)數(shù)據(jù))等手段來(lái)控制數(shù)據(jù)量大小。謹(jǐn)慎使用 MySQL 分區(qū)表:分區(qū)表在物理上表現(xiàn)為多個(gè)文件,在邏輯上表現(xiàn)為一個(gè)表。謹(jǐn)慎選擇分區(qū)鍵,跨分區(qū)查詢效率可能更低。建議采用物理分表的方式管理大數(shù)據(jù)。盡量做到冷熱數(shù)據(jù)分離,減小表的寬度:MySQL 限制每個(gè)表非常多存儲(chǔ) 4096 列,并且每一行數(shù)據(jù)的大小不能超過(guò) 65535 字節(jié)。減少磁盤 IO,保證熱數(shù)據(jù)的內(nèi)存緩存命中率(表越寬,把表裝載進(jìn)內(nèi)存緩沖池時(shí)所占用的內(nèi)存也就越大,也會(huì)消耗更多的 IO)。更有效的利用緩存,避免讀入無(wú)用的冷數(shù)據(jù)。經(jīng)常一起使用的列放到一個(gè)表中(避免更多的關(guān)聯(lián)操作)。禁止在表中建立預(yù)留字段:預(yù)留字段的命名很難做到見名識(shí)義。預(yù)留字段無(wú)法確認(rèn)存儲(chǔ)的數(shù)據(jù)類型,所以無(wú)法選擇合適的類型。對(duì)預(yù)留字段類型的修改,會(huì)對(duì)表進(jìn)行鎖定。禁止在數(shù)據(jù)庫(kù)中存儲(chǔ)圖片,文件等大的二進(jìn)制數(shù)據(jù):通常文件很大,會(huì)短時(shí)間內(nèi)造成數(shù)據(jù)量快速增長(zhǎng),數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)庫(kù)讀取時(shí),通常會(huì)進(jìn)行大量的隨機(jī) IO 操作,文件很大時(shí),IO 操作很耗時(shí)。通常存儲(chǔ)于文件服務(wù)器,數(shù)據(jù)庫(kù)只存儲(chǔ)文件地址信息。

延伸閱讀1:MySQL是什么

MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是較好的 RDBMS(Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
為什么Go允許百萬(wàn)級(jí)別的 goroutines,而Java只允許數(shù)千級(jí)別的threads?

一、Go允許百萬(wàn)級(jí)別的 goroutines,而Java只允許數(shù)千級(jí)別的threads的原因Go允許百萬(wàn)級(jí)別的goroutines,而Java只允許數(shù)千級(jí)別的threads是因?yàn)樗?..詳情>>

2023-10-13 22:31:53
互聯(lián)網(wǎng)、金融這兩個(gè)領(lǐng)域上用于數(shù)據(jù)挖掘、數(shù)據(jù)分析的數(shù)據(jù)庫(kù)是什么?

一、互聯(lián)網(wǎng)、金融這兩個(gè)領(lǐng)域上用于數(shù)據(jù)挖掘、數(shù)據(jù)分析的數(shù)據(jù)庫(kù)1、MySQLMySQL 是一個(gè)流行的開源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),廣泛用于互聯(lián)網(wǎng)和金融領(lǐng)域...詳情>>

2023-10-13 22:13:51
Oracle數(shù)據(jù)庫(kù)中生產(chǎn)庫(kù)、查詢庫(kù)、測(cè)試庫(kù)有什么區(qū)別?

一、Oracle數(shù)據(jù)庫(kù)中生產(chǎn)庫(kù)、查詢庫(kù)、測(cè)試庫(kù)的區(qū)別生產(chǎn)庫(kù)、查詢庫(kù)和測(cè)試庫(kù)是Oracle數(shù)據(jù)庫(kù)中不同目的的數(shù)據(jù)庫(kù)環(huán)境。生產(chǎn)庫(kù)用于實(shí)際業(yè)務(wù)運(yùn)行,查詢...詳情>>

2023-10-13 22:08:17
Database CAN中的Update Bit是什么含義?

一、Database CAN中的Update Bit的含義在Controller Area Network (CAN) 數(shù)據(jù)庫(kù)中,Update Bit 是用于表示 CAN 數(shù)據(jù)幀的更新狀態(tài)的位。在 C詳情>>

2023-10-13 21:43:36
數(shù)據(jù)庫(kù)對(duì)于同一查詢,為什么每次查詢時(shí)間會(huì)不一樣?

一、數(shù)據(jù)庫(kù)對(duì)于同一查詢,每次查詢時(shí)間會(huì)不一樣的原因1、有內(nèi)部操作查詢語(yǔ)句中的內(nèi)部操作,例如排序、分組、連接等,也會(huì)影響查詢的執(zhí)行時(shí)間。2...詳情>>

2023-10-13 21:22:37
快速通道
久久亚洲中文字幕精品一区四,亚洲日本另类欧美一区二区,久久久久久久这里只有免费费精品,高清国产激情视频在线观看
亚洲国产精品久久三级视频 | 在线国产视频不卡 | 日韩中文字幕在线一区二区三区 | 午夜性色福利视频久久久久 | 亚洲中文字幕码在线电影 | 中文字幕人成乱码熟女免费 |