2013-07-19 3 views
1

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

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 (строка по агонистической строке), чтобы вставить родителя, а затем вставить его. Я мог бы создать представление и использовать вместо триггера, чтобы упростить его, но есть ли лучший способ вставить записи или это симптом плохого дизайна таблицы?

ответ

0

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

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) 

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

Затем я следил за этим процессом, описанным в Insert Parent and Child Tables with SSIS Part 2.

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