Я создаю музыкальный плеер, который поддерживается базой данных SQLite. Там есть таблица песен, в которой есть идентификатор, название, исполнитель, альбом и т. Д. В настоящее время я пытаюсь создать плейлисты, и я хотел бы знать, будет ли мой проект эффективным. Сначала я хотел составить таблицу плейлистов, и каждая запись в плейлисте имела бы список идентификаторов песен. Затем я запрошу таблицу композиций для списка идентификаторов песни. Что-то вдоль линий SELECT * FROM songs where id=this OR id=that OR id=....
. Тем не менее, я только что прочитал о присоединениях, поэтому теперь я думаю, что каждый плейлист должен быть его собственной таблицей, а записи для таблицы плейлистов будут просто идентификаторами из таблицы композиций, и я могу сделать внутреннее соединение в столбце id песни между конкретной таблицей списков воспроизведения и таблицей композиций. Какой метод будет более эффективным? Они эквивалентны?SQL Database layout/design
ответ
Когда вы обнаружите, что рассматриваете возможность создания нескольких идентичных таблиц, содержащих похожие данные, вам, вероятно, следует сделать шаг назад и переосмыслить ваш дизайн, поскольку это противоречит идее, лежащей в основе реляционной модели. То же самое относится к идее хранения «списков идентификаторов», которые я интерпретирую как нечто вроде массива данных, что также плохо подходит для хорошей модели, поскольку каждый элемент в строке (или кортеже) должен хранить только одно значение.
Один из возможных конструкций для вашего домена может быть таким:
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 = '???'
Что касается ваших вопросов:
Какой метод будет более эффективным? Они эквивалентны?
Ни один из них не был бы хорош, и они не эквивалентны. В первом примере у вас, вероятно, возникнут проблемы с извлечением и обновлением данных, а в другом количество таблиц будет линейным по количеству списков воспроизведения, и вам придется вводить каждый запрос, который вы делаете, с подходящим именем таблицы при запуске, время - это действительно то, чего вы не хотите.
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.
Я смущен тем, что есть. * И b. *. Вы имеете в виду SONG. * И плейлисты. *? Я предполагаю, что это все столбцы из определенной таблицы? Что из плейлистов означает? Означает ли это, что теперь это таблица плейлистов? В чем причина этой запутанности? –
a и b - псевдонимы, поэтому я могу набрать меньше при выполнении объединений, selects и where statements. В этом случае говорится: ОТ плейлистов Это также можно записать в виде: ОТ плейлистов в Так это псевдоним для списков воспроизведения в этом случае. Вы можете назначить любой псевдоним, который вам нужен, и вам понадобятся они часто при использовании объединений, особенно если вы начинаете присоединяться к таблицам самим (что происходит в более сложных моделях данных или с более сложными запросами). –
- 1. Между SQL Database SNAPSHOT и SQL Database?
- 2. Проблемы с SQL SQL Database
- 3. C++ SQL Database program
- 4. SQL Database Movie Tickets
- 5. Cross Database SQL Scripts
- 6. Database-Sql stamtent
- 7. SQL Database Setup
- 8. UPDATE SQL Database
- 9. SQL database join
- 10. sql server database diagram
- 11. Java, SQL Database Connection
- 12. SQL Student Database
- 13. sql database convention
- 14. SQL Database Algorithm
- 15. SQL почты ------ DATABASE MAIL
- 16. SQL Query: Employee Database
- 17. ASP.NET LINQ SQL DATABASE
- 18. View Database (MY SQL)
- 19. SQL Database Ride Sharing
- 20. Oracle SQL Database Query
- 21. Drop SQL Server Database
- 22. SQL Database ER Diagram
- 23. Form Listbox & SQL Database
- 24. Azure SQL database type
- 25. sql и database
- 26. SQL Database Design
- 27. SQL Relational Database Design
- 28. EXC_BAD_ACCESS SQL DATABASE
- 29. Database Design SQL
- 30. Truncate SQL Compact Database
Как я могу выбрать все s которые принадлежат определенному плейлисту? –