У меня есть таблица postgres с столбцом jsonb , цель состоит в том, чтобы вставить гибкие документы, чтобы затем выполнить некоторые операции поиска
Давайте начнем с таблицы и некоторых наглядных данных:
create table my_table (id serial primary key, label text, document jsonb);
insert into my_table (label, document) values ('white', '{"name": "john", "lastname": "doe", "eyes": "brown", "birth": "07/08/1979 19:12:55", "pet": "dinosour", "wife": "872", "cat": "no"}');
insert into my_table (label, document) values ('lemon', '{"name": "jane", "lastname": "doe", "birth": "07/08/1978 19:12:55", "cat": "yes"}');
insert into my_table (label, document) values ('white', '{"name": "peter", "eyes": "blue", "birth": "07/08/1980 19:12:55", "pet": "worm", "dog": "yes"}');
insert into my_table (label, document) values ('cyanide', '{"name": "peter", "lastname": "doe", "doormat": "yes"}');
Когда данные начинают поступать в процессе создания некоторых индексов (вот почему тип столбца jsonb), например:
create index on my_table (((document->>'name')::text)) WHERE (document->>'name') is not null and label = 'white';
create index on my_table (((document->>'lastname')::text)) WHERE (document->>'lastname') is not null and label = 'lemon';
create index on my_table (((document->>'doormat')::text)) WHERE (document->>'doormat') is not null and label = 'cyanide';
На данный момент все работает, как и ожидалось, мы можем выполнить хороший поиск с хорошей производительностью, например:
select * from my_table
where to_timestamp(document->>'birth', 'DD/MM/YYYY HH24:MI:SS')
between to_timestamp('07/08/1979 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
and to_timestamp('07/08/1979 23:59:59', 'DD/MM/YYYY HH24:MI:SS');
select * from my_table where document->>'cat' = 'yes' or document->>'eyes' = 'brown';
ПРОБЛЕМА заключается в том, что теперь нам нужно зашифровать эту информацию в базе данных, как я обычно это делаю с pgcrypto, но я не могу найти способ зашифровать jsonb type без потери все возможности индексации или возможности поиска в поле возвращают меня в очень примитивное состояние.
мы нашли слишком мало информации о pgcrypto с типами jsonb, например: Postgresql - шифрование данных jsonb и документация pgcrypto ничего не говорит о типах jsonb https://www.postgresql.org/docs/10/static/pgcrypto.html
Есть ли способ, которым мы могли бы сделать что-то вроде pgp_sym_decrypt (jsonb, 'secret')? или другой механизм, где мы можем зашифровать данные, не теряя хотя бы возможности поиска по полю? (мы можем пожертвовать индексацией)
Заранее спасибо,