首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL 用戶-愛好多對多關聯表設計:中間表優於字段存逗號分隔 ID

     編輯:程式設計綜合問答

需求:用戶表 `member`、愛好表 `hobby`,一個用戶多愛好,查詢「某愛好下所有用戶」。

方案對比

方案結構查詢「愛好=1 的用戶」優點缺點
字段存 CSV`member.hobby_ids` = "1,3,5"`WHERE FIND_IN_SET('1', hobby_ids)`單表、簡單無索引、全表掃描、修改困難、無外鍵完整性
中間表 (推薦)`member_hobby (member_id, hobby_id)`
雙主鍵 + 兩外鍵
`SELECT m.* FROM member m JOIN member_hobby mh ON m.id=mh.member_id WHERE mh.hobby_id=1`索引高效、完整性約束、擴展屬性(創建時間/權重)、符合範式多一張表、Join 開銷

中間表 DDL

CREATE TABLE member_hobby (
    member_id INT NOT NULL,
    hobby_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (member_id, hobby_id),
    FOREIGN KEY (member_id) REFERENCES member(id) ON DELETE CASCADE,
    FOREIGN KEY (hobby_id) REFERENCES hobby(id) ON DELETE CASCADE
) ENGINE=InnoDB;

擴展場景

  • 愛好屬性 (如「游泳-自由泳/蛙泳」) → `hobby` 表加 `parent_id` 做樹形,或單獨 `hobby_tag` 表。
  • 用戶標簽權重/推薦 → `member_hobby` 加 `weight`、`source` 字段。
  • 高頻查詢「用戶所有愛好」 → `member_hobby` 加 `INDEX (member_id)` (主鍵已含) 覆蓋索引。

結論:**業務上「多對多」堅決用中間表**,CSV 字段僅適合極簡原型、唯讀、數據量極小 (<1000 行) 場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved