В моей схеме базы данных есть сущность, которая идентифицирована. Идентификатор может быть использован повторно, и, таким образом, существует взаимосвязь «один ко многим» с объектом. Пример: человек может иметь псевдоним. Псевдонимы не являются уникальными и могут использоваться многими людьми. Таким образом, схема может выглядеть так:
PERSON
id
name
nickname_id
NICKNAME
id
name
Проблема в том, что при вставке нового человека мне нужно сначала запросить NICKNAME
, чтобы узнать, существует ли псевдоним. Если этого не произойдет, я должен создать строку в NICKNAME
. При вставке многих людей это может быть медленным, поскольку каждая вставка человека приводит к запросу на NICKNAME
.
Я мог бы оптимизировать большие вставки, сначала запросив Nickname для всех псевдонимов. Язык запросов JPA:
SELECT n FROM NICKNAME n WHERE name in ('Krusty', 'Doppy', 'Flash', etc)
А затем при необходимости создайте новые псевдонимы, а затем установите nickname_id для людей.
Это немного усложняет программное обеспечение, поскольку оно должно временно хранить псевдонимы в памяти. Кроме того, некоторые базы данных имеют ограничение на параметры предложения IN
(SQL Server 2100 или около того), поэтому я выполняю несколько запросов.
Мне любопытно, как эта проблема решается другими. Более конкретно, когда база данных нормализуется и объект имеет отношения с другим, вставка нового объекта в основном приводит к необходимости проверки другого объекта. Для больших вставок это может быть медленным, если операция не будет перенесена в область кода. Есть ли способ автоматической вставки связанных строк таблицы?
К вашему сведению, я использую реализацию JPA Hibernate