2015-07-11 5 views
-1

Я стартап mysql ученик и хочу создать музыкальную базу данных с использованием правил нормализации.Дизайн базы данных для музыки

У нас есть track table, который хранит сведения о tracks как track_id, track_name, artist_name и т.д., но и я хочу, чтобы создать playlist таблицу, в которой один трек будет принадлежит более чем в один список воспроизведения, так как я могу спроектировать такой тип базы данных.

track_table(track_id, track_title, album_id) album_table(album_id, album_name, total_track) playlist(plyalist_id, playlist_name, track_ids)

Должен ли я использовать выше подход, где track_ids будет что-то вроде этого: 101, 102, 103, 104, 105, но я думаю, что это не очень хорошая идея, потому что с php как стороне сервера он будет немного медленным. потому что мы должны использовать implode и looping, чтобы получить список всех track_title.

Если кто-то хочет помочь. я действительно ценю это.

`

+0

Звучит нормально. Конструкция должна быть независимой от СУБД. Если это сильно оптимизировано, это не ваша вина. Ваша задача - разработать согласованную и логичную схему. – runDOSrun

+0

Один и тот же трек может появляться на нескольких альбомах. Итак, я бы использовал таблицу соединений (трек, альбом). – Strawberry

+0

В дополнение к тому, что вы являетесь пользователем mysql для запуска, являетесь ли вы разработчиком баз данных при запуске? Если это так, я предлагаю вам сначала изучить основы. Основы не очевидны, но их можно узнать. В ответе на предыдущий вопрос есть хороший список ссылок. Если я смогу найти этот вопрос, я передам его. –

ответ

0

Эта идея не очень«реляционная»в смысле проектирования реляционных баз данных. Я думаю, вы должны иметь элементы плейлиста в своей таблице

playlist_item(playlist_id, album_id, track_id) 

То есть, если track_id не уникален!

Сохранение track_ids в наборе, как вы предлагаете, тогда не требуется. В вашем PHP-коде нет необходимости встраивать или что-то подобное. Еще один JOIN.

Общий совет: всегда используйте простой первичный ключ в каждой таблице. Добавьте естественные ключи по мере необходимости в качестве индексов и/или создайте ограничения.

+0

Надеюсь, track_id является основным ключом в таблице треков, поэтому album_id можно удалить из таблицы playlist_item. Вероятно, вам также понадобится столбец play_order. –

+0

Я бы дал каждой таблице общий столбец первичного ключа с именем «id», но, похоже, OP потерял интерес уже. – luksch

0

Playlist для отслеживания является «многие-ко-многим», так что вам нужен стол между:

playlist(plyalist_id, playlist_name) 
playlist_tracks (playlist_id, track_id, sequence) 

sequence 1,2, ... (если вы хотите играть в плейлист в определенном порядке).

CREATE TABLE playlist_tracks (
    playlist_id ..., 
    track_id ..., 
    sequence TINYINT UNSIGNED NOT NULL, 
    PRIMARY KEY(playlist_id, sequence), -- for playing them 
    INDEX(track_id) -- in case you want to see which playlists contain a particular track 
) ENGINE=InnoDB; 
Смежные вопросы