Представление 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()
чтобы получить желаемый результат.