Словарь ключей для jsonb

PostgreSQL начиная с версии 9.4 предоставляет прекрасную возможность хранить JSON-документы в бинарном формате jsonb. Однако, при этом, в каждом конкретном документе будут храниться названия всех его ключей в текстовом виде. Однако, использование словаря ключей позволило бы сократить объём, занимаеный jsonb документами в 2-3 раза. Основной проблемой, в реализации такого подхода, является вопрос, каким образом из документа ссылаться на его словарь? Два варианта были рассмотрены и отброшены.

  1. Единый словарь для всех документов. Делать такой словарь фиксированным невозможно, т.к. нельзя заранее предусмотреть все ключи, которые могут встретиться во всех коллекциях документов. Если же делать словарь динамически пополняемым, то возникает проблема неконтролируемого роста словаря.
  2. Ссылка на словарь непосредственно из самих данных документа. Недостатком данного подхода, является слабый контроль за тем, какие словари в данный момент используются. Например, если нужно удалить словарь, то чтобы удостовериться, что он нигде не используется, придётся просканировать все документы всех коллекций.

Поэтому разумным представляется связывать со словарём отдельные коллеции jsonb, т.е. Сделать ссылку на словарь свойством колонки. При этом нужно иметь возможность доступа к словарю из всех функций, которые работают с jsonb. Один из вариантов это реализовать – это непосредственно при извлечении jsonb из тупла, формировать in-memory представление (ExpandedObject), которое будет содержать в себе ссылку на нужный словарь.