MySQL 中的標簽系統設計實踐分享

MySQL 中的標簽系統設計實踐分享

在項目中,我們經常需要給數據打上標簽,比如產品的屬性、用戶的興趣、文章的分類等。標簽的設計好壞會直接影響到數據的可擴展性、查詢效率以及后續的統計分析能力。本文總結了幾種常見的標簽設計方式,并結合實際項目場景,給出推薦方案與查詢優化實踐。


方式一:使用 SET 類型(不推薦)

CREATE TABLE items (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    tags SET('手機', '蘋果', '旗艦', '國產')
);
  • ? 優點:簡單、存儲緊湊、插入和讀取方便。
  • ? 缺點:
    • 不支持標簽擴展(新增需修改表結構)。
    • 查詢不靈活,需使用 FIND_IN_SET(),效率差。
    • 無法關聯標簽表,不支持規范化管理。

適用場景:小型項目,標簽固定且不需要靈活查詢時使用。


方式二:用字符串字段保存多個標簽(如 "手機,蘋果,旗艦")

CREATE TABLE items (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    tags VARCHAR(255)  -- 如 '手機,蘋果,旗艦'
);
  • ? 優點:開發簡單,插入方便。
  • ? 缺點:
    • 查詢復雜、效率低(需用 LIKEFIND_IN_SET)。
    • 容易出現拼寫不一致、大小寫不統一。
    • 無法統計標簽使用情況。

適用場景:前期原型或展示為主的輕量應用。


? 推薦方式:多對多關聯表設計

CREATE TABLE items (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE tags (
    id INT PRIMARY KEY,
    name VARCHAR(100) UNIQUE
);

CREATE TABLE item_tags (
    item_id INT,
    tag_id INT,
    PRIMARY KEY (item_id, tag_id),
    FOREIGN KEY (item_id) REFERENCES items(id),
    FOREIGN KEY (tag_id) REFERENCES tags(id)
);
  • ? 優點:
    • 靈活擴展,標簽可復用。
    • 查詢、統計、搜索都方便。
    • 數據結構規范,支持維護。
  • ? 缺點:寫法稍復雜,需要多表 join。

適用場景:大部分需要靈活標簽管理、可維護、可查詢的業務系統。


標簽查詢示例:帶出所有標簽

SELECT 
    i.id,
    i.name,
    GROUP_CONCAT(t.name ORDER BY t.name SEPARATOR ',') AS tags
FROM 
    items i
LEFT JOIN item_tags it ON i.id = it.item_id
LEFT JOIN tags t ON it.tag_id = t.id
GROUP BY i.id, i.name;

示例輸出:

id name tags
1 iPhone 15 手機,蘋果,旗艦
2 小米13 國產,手機

查詢含指定標簽的數據(如同時有“旗艦”和“蘋果”的)

SELECT 
    i.id,
    i.name,
    GROUP_CONCAT(t.name ORDER BY t.name) AS tags
FROM 
    items i
JOIN item_tags it ON i.id = it.item_id
JOIN tags t ON it.tag_id = t.id
WHERE 
    t.name IN ('旗艦', '蘋果')
GROUP BY 
    i.id, i.name
HAVING 
    COUNT(DISTINCT t.name) = 2;

創建視圖簡化查詢

CREATE VIEW item_with_tags AS
SELECT 
    i.id,
    i.name,
    GROUP_CONCAT(t.name ORDER BY t.name) AS tags
FROM 
    items i
LEFT JOIN item_tags it ON i.id = it.item_id
LEFT JOIN tags t ON it.tag_id = t.id
GROUP BY i.id, i.name;

之后可以像查普通表一樣查帶標簽的數據:

SELECT * FROM item_with_tags WHERE tags LIKE '%旗艦%';

總結

類型 適用場景 推薦程度
SET 標簽固定,不需要查詢 ??
字符串 小項目,原型,展示用途 ???
多對多表結構 可擴展、可查詢、可維護系統 ?????

設計標簽系統時,優先考慮未來是否需要靈活查詢、統計分析、批量管理等功能。如果答案是“是”,就建議使用多對多結構搭配 GROUP_CONCAT() 實現查詢聚合,這種方式靈活、標準、擴展性強,已經被廣泛應用于生產環境中。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容