@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 останется.

Как лучше? Какие есть варианты?
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы