2013-07-19 15 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表格分別設置一個Header/Line表。這些數據最終會彙總到一個表格中,並且具有單獨的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包中,我可以創建帶有concatinated數據的派生列。

表達:

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

我插入與派生列中的數據到一箇中介表。

然後我按照Insert Parent and Child Tables with SSIS Part 2中描述的這個過程。

  • 創建一個數據流任務插入父記錄
  • 創建一個數據流任務,以查找父標識符和插入子記錄