这是新的,所以请耐心等待我。
我正在尝试创建一个由歌曲表中的歌曲组成的播放列表。
所以,我有一个像这样的基本设置。
songs
|song_id | title | artist |
| 1 | MyTitle | MyArtist |
理论上,该表可以容纳所有可用的歌曲。播放列表将由那些可用的歌曲制作。
该表格如
playlists
| id | playlist_name | playlist_songs |
但我不确定如何制作playlist_songs表。我认为它看起来像这样简单:
playlist_songs
| id | song_id (foreign key) |
它只是一堆行,每个行都引用song
表。问题在于我不知道如何“定位”这样的特定表。
另一种选择是将所有外国歌曲“平坦地”存储在一个字段中。
playlist songs
| id | song_ids |
| 1 | 1, 5, 4, 2, 11, 30, ...|
| 2 | 44, 43, 22, 1, 2, 40...|
然而,到目前为止,我所读到的关于数据库的所有内容都指出这是一个糟糕的解决方案,因为它不是正常形式..但是......我不知道如何将它置于正常形式!
答案 0 :(得分:1)
首先,您的playlist_songs
应该是关系表:
playlist_songs
| playlist_id (foreign key) | song_id (foreign key) |
因为一首歌可以属于多个播放列表而且一个播放列表可以有多首歌曲。
然后关于您的关注,在外键的定义中确保您正在寻找的特定表的引用。 如果仔细查看语法:
ALTER TABLE `playlist_songs`
ADD CONSTRAINT `playlist_songs_playlist` FOREIGN KEY (`playlist_id`) REFERENCES `playlist` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `playlist_songs_song` FOREIGN KEY (`song_id`) REFERENCES `song` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
该表与字段一起被引用以映射父项和子记录。
答案 1 :(得分:0)
你的三个表结构是正确的方法。与你的一点点偏离:
songs
|song_id | title | artist |
playlists
| playlist_id | playlist_name |
playlist_songs
| playlist_id | song_id |
然后获取您将使用的特定播放列表中的歌曲信息(SQL Fiddle):
SELECT pl.playlist_name, s.artist, s.title
FROM playlists AS pl
JOIN playlist_songs AS pls ON pl.playlist_id = pls.playlist_id
JOIN songs AS s ON pls.song_id = s.song_id
WHERE pl.playlist_id = 1
你绝对不希望:将所有外国歌曲“平稳地”存储在一个字段中。最好规范化数据。但是,只要查看该方法,就必须编写不必要的复杂查询来解析该字段中的歌曲。