SQL:多对多的分辨率和交集实体

时间:2014-12-23 18:38:04

标签: java sql database oracle oracle11g

使用多对多关系,交叉表用于将此解析为两个一对多关系。我的问题是我目前有2个表,"播放列表"和#34;歌曲"。每首歌曲都出现在许多播放列表中,每个播放列表可以包含许多歌曲。要解决此问题,请添加第三个表," songlog"解决很多很多。

我理解这一点,但是,当涉及到将值添加到数据库中时,我有点困惑。例如,如何使用交集表将一些(例如4首)歌曲添加到播放列表表格中?另外,我如何添加哪些歌曲在哪个播放列表中的详细信息? 我是否犯了这个错误,这是真的很多,还是我完全咆哮错了?

我非常困惑,所以对这个设计领域的清晰而基本的解释可能会有所帮助!非常感谢。

3 个答案:

答案 0 :(得分:1)

这是一个操作问题的顺序:Codewise我们必须首先添加歌曲才能将它们添加到PlayListSongs。但是从用户的角度来看,我们可能会允许他们在更新列表的同时将歌曲添加到列表中。

PlayList (ID, Name)
1 My List 1
2 My List 2

Song (ID, Name)
1 Song A
2 Song B
3 Song C


PlayListSongs (PlayListID, SongID), (or what you called songLog)
1 1
1 2
1 3
2 3

添加歌曲时,必须先将它们添加到歌曲表中获取ID,然后将该关系添加到播放列表中。从用户界面,您可以一次为用户执行此操作。允许他们将歌曲添加到现有的播放列表中,但是,您必须首先将列表添加到歌曲表中,然后将其添加到下面的playListSongs ...插图中。

活动 - 用户添加新歌"歌曲D"到他们的播放列表"我的列表1"

  1. 他们与输入所需信息的用户界面进行互动
  2. 应用程序调用一个程序,首先将歌曲信息保存到歌曲表中。这导致并输入" 4 Song D"
  3. 该过程捕获创建的新ID,并将其与当前选定的播放列表一起使用,以在PlayListSongs中添加条目(1,4)
  4. 活动 - 用户只想添加一堆歌曲  1.我们保存歌曲信息使用进入歌曲表

    事件 - 用户想要创建带有歌曲的新播放列表  1.我们在PlayList中插入一条新记录  2.我们允许用户选择现有歌曲(这只会产生条目  3.我们允许用户动态创建新歌曲添加到歌曲表并自动添加到所选的播放列表。

答案 1 :(得分:1)

让我们稍微解决问题。

你有歌。

CREATE TABLE Songs
(
  SongID int,
  SongName varchar(50)
);

您已获得播放列表信息。 (创建它的播放列表的名称,无论如何)。

CREATE TABLE PlaylistDef
(
  PlaylistID int,
  PlaylistName varchar(50)  
);

您有播放列表中的歌曲。歌曲可以在多个播放列表中。

CREATE TABLE Playlist
(
  PlaylistID int,
  SongID int
);

让我们填充表格:

INSERT INTO Songs
(SongID, SongName)
VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D'),
(5, 'E');

INSERT INTO PlaylistDef
(PlaylistID, PlaylistName)
VALUES
(1, 'a'),
(2, 'b');


INSERT INTO Playlist
(PlaylistID, SongID)
VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(2, 2),
(2, 3),
(2, 4),
(2, 5);

然后,您现在可以运行类似这样的内容来查看特定的播放列表。

SELECT * FROM Playlist WITH (NOLOCK) WHERE PlaylistID = 2

它将返回:

PLAYLISTID  SONGID
2           2
2           3
2           4
2           5

这有帮助吗?

答案 2 :(得分:0)

对于您的交叉路口表,您可能会有以下内容:

<强>歌曲

id
title
artist
length

<强>播放列表

id
title

<强> playlists_songs

song_id
playlist_id
order

对于您应用中的每首歌曲,将会有一行。对于每个播放列表,将有一行。对于任何给定播放列表中的歌曲,将有多行。在各自的表格中有歌曲和播放列表行后,您可以将歌曲添加到播放列表中。为此,您需要在 playlists_songs 表中插入一行song_id(这些将是不同的)和playlist_id(这些将是相同的)用于添加操作。此外,该表存储播放列表中歌曲的顺序,以便您以后可以对其进行排序。查询可能如下所示:

INSERT INTO playlists_songs (song_id, playlist_id, order) VALUES (1, 1, 1)
INSERT INTO playlists_songs (song_id, playlist_id, order) VALUES (2, 1, 2)
INSERT INTO playlists_songs (song_id, playlist_id, order) VALUES (3, 1, 3)
INSERT INTO playlists_songs (song_id, playlist_id, order) VALUES (4, 1, 4)

上面会将id为1,2,3和4的歌曲添加到ID为1的播放列表中。要获取播放列表1的歌曲,您可以执行以下操作:

SELECT s.*
FROM songs AS s
    INNER JOIN playlists_songs AS p 
        ON p.song_id = s.song_id
WHERE p.playlist_id = 1
ORDER BY p.order