SQL: многие ко многим объектам разрешения и пересечения

1

С отношением "многие-многие" таблица пересечений используется для разрешения этого на два отношения "один ко многим". Моя проблема здесь в том, что у меня в настоящее время есть 2 таблицы, "Плейлист" и "Песня". Каждая песня присутствует во многих плейлистах, и каждый плейлист может содержать много песен. Чтобы решить эту проблему, добавьте третью таблицу, "songlog", чтобы решить многие для многих.

Я понимаю это, однако, когда дело доходит до добавления ценностей в базу данных, я немного запутался. Например, как добавить некоторые (например, 4) песни в таблицу плейлистов, используя таблицу пересечений? Кроме того, как я мог бы добавить информацию о том, какие песни есть в плейлисте? Неужели я ошибаюсь, это много для многих, или я полностью лаем по неправильному дереву?

Я очень смущен, поэтому ясное и основное объяснение этой области дизайна может помочь! Большое спасибо.

Теги:
database
oracle11g

3 ответа

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

Помогает ли это?

  • 1
    хорошо спасибо! Я думаю, что я запутался с добавлением нескольких значений в таблицу списка воспроизведения! Так можно ли добавить несколько песен в таблицу списка воспроизведения, т.е. playlistdef (1) и playlistdef (2), если вы укажете, что они оба добавляются в список воспроизведения номер 1 (например)?
  • 0
    Допустим, у вас есть собственный плейлист 1 под вашей учетной записью. У меня есть плейлист 2 под моей учетной записью. У нас нет песен, но мы хотим воспроизвести часть существующих песен. Мне нравится песня 1,2,4. Вам нравится песня 2,4,5. Мы можем настроить наши плейлисты так, как нам нравится, и всякий раз, когда в нашей учетной записи будет указано «Play my playlist», будет воспроизводиться плейлист 1 для меня или плейлист 2 для вас. Надеюсь, это немного прояснит? Пожалуйста, еще раз спросите, не понял ли я.
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

При добавлении песен вы должны сначала добавить их в таблицу композиций, получить идентификатор, а затем добавить отношение к списку воспроизведения. Из пользовательского интерфейса вы можете сделать это сразу для пользователя. Позволяя им добавлять песни в существующий список воспроизведения, однако, вы ДОЛЖНЫ, под обложками, сначала добавить список в таблицу композиций, а затем добавить его к иллюстрации playListSongs... ниже.

Событие - пользователь добавляет новую композицию "Song D" в свой список воспроизведения "Мой список 1"

  1. Они взаимодействуют с пользовательским интерфейсом, входящим в необходимую информацию
  2. Приложение вызывает процедуру, которая сначала сохраняет информацию о песне в таблице композиций. Это приводит к записи и записи "4 Song D"
  3. Процедура фиксирует созданный НОВЫЙ идентификатор и использует его вместе с текущим выбранным списком воспроизведения, чтобы поместить запись в PlayListSongs (1,4)

Событие. Пользователь просто хочет добавить кучу песен. 1. Мы сохраняем использование информации о песне в таблице песен.

Событие. Пользователь хочет создать новый плей-лист с песнями. 1. Мы вставляем новую запись в PlayList 2. Мы разрешаем пользователю выбирать существующие песни (это только приводит к записям 3. Мы позволяем пользователю динамически создавать новые песни, добавляя в таблицу песен и автоматически добавить в список воспроизведения.

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)

Вышеуказанное добавит песни с идентификатором 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
  • 0
    хорошо спасибо! Я думаю, что я запутался с добавлением нескольких значений в таблицу списка воспроизведения! Так можно ли добавить несколько песен в таблицу плейлистов, т.е. playlists_songs (1) и playlists_songs (2), если вы укажете, что они оба добавляются в плейлист № 1 (например)?
  • 1
    Да, эта таблица служит отображением «многие ко многим». С его помощью вы можете узнать, какие песни используются в любом данном плейлисте. Вы также можете сделать обратное, чтобы узнать, к каким спискам воспроизведения принадлежит данная песня, запросив все списки воспроизведения с song_id.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню