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

Java SQL:多对多分辨率和交集实体,java,sql,database,oracle,oracle11g,Java,Sql,Database,Oracle,Oracle11g,对于多对多关系,使用交集表将其解析为两个一对多关系。我在这里的问题是,我目前有两个表,“播放列表”和“歌曲”。每首歌曲可以出现在多个播放列表中,并且每个播放列表可以包含多首歌曲。要解决此问题,请添加第三个表“songlog”来解决多对多问题 我了解这一点,但是,当涉及到向数据库中添加值时,我有点困惑。例如,如何使用交叉点表将一些(例如4首)歌曲添加到播放列表表中?此外,我将如何添加哪些歌曲在哪个播放列表中的详细信息? 我是不是搞错了,这是真的多对多,还是我完全找错了方向 我很困惑,所以对这一设计

对于多对多关系,使用交集表将其解析为两个一对多关系。我在这里的问题是,我目前有两个表,“播放列表”和“歌曲”。每首歌曲可以出现在多个播放列表中,并且每个播放列表可以包含多首歌曲。要解决此问题,请添加第三个表“songlog”来解决多对多问题

我了解这一点,但是,当涉及到向数据库中添加值时,我有点困惑。例如,如何使用交叉点表将一些(例如4首)歌曲添加到播放列表表中?此外,我将如何添加哪些歌曲在哪个播放列表中的详细信息? 我是不是搞错了,这是真的多对多,还是我完全找错了方向


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

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

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,然后将关系添加到播放列表中。通过用户界面,您可以为用户一次完成这一切。但是,通过允许他们将歌曲添加到现有播放列表中,您必须在封面下首先将列表添加到歌曲表中,然后将其添加到播放列表中。。。下图

事件-用户将新歌“歌曲D”添加到其播放列表“我的列表1”中

  • 它们与输入所需信息的UI交互
  • 应用程序调用一个过程,该过程首先将歌曲信息保存到歌曲表中。这将导致和条目“4首歌曲D”
  • 该过程捕获创建的新ID,并将其与当前选定的播放列表一起使用,以便在播放列表歌曲(1,4)中输入一个条目
  • 事件-用户只想添加一堆歌曲 1.我们将歌曲信息保存到歌曲表中

    事件-用户希望创建包含歌曲的新播放列表 1.我们在播放列表中插入一张新唱片 2.我们允许用户选择现有歌曲(这只会产生条目)
    3.我们允许用户动态创建新歌曲添加到歌曲表,并自动添加到所选播放列表。

    对于您的交叉表,您可能有如下内容:

    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
    
    歌曲

    id
    title
    artist
    length
    
    id
    title
    
    song_id
    playlist_id
    order
    
    播放列表

    id
    title
    artist
    length
    
    id
    title
    
    song_id
    playlist_id
    order
    
    播放列表\u歌曲

    id
    title
    artist
    length
    
    id
    title
    
    song_id
    playlist_id
    order
    
    应用程序中的每首歌曲将有一行。每首播放列表将有一行。任何给定播放列表中的歌曲都将有多行。一旦在各自的表中有歌曲和播放列表的行,您就可以将歌曲添加到播放列表中。为此,您需要在中插入一行rong>playlists\u songs表,其中包含添加操作的
    song\u id
    (这些将不同)和
    playlist\u 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
    

    让我们把这个问题分解一下

    你有很多歌曲

    CREATE TABLE Songs
    (
      SongID int,
      SongName varchar(50)
    );
    
    您已经获得了播放列表信息。(播放列表的名称、创建者、blahwhatever)

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

    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
    

    这有帮助吗?

    好的,谢谢!我想我对向播放列表表中添加多个值感到困惑!因此可以向播放列表表中添加多首歌曲,即播放列表中的歌曲(1)和播放列表中的歌曲(2),只要您指定它们都被添加到播放列表1中(例如)?是的,该表用作多对多映射。使用它,您可以找出任何给定播放列表中使用了哪些歌曲。您也可以通过询问具有歌曲id的所有播放列表,反向查找给定歌曲属于哪些播放列表。好的,谢谢!我想我对向播放列表表添加多个值感到困惑!因此我t可以将多首歌曲添加到播放列表表中,即PlayDef(1)和PlayDef(2),只要您指定它们都被添加到播放列表1中(例如)?假设您在您的帐户下拥有播放列表1。我在我的帐户下拥有播放列表2。我们不拥有歌曲,但我们希望播放现有歌曲的子集。我喜欢歌曲1、2、4。您喜欢歌曲2、4、5。我们可以根据需要设置播放列表,只要我们的帐户说“播放我的播放列表”,它就会为我播放播放列表1,或为您播放列表2。我希望是不是弄清楚了一点?如果我不明白,请再问。