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ます。このデータは最終的に 1 つのテーブルに集約されます。別々のRelatedDataテーブルを持つことは、強力な関係を持つ別々の列か、関係のない単一の列のいずれかを意味します。

私は SSIS を使用してデータを挿入しています。このテーブル スキームは、親を挿入してから子を挿入するための RBAR (行による行による行) メソッドにつながります。ビューを作成し、代わりにトリガーを使用して単純化することもできますが、レコードを挿入するためのより良い方法はありますか、それともテーブル設計が悪いことの兆候ですか?

4

1 に答える 1

0

私が使用している考えられる解決策の 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),
    SourceId NVARCHAR(100) NOT NULL
);

SSIS パッケージ内で、連結されたデータを含む派生列を作成できます。

表現:

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

派生列を含むデータを中間テーブルに挿入しました。

次に、Insert Parent and Child Tables with SSIS Part 2 で説明されているこのプロセスに従いました。

  • 親レコードを挿入するデータ フロー タスクを作成する
  • 親識別子を検索して子レコードを挿入するデータ フロー タスクを作成する
于 2013-07-22T16:28:20.450 に答える