У меня есть проблема, которая продолжает появляться с нормализованными базами данных, и я искал лучшее решение.
Предположим, у меня есть база данных с информацией об альбоме. Я хочу настроить схему в обычном порядке, поэтому я настроил две таблицы - альбомы, в которых есть один список для каждого альбома, и песни, в которых перечислены все песни, содержащиеся в альбомах.
albums
------
aid
name
songs
-----
aid
sid
length
Эта настройка удобна для хранения данных в нормализованном порядке, поскольку альбом может содержать любое количество песен. Однако доступ к данным в интуитивно понятном виде теперь стал намного сложнее. Запрос, который собирает информацию только об одном альбоме, прост, но как получить сразу несколько альбомов за один запрос?
На данный момент лучший ответ, который я нашел, - это группировка по помощи и преобразование информации о песнях в массивы. Например, результат будет выглядеть примерно так:
aid, sids, lengths
1, [1, 2], [1:04, 5:45]
2, [3, 4, 5], [3:30, 4:30, 5:30]
Когда я хочу работать с данными, мне нужно затем проанализировать sids и длины, что кажется бессмысленным упражнением: я заставляю db объединять набор значений, чтобы потом их разделить.
Мой вопрос: каков наилучший способ доступа к базе данных с такой схемой? Я застрял с несколькими массивами? Должен ли я хранить всю информацию о песне в объекте, а затем эти песни в одном массиве вместо нескольких массивов? Или есть способ добавить произвольное количество столбцов в набор результатов (своего рода бесконечное соединение), чтобы вместить N песен? Я открыт для любых идей о том, как лучше всего получить доступ к данным.
Я также обеспокоен эффективностью, так как эти запросы будут выполняться часто.
Если это имеет какое-то значение, я использую базу данных PostgreSQL вместе с интерфейсом PHP.