@beduin01

Как лучше выполнить вставку в БД?

Ситуация такая. Есть Postgresql. Есть JSON поля которого соответствуют схеме БД и который я превращаю в INSERT выражение. т.е.
{
  id: 123,
  price: 824,
  objs: [{ name: "apple"}, { name: "milk"}, { name: "water"}]
}


Соответственно эти данные раскидываю по таблицам.

Проблема вот в чем: иногда у меня на вход могут прилетать id которые уже есть в БД. Соответственно мне нужно старые удалить, а новые вставить. Но мне крайне важна производительность и я не знаю как лучше сделать.

В начале я выполнял проверку есть ли указанный ID в таблицах БД. Если есть, удалял его. Потом понял, что так медленно и начал ловить исключение при попытки вставить дубликаты в БД. Если есть исключение -- удаляю записи и пытаюсь выполнить вставку заново.

Но теперь я думаю -- а эффективно ли это? Будет ли лучше если я оберну в транзакцию вида:
REMOVE from mainTable WHERE id=123 -- удаляем из главной таблицы
REMOVE from obj WHERE id=123 -- удаляем из второй таблицы
INSERT INTO mainTable ...
INSERT INTO obj ...


Я так же думал над вариантом INSERT OR UPDATE (UPSERT) но теоретически возможна ситуация когда в таблицах второго уровня (имеется ввиду если смотреть на JSON) будут композитные ключи, не совпадающие с новыми данными т.е. новых данных будет меньше чем старых и часть старых данных при UPSERT останется.

Как лучше? Какие есть варианты?
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
@bacon
UPSERT и сделать так чтобы теоретической ситуации не было. Если вставка массовая, то сделать одной транзакцией, что бы не делать commit после каждой операции
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы