Как правильно хранить ссылки на музыку в БД MySQL?

Добрый день!

Подскажите, пожалуйста, как правильно хранить музыку в БД, а точнее ссылки на музыку. Т.е. на сайте есть альбомы музыкантов, в альбоме несколько треков.

Лично я вижу несколько вариантов:
1. Поле id (ид альбома) и поле track (это поле типа text, в нем перечислены треки, разделены они ||).
2. Поле id (трека), поле album (ид альбома), поле title (название трека), поле track (varchar поле, там ссылка лишь на 1 трек). Т.е. в этом варианте в 1 записи лишь один трек, а не все сразу. В этом случае еще и тайтл можно указать.

Сделал картинку, чтобы было понятнее: ссылка

Скажите, пожалуйста, какой вариант лучше всего или предложите свой.
Заранее спасибо!
  • Вопрос задан
  • 4602 просмотра
Решения вопроса 1
arutyunov
@arutyunov
Mooza.ru — Делаем сайты
1 таблица: альбомы - id | title
2 таблица: треки id | title | album_id
3 таблица: треки_to_альбомы track_id | album_id

Почитайте про нормальные формы.
И в 1 ячейке БД может быть только 1 единица информации (id, разделенные || - уже не 1 единица информации).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Ayk72 Автор вопроса
А почему 3 таблицы, если можно две? Так лучше? Объясните, пожалуйста.
Ответ написан
alexdob
@alexdob
В случае, если один трек принадлежит только одному альбому - хватит двух таблиц и связи один ко многим.
CREATE TABLE `m_albums` (
	`album_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`album_name` VARCHAR(50) NOT NULL DEFAULT 'album No name',
	PRIMARY KEY (`album_id`)
)
ENGINE=InnoDB;
CREATE TABLE `m_tracks` (
	`track_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`track_name` VARCHAR(50) NULL DEFAULT 'track No name',
	`album_id` INT(10) UNSIGNED NOT NULL,
	PRIMARY KEY (`track_id`),
	INDEX `album_id` (`album_id`)
)
ENGINE=InnoDB;


Выбор треков из определенного альбома c ID = 1:
SELECT
	mt.track_id, mt.track_name
FROM
	m_tracks mt, m_albums ma
WHERE
	mt.album_id = ma.album_id AND ma.album_id = 1

Если трек может повторяться в нескольких альбомах, то будет связь многие-ко-многим и таблиц будет три:
ALTER TABLE m_tracks DROP COLUMN album_id;
CREATE TABLE `m_ref_album_tracks` (
	`album_id` INT(10) UNSIGNED NOT NULL,
	`track_id` INT(10) UNSIGNED NOT NULL,
	INDEX `album_id` (`album_id`),
	INDEX `track_id` (`track_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

хотя можно было бы использовать и составной индекс. и выборка:
SELECT
	mt.track_id, mt.track_name
FROM
	m_albums ma, m_tracks mt, m_ref_album_tracks rat
WHERE
	rat.album_id = 1 AND rat.album_id = ma.album_id AND rat.track_id = mt.track_id

как-то так (или можно JOIN`ом, кому как нравится). Или смотрим в каких альбомах есть определенный трек:
SELECT
	ma.album_id, ma.album_name
FROM
	m_albums ma, m_tracks mt, m_ref_album_tracks rat
WHERE
	rat.track_id = 2 AND rat.album_id = ma.album_id AND rat.track_id = mt.track_id

на хабре уже описывали эти связи, например, здесь habrahabr.ru/post/193380
Говоря про движок таблиц InnoDB можно использовать еще и внешние ключи, но это немного другая история..
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы