Ich arbeite mit einem Sternschema für ein Data Warehouse und habe ein Problem mit Kopf- und Werbebuchungen aus verschiedenen Datenquellen.
CREATE TABLE DataSourceAHeader
(
OrderId INT NOT NULL
,TotalCost MONEY NOT NULL
-- Date, etc...
);
CREATE TABLE DataSourceALine
(
OrderId INT NOT NULL
,LineNumber INT NOT NULL
-- Dates, etc...
);
CREATE TABLE DataSourceBLine
(
OrderId INT NOT NULL
,Cost MONEY NOT NULL
,LineNumber INT NOT NULL
);
Ich habe Datenquellen A und B, die dieselben Daten auf unterschiedliche Weise darstellen. Datenquelle A enthält Kopfzeilen und Werbebuchungen, enthält jedoch nur das Nettoergebnis (Gesamtkosten) in der Kopfzeile. Datenquelle B enthält nur Werbebuchungen und jede Position hat ein Ergebnis (Kosten).
Ich konnte zwei Faktentabellen halten (eine für den Kopf und eine für die Einzelposten), aber ich habe recherchiert und es scheint nicht ratsam. Gibt es eine Strategie, um mit dieser Art von nicht übereinstimmendem Format umzugehen, oder sollten sie in separaten Data Warehouses gespeichert werden (ein Warehouse pro Datenquelle)?
Meine aktuelle Strategie:
CREATE TABLE Fact.Order
(
Id BIGINT IDENTITY PRIMARY KEY
,OrderId INT NOT NULL
,Cost MONEY NOT NULL
-- Date key, etc...
);
CREATE TABLE Fact.OrderLine
(
Id BIGINT IDENTITY PRIMARY KEY
,OrderFactId BIGINT NOT NULL REFERENCES Fact.Order (Id)
,LineNumber INT NOT NULL
-- related line stuff
);
DataSourceAHeader
und DataSourceBLine
werden in Order
und eingefügt OrderLine
. DataSourceBLine
wird eine Zeile pro Zeile aufgeteilt.
Hier ist ein Beispiel für ein DataSourceAHeader
undDataSourceALine
SELECT * FROM Fact.Order;
|------------------------------------|
| Id | OrderId | Cost |
| 1 | 1100 | 12000.00 |
| 2 | 1101 | 10000.00 |
|------------------------------------|
SELECT * FROM Fact.OrderLine;
|-------------------------------------------|
| Id | OrderFactId | LineNumber |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
| 6 | 2 | 3 |
|-------------------------------------------|
Hier ist ein Beispiel für a DataSourceBLine
SELECT * FROM Fact.Order;
|---------------------------------|
| Id | OrderId | Cost |
| 1 | 1000 | 12.00 |
| 2 | 1000 | 10.00 |
|---------------------------------|
SELECT * FROM Fact.OrderLine;
|-------------------------------------------|
| Id | OrderFactId | LineNumber |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
|-------------------------------------------|
Bearbeiten:
Das TotalCost
in der Kopfzeile kann nicht auf die Zeilenebene gebracht werden. Ich unterhielt mich mit einem Bekannten des Architekten und sein Rat war, zwei separate Faktentabellen zu implementieren, eine für die Kopfzeile (Zusammenfassung) und eine für die Zeilen (Detail), und nur NULL
Werte für die fehlenden Zeileninformationen für zu haben DataSourceA
.
Edit2:
Ich versuche, generisch mit der OrderId umzugehen, da ich mehrere weitere Datenquellen habe, die ähnliche OrderId-Schemata (Kollisionen) enthalten können. Ich habe eine Zuordnungstabelle implementiert, um die Quellkennungen in das Warehouse zu übersetzen.
Edit3:
Mit der Absicht, dass diese Frage nicht nur für mich selbst hilfreich ist, möchte ich, dass die Antwort die folgenden Details enthält (hauptsächlich, um zusammenzustellen, worüber alle bereits nachgedacht haben):
- Welche Ansätze gibt es im Allgemeinen, um verwandte disjunkte Datensätze in Form von Zusammenfassungen / Details (einzelne Faktentabelle oder Zusammenfassung / Detail-Faktentabellen) aufzulösen?
- Was sind die Nachteile jedes Ansatzes?
- Welche Struktur könnte die Faktentabelle annehmen, um mit fehlenden (oder irrelevanten) Daten umzugehen?
- (Zwei-Fakten-Tabellen-Ansatz) In welchen Fällen wäre es ratsam, die Zusammenfassung herunterzurollen, anstatt die Details aufzurollen?
DataSourceBLine
. Jede Werbebuchung wird zu einer separaten Zeile.