В случае, если один трек принадлежит только одному альбому - хватит двух таблиц и связи один ко многим.
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 можно использовать еще и внешние ключи, но это немного другая история..