You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单首歌曲对应多位艺术家的SQL数据库建模最优方案咨询

单首歌曲对应多位艺术家的最优SQL建模方案

歌曲与艺术家属于多对多关系(一首歌可关联多位艺术家,一位艺术家可参与多首歌),最优建模方案是采用三表规范化结构,完全符合SQL设计规范,以下是详细方案及对比分析:


1. 核心表结构设计

艺术家表(artists)

存储独立的艺术家信息,确保每个艺术家唯一:

CREATE TABLE artists (
    id INT PRIMARY KEY AUTO_INCREMENT,
    artist_name VARCHAR(255) NOT NULL UNIQUE
);

数据示例:

idartist_name
1Knife Party
2Tom Morello
3Nero

歌曲表(songs)

存储歌曲基础信息,不直接关联艺术家:

CREATE TABLE songs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    song_title VARCHAR(255) NOT NULL
);

数据示例:

idsong_title
1Battle Sirens
2Internet Friends
3Satisfy

歌曲-艺术家关联表(song_artist_assoc)

存储歌曲与艺术家的关联关系,每条记录对应一对“歌曲-艺术家”关联:

CREATE TABLE song_artist_assoc (
    song_id INT NOT NULL,
    artist_id INT NOT NULL,
    PRIMARY KEY (song_id, artist_id), -- 联合主键避免重复关联
    FOREIGN KEY (song_id) REFERENCES songs(id) ON DELETE CASCADE,
    FOREIGN KEY (artist_id) REFERENCES artists(id) ON DELETE CASCADE
);

数据示例:

song_idartist_id
11
12
21
33

2. 方案对比分析

针对你提到的两种思路,优劣如下:

  • 思路1:艺术家组合表
    这种设计给每个艺术家组合分配唯一ID,存在严重缺陷:

    • 数据冗余:同一艺术家组合若出现在多首歌中,需重复创建组合记录
    • 查询低效:若要单独查询某艺术家的作品,需拆解组合ID,无法利用SQL索引优化
    • 维护复杂:组合成员变动时,需同时修改组合表和歌曲表,操作成本高
  • 思路2:三表关联结构(推荐)
    这是SQL多对多关系的标准设计,优势明显:

    • 无冗余数据:每个艺术家和歌曲仅存储一次,关联关系通过中间表记录
    • 扩展性极强:支持任意数量的艺术家关联,新增/移除关联仅需操作中间表
    • 查询灵活高效:可轻松实现“某歌曲的所有艺术家”“某艺术家的所有歌曲”等需求,完全适配SQL的规范化查询

3. 常用查询示例

查询指定歌曲的所有艺术家

SELECT a.artist_name
FROM songs s
JOIN song_artist_assoc sa ON s.id = sa.song_id
JOIN artists a ON sa.artist_id = a.id
WHERE s.song_title = 'Battle Sirens';

返回结果:

artist_name
Knife Party
Tom Morello

查询指定艺术家的所有歌曲

SELECT s.song_title
FROM artists a
JOIN song_artist_assoc sa ON a.id = sa.artist_id
JOIN songs s ON sa.song_id = s.id
WHERE a.artist_name = 'Knife Party';

返回结果:

song_title
Battle Sirens
Internet Friends

内容的提问来源于stack exchange,提问作者Ishvara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:20:21