单首歌曲对应多位艺术家的SQL数据库建模最优方案咨询
单首歌曲对应多位艺术家的最优SQL建模方案
歌曲与艺术家属于多对多关系(一首歌可关联多位艺术家,一位艺术家可参与多首歌),最优建模方案是采用三表规范化结构,完全符合SQL设计规范,以下是详细方案及对比分析:
1. 核心表结构设计
艺术家表(artists)
存储独立的艺术家信息,确保每个艺术家唯一:
CREATE TABLE artists ( id INT PRIMARY KEY AUTO_INCREMENT, artist_name VARCHAR(255) NOT NULL UNIQUE );
数据示例:
| id | artist_name |
|---|---|
| 1 | Knife Party |
| 2 | Tom Morello |
| 3 | Nero |
歌曲表(songs)
存储歌曲基础信息,不直接关联艺术家:
CREATE TABLE songs ( id INT PRIMARY KEY AUTO_INCREMENT, song_title VARCHAR(255) NOT NULL );
数据示例:
| id | song_title |
|---|---|
| 1 | Battle Sirens |
| 2 | Internet Friends |
| 3 | Satisfy |
歌曲-艺术家关联表(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_id | artist_id |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 3 | 3 |
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
相关产品推荐
相关产品推荐

