首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL:多到多分辨率和交叉实体

SQL:多到多分辨率和交叉实体
EN

Stack Overflow用户
提问于 2014-12-23 18:38:04
回答 3查看 1.5K关注 0票数 1

对于多到多的关系,相交表被用来解决这两个一对多的关系。我的问题是,我现在有两个表,“播放列表”和“歌曲”。每首歌都出现在许多播放列表中,每一首播放列表都可以包含许多歌曲。为了解决这个问题,添加了第三个表,“歌曲日志”来解决多到多的问题。

但是,当涉及到向数据库中添加值时,我有点困惑。例如,如何使用相交表将一些(例如4)歌曲添加到播放列表表中?另外,我如何添加哪些歌曲在哪一个播放列表的细节?我是不是搞错了,这对很多人来说是真的吗?还是我完全搞错了?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-23 19:06:22

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

你有歌。

代码语言:javascript
运行
复制
CREATE TABLE Songs
(
  SongID int,
  SongName varchar(50)
);

你有播放列表的信息。(播放列表的名字,是谁创建的,随便吧)。

代码语言:javascript
运行
复制
CREATE TABLE PlaylistDef
(
  PlaylistID int,
  PlaylistName varchar(50)  
);

你的歌都在播放列表里。歌曲可以在多个播放列表中。

代码语言:javascript
运行
复制
CREATE TABLE Playlist
(
  PlaylistID int,
  SongID int
);

让我们填充表:

代码语言:javascript
运行
复制
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);

然后,您现在可以运行类似的东西来查看特定的播放列表。

代码语言:javascript
运行
复制
SELECT * FROM Playlist WITH (NOLOCK) WHERE PlaylistID = 2

它会把这个还回去

代码语言:javascript
运行
复制
PLAYLISTID  SONGID
2           2
2           3
2           4
2           5

这个有用吗?

票数 1
EN

Stack Overflow用户

发布于 2014-12-23 18:49:28

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

代码语言:javascript
运行
复制
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中.图示如下。

事件用户在他们的PlayList“我的列表1”中添加一首新歌“宋D”

  1. 它们与输入所需信息的UI交互。
  2. 应用程序调用首先将歌曲信息保存到歌曲表的过程。这导致了“四宋D”的出现和参赛。
  3. 该过程捕获创建的新ID,并与当前选定的播放列表一起使用该ID在PlayListSongs (1,4)中放置一个条目。

事件-用户只想添加一堆歌曲1。我们保存歌曲信息,使用进入歌曲表。

事件-用户希望创建一个带有歌曲1的新播放列表。我们在playlist 2中插入一个新记录。我们允许用户选择现有歌曲(这只会导致条目3 )。我们允许用户动态创建新歌曲,添加到歌曲表中,并自动添加到所选播放列表中。

票数 1
EN

Stack Overflow用户

发布于 2014-12-23 18:50:41

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

歌曲

代码语言:javascript
运行
复制
id
title
artist
length

播放列表

代码语言:javascript
运行
复制
id
title

playlists_songs

代码语言:javascript
运行
复制
song_id
playlist_id
order

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

代码语言:javascript
运行
复制
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的歌曲,可以执行以下操作:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27626160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档