我正在创建一个音乐数据库。
我想我需要3个表格,playlist
,music
和一个表格将它们链接在一起。
Playlist table:
play_id PK,
Created_By,
play_name
music table:
music_id PK,
track_title,
artist,
album
我希望用户可以根据需要创建任意数量的播放列表。他们可以根据需要向播放列表添加任意数量的曲目。我理解表格的播放列表部分,但是当它从音乐表格中添加曲目到播放列表表格时,它就变得模糊了。如果我有音乐表填充轨道我怎么能让我们说一个播放列表上显示2个曲目?
我有点不确定如何做到这一点,如果我的表结构好或者我需要添加更多字段。我不确定它是否与主键和外键有任何关系我假设我需要一个单独的表来链接它们。任何帮助将不胜感激。
答案 0 :(得分:2)
如果我有音乐表填充曲目我怎么能说 一个播放列表中会显示2个曲目?
你应该有类似的东西:
<强> Tracks
强>:
TrackId
,Title
, <强> PlaylistsTracks
强>:
Id
,PlayListId
,TrackId
,对于您已经拥有的另外两张表:
播放列表:play_id PK,Created_By,play_name
音乐表:music_id PK,track_title,艺术家,专辑
这些表格存在问题。您的表格不是normalized。您应该创建两个额外的表:
<强> Users
强>:
Id
,Name
, <强> Artists
强>:
ID
,Name
,然后:
Created_By
成为引用users(Id)
列的外键。ArtistID
表格中创建外键music
,而不是artist
列,引用Artists(ID)
。track_id
表格中设置track_title
列而不是music
列。答案 1 :(得分:1)
我认为你走在正确的轨道上。如下所示的表设置应该可以满足您的需求,我认为(这不是我的首要任务,所以请原谅任何语法问题):
DROP TABLE IF EXISTS tPlaylist;
CREATE TABLE tPlaylist (
playlistId INT,
/* ... Other Data ... */
PRIMARY KEY (playlistId)
);
DROP TABLE IF EXISTS tMusic;
CREATE TABLE tMusic (
musicId INT,
/* ... Other Data ... */
PRIMARY KEY (musicId)
);
DROP TABLE IF EXISTS tPlaylistMusicMap;
CREATE TABLE tPlaylistMusicMap (
mapId INT,
playlistId INT,
musicId INT,
trackNumber INT,
PRIMARY KEY (mapId),
/* ... Other Data ... */
FOREIGN KEY (playlistId) REFERENCES tPlaylist (playlistId),
FOREIGN KEY (musicId) REFERENCES tMusic (musicId),
UNIQUE KEY (playlistId, musicId, trackNumber)
);
这个的基本要点是让用户在tPlaylist表中创建播放列表(每个用户播放列表单行),将所有音乐曲目数据放在tMusic中,映射表tPlaylistMusicMap是每个曲目中的个别曲目播放列表得到存储。 playlistId,musicId和trackNumber上的唯一键允许相同的tMusic条目在曲目列表中的不同位置多次出现在播放列表中。
编辑添加外键约束。