我有几个表用于将自然键减少为代理键。
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 :(得分: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中描述的过程进行了操作。