С отношением "многие-многие" таблица пересечений используется для разрешения этого на два отношения "один ко многим". Моя проблема здесь в том, что у меня в настоящее время есть 2 таблицы, "Плейлист" и "Песня". Каждая песня присутствует во многих плейлистах, и каждый плейлист может содержать много песен. Чтобы решить эту проблему, добавьте третью таблицу, "songlog", чтобы решить многие для многих.
Я понимаю это, однако, когда дело доходит до добавления ценностей в базу данных, я немного запутался. Например, как добавить некоторые (например, 4) песни в таблицу плейлистов, используя таблицу пересечений? Кроме того, как я мог бы добавить информацию о том, какие песни есть в плейлисте? Неужели я ошибаюсь, это много для многих, или я полностью лаем по неправильному дереву?
Я очень смущен, поэтому ясное и основное объяснение этой области дизайна может помочь! Большое спасибо.
Давайте немного расстроим проблему.
У тебя есть песни.
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
Помогает ли это?
Это вопрос о порядке работы: 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
При добавлении песен вы должны сначала добавить их в таблицу композиций, получить идентификатор, а затем добавить отношение к списку воспроизведения. Из пользовательского интерфейса вы можете сделать это сразу для пользователя. Позволяя им добавлять песни в существующий список воспроизведения, однако, вы ДОЛЖНЫ, под обложками, сначала добавить список в таблицу композиций, а затем добавить его к иллюстрации playListSongs... ниже.
Событие - пользователь добавляет новую композицию "Song D" в свой список воспроизведения "Мой список 1"
Событие. Пользователь просто хочет добавить кучу песен. 1. Мы сохраняем использование информации о песне в таблице песен.
Событие. Пользователь хочет создать новый плей-лист с песнями. 1. Мы вставляем новую запись в PlayList 2. Мы разрешаем пользователю выбирать существующие песни (это только приводит к записям 3. Мы позволяем пользователю динамически создавать новые песни, добавляя в таблицу песен и автоматически добавить в список воспроизведения.
Для ваших таблиц пересечений вы можете иметь что-то вроде:
песни
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)
Вышеуказанное добавит песни с идентификатором 1, 2, 3 и 4 в список воспроизведения с идентификатором 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