Попытка вставить записи родительского ребенка со свободными отношениями

60
4

У меня есть несколько таблиц, которые используются для уменьшения естественных ключей в суррогатных ключах.

CREATE TABLE Mapping.RelatedData
(
Id INT IDENTITY NOT NULL PRIMARY KEY,
DataSetId INT NOT NULL REFERENCES DataSet (Id),
DataTypeId INT NOT NULL REFERENCES DataType (Id)
)

CREATE TABLE Mapping.RelatedDataForA
(
RelatedDataId INT NOT NULL REFERENCES Mapping.RelatedData (Id),
NatrualColumn1 INT NOT NULL,
NatrualColumn2 INT NOT NULL
)

CREATE TABLE Mapping.RelatedDataForB
(
RelatedDataId INT NOT NULL REFERENCES Mapping.RelatedData (Id),
NatrualColumn3 INT NOT NULL,
NatrualColumn4 INT NOT NULL
)

-- Several other tables for C, D, E, etc..

Таким образом, у меня могут быть отдельные таблицы

CREATE TABLE HeaderFormattedData
(
Id INT IDENTITY NOT NULL PRIMARY KEY,
RelatedDataId INT NOT NULL REFERENCES Mapping.RelatedData (Id)
DataKey INT NOT NULL
-- Other columns
)

CREATE TABLE LinesFormattedData
(
Id INT IDENTITY NOT NULL PRIMARY KEY,
RelatedDataId INT NOT NULL REFERENCES Mapping.RelatedData (Id),
DataKey VARCHAR(50) NOT NULL,
LineId INT NOT NULL
-- Other columns
)

Это имеет унифицированное отношение к RelatedData. В противном случае мне понадобится отдельная таблица заголовков/строк для каждой таблицы RelatedData. Эти данные в конечном итоге объединяются в одну таблицу, а отдельные таблицы RelatedData означают либо отдельные столбцы с сильными отношениями, либо один столбец без отношения.

Я использую SSIS для вставки моих данных, и эта схема таблицы приводит к методу RBAR (строка по агонистической строке), чтобы вставить родителя, а затем вставить его. Я мог бы создать представление и использовать вместо триггера, чтобы упростить его, но есть ли лучший способ вставить записи или это симптом плохого дизайна таблицы?

спросил(а) 2021-01-19T18:37:08+03:00 1 месяц, 1 неделя назад
1
Решение
87

Одним из возможных решений, которые я использую, является объединение уникальных данных в качестве исходного идентификатора.

CREATE TABLE Mapping.RelatedData
(
Id INT IDENTITY NOT NULL PRIMARY KEY,
DataSetId INT NOT NULL REFERENCES DataSet (Id),
DataTypeId INT NOT NULL REFERENCES DataType (Id),
SourceId NVARCHAR(100) NOT NULL
);

Внутри моего пакета SSIS я могу создать производный столбец с объединенными данными.

Выражение:

((DT_WSTR,10)NatrualColumn1) + ((DT_WSTR,10)NatrualColumn2)

Я вставил данные с производным столбцом в промежуточную таблицу.

Затем я следил за этим процессом, описанным в разделе "Вставить родительский и дочерний таблицы" с частью 2 службы SSIS.

    Создайте задачу потока данных, чтобы вставить родительские записи Создайте задачу потока данных для поиска родительского идентификатора и вставьте дочернюю запись

ответил(а) 2021-01-19T18:37:08+03:00 1 месяц, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема