2016-07-28 3 views
1

Я использую PostgreSQL для координации крупномасштабного моделирования, которое включает в себя инициализацию различных компонентов моего приложения через массивы целых чисел. В частности, у меня есть понятие «Контроллер», где каждый контроллер требует инициализации переменной количества параметров.Динамическое имя таблицы против столбца массива в статической таблице

У меня есть таблица job, в которой хранятся controller_id и внешний ключ controller_parameters для фактической ссылки на набор требуемых параметров. Моя идея, чтобы начать с было сделать следующее:

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

  2. После того, как мы знаем таблицу, запустить SELECT * FROM @someController_parameters_table p WHERE p.controller_parameters = controller_parameters LIMIT 1;

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

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

Мое предложение состоит в том, чтобы иметь новую таблицу, допустим, controller_parameters, которая имеет столбцы (controller_id, parameters_id, parameters[]). В третьем столбце хранятся параметры инициализации для отдельного контроллера и набора параметров.

Плюсами этого дизайна являются то, что мы возвращаемся в статическую землю SQL, что хорошо. Недостатком является то, что когда я генерирую фактические параметры для вставки в таблицу отдельных параметров, я обычно использую кросс-соединение для получения всех перестановок отдельных параметров и вставляю их соответственно в отдельные таблицы. Я лично не знаю, как взять таблицу скрещенных строк и преобразовать ее в int[], так что это потенциальный блокпост.

Мысли?

ответ

0

Вы можете использовать array_agg, чтобы взять результат группы и превратить ее в массив.

select controller_id, parameters_id, array_agg(parameter) 
from ... 
group by controller_id, parameters_id 

Вот PostGreSQL документы на агрегатные функции:

https://www.postgresql.org/docs/9.5/static/functions-aggregate.html

+0

Так array_agg(), как массив(), но вы не должны указывать столбцы? Он просто делает каждый столбец, который отсутствует в разделе Group By? Является ли порядок таким же, как в предложении Order By? – ijustlovemath