Представление PostgreSQL для чтения другой таблицы, преобразования данных и возврата результатов - PullRequest
0 голосов
/ 30 августа 2011

Могут ли некоторые предложить лучший способ реализовать это:

По сути, я хочу иметь виртуальную таблицу в PostgreSQL, которая при запросе ищет данные из какой-то другой таблицы (назовите этотаблица необработанных данных).Но суть в том, что данные из таблицы необработанных данных необходимо преобразовать, и когда это будет сделано, результаты будут возвращены, как если бы они были в исходной таблице.

Я объясню с помощью иллюстраций и примера (не моя настоящая программа, а просто упрощенный пример, объясняющий основные вещи, которые мне нужны):

Таблица необработанных данных

| id (int) | data (byte[]) |
----------------------------
|   ...    |      ...      |
|   ...    |      ...      |

Таблица персонала (виртуальная таблица)

| name (varchar) | address (varchar) | phone (varchar) |
--------------------------------------------------------
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |

Теперь я хочу получить следующее:

SELECT * FROM person WHERE name = 'Kim';
  • Запрашивать данные из необработанной таблицыт.е. получить все байтовые массивы [];
  • десериализовать данные для получения (имя, адрес, телефон) из необработанных данных;
  • применить любые условия, например name = 'Kim'
  • Возвращать этот набор результатов пользователю, как будто он просто запросил таблицу Person.

Для десериализации / преобразования и т. Д., Я предполагаю, что мне могут понадобиться некоторые функции языка программирования, поэтому дляJava может пригодиться что-то вроде Pl / Java ?

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

Концептуально, чтоМне нужна функция триггера, но, похоже, у нас не может быть триггера на READ.Буду признателен за любую помощь в том, как я могу это сделать.

1 Ответ

1 голос
/ 30 августа 2011

Мне кажется, что дизайн базы данных полностью нарушен.Вы пытаетесь повторно внедрить RDBMS, неправильно используя RDBMS.

Но если вы настаиваете на использовании этого дизайна, я могу думать только о том, чтобы написать функцию возврата набора, которая выполняет всю обработкуи распаковка необработанных данных процедурным способом.В зависимости от сложности ваших двоичных данных, PL / pgSQL может быть достаточно.

Затем вы должны сделать SELECT * FROM retrieve_person(), чтобы получить желаемый результат.

...