Ситуация такая. Есть 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 останется.
Как лучше? Какие есть варианты?