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

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

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

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

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

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

Персональный стол (виртуальный стол)

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

То, что я сейчас хочу, это то, что когда я делаю что-то вроде:

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

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

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

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

1 ответ

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

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

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

Другие вопросы по тегам