Мы нормировать наш довольно большой стол, чтобы отделить названия магазинов и сведения о продукте, что-то вроде:ВСТАВИТЬ к внешней таблице, если оно не существует
CREATE TABLE store_products
(
id BIGINT DEFAULT PRIMARY KEY NOT NULL,
storeid INTEGER REFERENCES store(id),
productid BIGINT REFERENCES product_details(id)
producturlid BIGINT REFERENCES product_url(id)
);
Мы получаем дамп магазинов продуктов в формате JSON и мы перебирайте каждый элемент и вставляйте его в Postgres через консольное приложение Delphi. Он делает это одновременно (так что 4 потока вставляются и проходят через массив JSON продуктов).
Сначала он проверяет, является ли название магазина существует в store
таблицы, если не вставляет его и кэширует возвращающийся идентификатор, делает то же самое для product
по названию и product_url
по ссылке.
Есть ли способ Postgres вставить данные в эту таблицу (и заграничные таблицы) за один раз, не выполняя все эти проверки один за другим? Я посмотрел на CTE (WITH), но я не уверен, что это решение этой проблемы.
В обратном и четвертом виде код и его внутри транзакции становится тяжелым.
Есть некоторые older SO posts, которые похожи, но решения не кажутся жизнеспособными. Кажется, что я смотрю this one с использованием USPERT и CTE.