База данных принимает данные из потока, и все строки, необходимые для удовлетворения ограничения внешнего ключа, могут опаздывать или никогда не поступать.
Это может быть выполнено с помощью другого хранилища данных, одного без внешнего ключа. ограничения, а затем, когда все необходимые данные доступны, считайте в базу данных, которая имеет ограничения fk. Однако это добавляет сложности, и я бы хотел ее избежать.
Мы работаем над решением, которое создает строки-заполнители для указания внешнего ключа. Когда поступают реальные данные, заполнитель заменяется реальными значениями. Опять же, это добавляет сложности, но это лучшее решение, которое мы нашли на данный момент.
Как люди обычно решают эту проблему?
Редактировать : Некоторые примеры данных, которые может помочь объяснить проблему:
Допустим, у нас есть эти таблицы:
CREATE TABLE order (
id INTEGER NOT NULL,
order_number,
PRIMARY KEY (id),
UNIQUE (order_number)
);
CREATE TABLE line_item (
id INTEGER NOT NULL,
order_number INTEGER REFERENCES order(order_number),
PRIMARY KEY (id)
);
Если я сначала вставлю ордер, не проблема! Но скажем, я пытаюсь:
INSERT INTO line_item (order_number) values (123)
до того, как был вставлен заказ 123. Это, конечно, не выдержит ограничения fk. Но это может быть порядок, в котором я получаю данные, так как он читает из потока, который собирает эти данные из нескольких источников.
Кроме того, чтобы ответить на вопрос @ philpxy, я на самом деле мало что нашел по этому поводу. Одна вещь, которая была упомянута, была отложенные ограничения . Это механизм, который ожидает выполнения ограничений fk в конце транзакции. Однако я не думаю, что это возможно сделать в моем случае, поскольку эти операторы вставки будут выполняться в случайное время при получении данных.