У меня есть данные json в столбце базы данных PostgreSQL в следующей форме:
myData [{"key1": "value1", "key2": "value2"}, {"key1": "value1", "key2": "value2"} ]
где myData
- это массив, содержащий два объекта. Я прочитал следующие ссылки для решения моей проблемы только с java, но мой вопрос несколько отличается. Преобразование JSON в Java и Parsing JSON Object в Java
Было бы более эффективно извлекать пары ключ/значение в базе данных (postgresql) или я должен получить всю строку в java и использовать java-библиотеки? Возможно ли это в базе данных?
Если это сделать в базе данных, это вариант, поддерживает ли JOOQ какую-либо поддержку?
Если синтаксический анализ на Java является лучшим вариантом, какая из двух библиотек, приведенная в приведенных выше ссылках, более стабильна/эффективна? org.json или Gson
У вас есть несколько интересных вопросов.
Это зависит. Во-первых, в PostgreSQL, в частности, jsonb
имеет лучшую поддержку индекса. Я не эксперт по этой теме, но я уверен, что вы придете к такому выводу, как только вы проверите 1-2 вещи. Здесь интересное сообщение в блоге, сравнивающее разные типы данных для производительности в PostgreSQL:
http://www.databasesoup.com/2015/01/tag-all-things.html
... который подводит меня к вопросу о том, следует ли помещать предикаты в ваш SQL-запрос или выполнять их позже на Java. В общем: поместите его в базу данных. Если ваш предикат является очень избирательным, вы можете:
Оба из них приводят к значительно меньшей задержке ваших запросов. Если ваш предикат не очень избирателен, это вряд ли будет проблемой, за исключением экстремальной нагрузки. Но все же, если ваша система находится под экстремальной нагрузкой, и ваши предикаты являются выборочными, вы все равно значительно уменьшите эту нагрузку, если вы запустите предикат в базе данных.
jOOQ в настоящее время не предлагает никакой готовой поддержки предикатов JSON (B), но вы можете легко создать утилиту самостоятельно, используя поддержку jQQ plain SQL:
http://www.jooq.org/doc/latest/manual/sql-building/plain-sql
По сути, просто напишите:
public static Condition someJsonPredicate(Field<?> someJsonColumn, String someValue) {
return DSL.condition("some_json_predicate({0}, {1})",
someJsonColumn, DSL.val(someValue));
}
Я не буду отвечать на эту часть здесь, так как ваш тест может отличаться от моего.
jsonb
.