Я был экспериментировал с PostgreSQL и PL/V8, в который встроен движок JavaScript V8 в PostgreSQL. Используя это, я могу запросить данные JSON внутри базы данных, что довольно удивительно.
Основной подход заключается в следующем:
CREATE or REPLACE FUNCTION
json_string(data json, key text) RETURNS TEXT AS $$
var data = JSON.parse(data);
return data[key];
$$ LANGUAGE plv8 IMMUTABLE STRICT;
SELECT id, data FROM things WHERE json_string(data,'name') LIKE 'Z%';
Используя V8, я могу анализировать данные JSON в JS, а затем возвращать поле, и я могу использовать это как регулярное выражение запроса pg.
НО
В больших наборах данных производительность может быть проблемой, так как для каждой строки мне нужно проанализировать данные. Парсер работает быстро, но это, безусловно, самая медленная часть процесса, и это должно происходить каждый раз.
То, что я пытаюсь решить (чтобы, наконец, дойти до фактического вопроса), - это способ кэширования или предварительной обработки JSON... даже хранения двоичного представления JSON в таблице, которая может быть используемый V8 автоматически, поскольку объект JS может быть победой. Я посмотрел на использование альтернативного формата, такого как messagepack или protobuf, но я не думаю, что они обязательно будут такими же быстрыми, как и собственный JSON-парсер в любом случае.
МЫСЛЬ
PG имеет blobs и двоичные типы, поэтому данные могут быть сохранены в двоичном формате, тогда нам просто нужен способ их сортировки в V8.