2015-03-14 2 views
0

Я создаю музыкальный плеер, который поддерживается базой данных SQLite. Там есть таблица песен, в которой есть идентификатор, название, исполнитель, альбом и т. Д. В настоящее время я пытаюсь создать плейлисты, и я хотел бы знать, будет ли мой проект эффективным. Сначала я хотел составить таблицу плейлистов, и каждая запись в плейлисте имела бы список идентификаторов песен. Затем я запрошу таблицу композиций для списка идентификаторов песни. Что-то вдоль линий SELECT * FROM songs where id=this OR id=that OR id=..... Тем не менее, я только что прочитал о присоединениях, поэтому теперь я думаю, что каждый плейлист должен быть его собственной таблицей, а записи для таблицы плейлистов будут просто идентификаторами из таблицы композиций, и я могу сделать внутреннее соединение в столбце id песни между конкретной таблицей списков воспроизведения и таблицей композиций. Какой метод будет более эффективным? Они эквивалентны?SQL Database layout/design

ответ

2

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

Один из возможных конструкций для вашего домена может быть таким:

Songs (SongID PK, SongAttributes (name, length etc) ...) 
Playlists (PlaylistID PK, PlaylistAttributes (like name, owner etc) ...) 
PlaylistSongs (PlaylistID FK, SongID FK) 

PK = Primary Key, FK = Foreign Key 

Чтобы выбрать все песни песни для определенного списка воспроизведения:

select songs.name 
from songs 
join playlistsongs on songs.songid = playlistsongs.songid 
join playlist on playlist.playlistid = playlistsongs.playlistid 
where playlist.name = '???' 

Что касается ваших вопросов:
Какой метод будет более эффективным? Они эквивалентны?

Ни один из них не был бы хорош, и они не эквивалентны. В первом примере у вас, вероятно, возникнут проблемы с извлечением и обновлением данных, а в другом количество таблиц будет линейным по количеству списков воспроизведения, и вам придется вводить каждый запрос, который вы делаете, с подходящим именем таблицы при запуске, время - это действительно то, чего вы не хотите.

+0

Как я могу выбрать все s которые принадлежат определенному плейлисту? –

0

OR заявления становятся неэффективными очень быстро, поэтому модель с плейлистом и идентификатором плейлиста является опцией.

Пример: ПЕСНЯ ----> СПИСКА С СПИСОК SONGIDs

Псевдо код:

CREATE TABLE SONG (
song_id INT, 
name VARCHAR, 
other attributes); 

CREATE TABLE playlists (
playlist_id INT, 
song_id INT REFERENCES FOREIGN KEY song(song_id), 
other playlist attributes); 

Затем вы можете присоединиться к списку:

SELECT a.*, b.* 
FROM playlists a 
INNER JOIN song b ON a.song_id=b.song_id AND a.playlist_id=?; 

, который даст вам плейлист определенного лица, владеющего playlist_id X.

+0

Я смущен тем, что есть. * И b. *. Вы имеете в виду SONG. * И плейлисты. *? Я предполагаю, что это все столбцы из определенной таблицы? Что из плейлистов означает? Означает ли это, что теперь это таблица плейлистов? В чем причина этой запутанности? –

+0

a и b - псевдонимы, поэтому я могу набрать меньше при выполнении объединений, selects и where statements. В этом случае говорится: ОТ плейлистов Это также можно записать в виде: ОТ плейлистов в Так это псевдоним для списков воспроизведения в этом случае. Вы можете назначить любой псевдоним, который вам нужен, и вам понадобятся они часто при использовании объединений, особенно если вы начинаете присоединяться к таблицам самим (что происходит в более сложных моделях данных или с более сложными запросами). –