#postgresql #go
#postgresql #Вперед
Вопрос:
Я создаю веб-сервер в Go, который получает JSON и отправляет его в базу данных (PostgreSQL), которая затем обрабатывает его и создает некоторые объекты. Что меня беспокоит, так это то, что количество полей в полученном JSON может быть огромным, например
{
"a":1,
"b": 2,
...
}
И это потенциально может существенно повлиять на производительность базы данных. Есть ли готовое решение / пакет для решения этой проблемы, потому что я не хочу писать пользовательские json.Unmarshaler
?
Комментарии:
1. Да, проверьте входные данные перед записью их в базу данных. Это пользовательская логика, вам придется реализовать ее самостоятельно.
2. Начиная с 1.15, Go имеет ограничение на глубину структур JSON , но чтобы ограничить количество полей в объекте, вы должны написать свой собственный код. Если требуется разбор объекта на возможно огромную карту, вам нужно декодировать отдельные токены и прервать в какой-то момент. Однако гораздо проще ограничить размер входных данных , что, естественно, накладывает верхнюю границу и на размер карты.
3. @Peter Большое вам спасибо за прямой ответ на прямой вопрос, я ценю это!
Ответ №1:
Вы могли бы добавить ограничение проверки следующим образом:
CHECK (cardinality(json_object_keys(jsoncol)) <= 30)
Это гарантирует, что существует не более 30 записей верхнего уровня. Конечно, каждая из этих записей может содержать вложенные, потенциально большие значения, но если ваши JSON выглядят так, как в вопросе, этого было бы достаточно.
Ответ №2:
[I] есть ли способ или решение для решения этой проблемы?
ДА. Вы должны проверить размер и прервать, если он слишком большой. Это можно сделать во время чтения запроса, при отмене сортировки JSON или перед помещением данных в базу данных. Все варианты включают в себя prgramming.
Комментарии:
1. Дело в том, что пользователь может отправлять json с короткими именами полей и значениями, что может привести к не слишком большому json, но количество полей может быть больше, чем я ожидаю.
2. @thisismamatto Тогда вы не можете ограничить уровень запроса, но должны ограничить уровень обработки JSON или уровень вставки базы данных. Оба просто должны быть выполнены вами , это не произойдет волшебным образом.