尝试插入松散关系的父子记录

时间:2013-07-19 18:11:48

标签: sql sql-server tsql database-design ssis

我有几个表用于将自然键减少为代理键。

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(通过痛苦行排)方法插入父项然后插入子项。我可以创建一个视图并使用而不是触发器来简化它,但是有更好的方法来插入记录,还是这是表格设计不良的症状?

1 个答案:

答案 0 :(得分: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中描述的过程进行了操作。

  • 创建数据流任务以插入父记录
  • 创建数据流任务以查找父标识符并插入子记录
相关问题