LINUX.ORG.RU

[БД] Маленький вопрос по проектированию

 


0

0

Здравствуйте!

Я делаю БД для музыкальной коллекции, суть такова. Есть следующие таблицы (напишу на псевдокоде):

Исполнитель {
    idИсполнителя,
    Название
};

Запись {
    idЗаписи,
    idИсполнителя,
    Название,
    Продолжительность
};

Альбом {
    idАльбома,
    Название,
    ГодВыпуска
};

СодержаниеАльбома {
    idАльбома,
    idЗаписи
};

Но при таком раскладе, например, чтобы получить все альбомы заданного исполнителя, придется выполнить достаточно страшный запрос.

Посему возникают мысли включить поле idИсполнителя в таблицу «Альбом». В этом случае (только ИМХО, ибо не специалист я в этом деле) конкретный запрос выполнится быстрее и легче. Но не будет ли это ошибкой проектирования? Излишняя инфа и всё такое... Хотя, в то же время на практике в одном альбоме попадаются песни разных исполнителей - на то и теги track artist и album artist предусмотрены в том же vorbis...

Хочется услышать мнение экспертов =)

★★★★★

мнение не эксперта :)

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

2). учитывая то, что ты написал «Хотя на практике...» почему бы тогда не сделать таблицу

АльбомыИсполнителя {
            idИсполнителя
            idАльбома
}
тогда решится проблема со скоростью, но появятся 2 отдельные функции «все альбомы исполнителя» и «все альбомы, где есть песни исполнителя.

P.S. SELECT FROM a1 INNER JOIN a2 INNER JOIN a3 не такая уж и жирная вещь, если уже упрёшься в производительность тогда и парься

qnikst ★★★★★
()

полный фейл:

1) Запись и СодержаниеАльбома в одну таблицу нужно.

2) В информации о альбоме должен быть исполнитель, палюбе.

anonymous
()
Ответ на: комментарий от anonymous

информации о альбоме должен быть исполнитель

На всякий случай заведи 30-40 полей, если альбом исполняется хором.

wfrr ★★☆
()
Ответ на: комментарий от wfrr

тупая белка:

1) как выбрать все альбомы одно исполнителя?

2) никто не мешает зделать так:

исполнитель1 альбом1

исполнитель2 альбом1

исполнитель3 альбом1

исполнитель1 альбом2

исполнитель1 альбом3

anonymous
()
Ответ на: комментарий от anonymous

Запись и СодержаниеАльбома в одну таблицу нужно

Почему? Одна запись как-бе может быть в нескольких альбомах (например, оригинальный + the greatest hits).

В информации о альбоме должен быть исполнитель, палюбе.

Гм, а какие плюсы у этого подхода по сравнению с тем, что любезно предложил тов. qnikst в http://www.linux.org.ru/jump-message.jsp?msgid=4237730&cid=4237768??

yoghurt ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

> Почему? Одна запись как-бе может быть в нескольких альбомах (например, оригинальный + the greatest hits).

Смотря какая у тебя цель. Если на the greatest hits и альбоме действительно одна и та же запись - то твой изначальный вариант лучше.

Если у тебя в БД должно содержаться, что то вроде базы данных файлов, и у тебя в tghist и альбоме 2 разные файла, то нужен вариант anonymous'а :) тогда у тебя будет что-то вроде:

Artist <-ArtistAlbum-> Albums -> Tracks <- RealTrack, где realtrack (тоже самое, что твои Запись) объединяет все варианты одного трека (может быть полезно, если трек в разных версиях выходил), можно послушать белку и ввести ArtistTrack если там сплит какой, но ИМХО это нужно далеко не в каждой задаче :)

qnikst ★★★★★
()
Ответ на: комментарий от anonymous

1) как выбрать все альбомы одно исполнителя?

Содегз ты?

2) никто не мешает зделать так:

Мешает, дагадайся кто.

wfrr ★★☆
()
Ответ на: комментарий от qnikst

что то вроде базы данных файлов

Да, предполагалось что база будет получаться путем сканирования /mnt/media/Music =)

С учетом этого и высказанных выше замечаний, получается примерно такая схема:

   +-------------+         +------------+            +-------------+
   |Исполнитель  |         |Трек        |            |ИсполТр      |
   +-------------+         +------------+            +-------------+
   |idИсполнителя|--++  +--|idТрека     |------+  +--|idИсполнителя|
   |Название     |  ||  |  |idКомпозиции|---+  |  |  |idТрека      |
   +-------------+  ||  |  |(ну и т.д.) |   |  |  |  +-------------+
                    ||  |  +------------+   |  |  |
                    ||  |                   |  |  |
                    |+----------------------------+
                    |   |                   |  |
   +-------------+  |   |    +------------+ |  |   +----------+      +---------+
   |Авторство    |  |   |    |Композция   | |  |   |СодержАльб|      |Альбом   |
   +-------------+  |   |    +------------+ |  |   +----------+      +---------+
   |idИсполнителя|--+   |  +-|idКомпозиции|-+  |   |idАльбома |------|idАльбома|
   |idКомпозиции |---------+ |Название    |    +---|idТрека   |      |Название |
   +-------------+      |    |Текст       |        +----------+      |Год      |
                        |    +------------+                          +---------+
                        |
   +---------+          |  +-------+
   |Файл     |          |  |БДвФС  |
   +---------+          |  +-------+
   |idФайла  |--+       +--|idТрека|
   |Путь     |  +----------|idФайла|
   +---------+             +-------+

Вроде всё учел... А все альбомы конкретного исполнителя, видимо, так и буду «грепать» через INNER JOIN.

Спасибо за советы =)

yoghurt ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

только вот чойто у тебя три сущьности композиция - трек -файл, могет примешь для упрощения трек = файл?

wfrr ★★☆
()
Ответ на: комментарий от Elverion

В чем рисовал?

Emacs (M-x table-insert)

yoghurt ★★★★★
() автор топика
Ответ на: комментарий от aydar

угу, хотя может автор знает ту самую причину что заставила его такое наворотить

wfrr ★★☆
()
Ответ на: комментарий от wfrr

композиция - трек -файл

композиция суть лирика. Чтобы в базе и для Nirvana - The Man Who Sold The World, и для David Bowie - The Man Who Sold The World хранился один экземпляр текста

трек - файл - это чтобы для файлов типа «/Radiohead/MP3/1993/Pablo Honey/02 Creep.mp3» и «/Radiohead/FLAC/1993/Pablo Honey/02 Creep.flac» держать одну запись-трек. Ситуация сферическая, но место быть имеет =)

yoghurt ★★★★★
() автор топика
Ответ на: комментарий от yoghurt

назадроствуешь вполне реальные тормоза, тем более разруливать все это нормальный человек не станет

wfrr ★★☆
()
Ответ на: комментарий от yoghurt

Лучше все таблицы привести к виду table (id, name). Для каждого атрибута создать по таблице с уникальными значениями name.

Для файлов сделать большую таблицу и вписать в неё пути к файлам и id всех прочих атрибутов из мелких таблиц и всё остальное прочее.

mutronix ★★★★
()

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

Deleted
()

преждевременная оптимизация - корень всех зол. Ты заранее денормализуешь структуру своей БД, хотя приложение даже не написано. Хотя бы проведи тесты - создай БД типичного объёма, погоняй на ней типичные запросы.

Legioner ★★★★★
()
Ответ на: комментарий от yoghurt

//для файловой структуры тебе достаточно будет такого

artists {id,name}
artistalbum{id,artist_id,album_id}
albums {id,name, album_details}
tracks {id,artist_id,name,album_id,track_details}
2 файла на 1 трэк не вписываются. 2 исполнителя на 1 трэк тоже, но данная ситуация правится добавлением таблицы artisttracks. album_details может надо будет выносить в отдельную, но это только если будут тормоза. //для логической базы
compositiontrack{id,track_id,composition_id}
composition {id,liryc,name}

qnikst ★★★★★
()
Ответ на: комментарий от Rastafarra

лучше сваяй приличную морду для xmms2

Препод в качестве курсовика по БД сиё не оценит =)

yoghurt ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.