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。否则,我需要为每个表创建一个单独的 Header/LineRelatedData表。这些数据最终会聚合到一个表中,并且拥有单独的RelatedData表意味着具有强关系的单独列或没有关系的单个列。

我正在使用 SSIS 插入我的数据,并且此表方案导致 RBAR(通过痛苦行进行行)方法来插入父级然后插入子级。我可以创建一个视图并使用而不是触发器来简化它,但是有没有更好的方法来插入记录,或者这是表设计错误的症状?

4

1 回答 1

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)

我将带有派生列的数据插入到中间表中。

然后我按照使用 SSIS 第 2 部分插入父表和子表中描述的过程进行操作。

  • 创建数据流任务以插入父记录
  • 创建数据流任务以查找父标识符并插入子记录
于 2013-07-22T16:28:20.450 回答