3

我正在创建一个音乐数据库。

我想我需要 3 个表playlistmusic和一个表将它们链接在一起。

Playlist table:
play_id PK,
Created_By,
play_name

music table:
music_id PK,
track_title,
artist,
album

我希望用户创建任意数量的播放列表。他们可以根据需要向播放列表添加任意数量的曲目。我了解表的播放列表部分,但是当它从音乐表中将曲目添加到播放列表表时,它会变得模糊。如果我的音乐表里装满了曲目,我怎么能说 2 首曲目出现在一个播放列表中?

我有点不确定如何执行此操作,以及我的表结构是否良好,或者我是否需要添加更多字段。我不确定它是否与主键和外键有关我假设我需要一个单独的表来链接它们。任何帮助,将不胜感激。

4

2 回答 2

3

如果我的音乐表里装满了曲目,我怎么能说 2 首曲目出现在一个播放列表中?

你应该有类似的东西:

Tracks

  • TrackId,
  • Title,
  • ...

PlaylistsTracks

  • Id,
  • PlayListId,
  • TrackId,
  • ...

对于您已经拥有的另外两个表:

播放列表表:play_id PK、Created_By、play_name

音乐表:music_id PK、track_title、艺术家、专辑

这些表有问题。您的表格以这种方式未标准化。您应该创建两个额外的表:

Users

  • Id,
  • Name,
  • ..

Artists

  • ID,
  • Name,
  • ...

然后:

  • 使Created_By引用该users(Id)列的外键。
  • ArtistID在表中创建外键,music而不是在artist列中创建引用Artists(ID)
  • 制作track_id列而不是表中的track_titlemusic
于 2012-11-17T20:01:58.560 回答
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 条目在曲目列表的不同位置多次出现在播放列表中。

编辑添加外键约束。

于 2012-11-17T20:00:31.360 回答