"Maßabmessungen messen" in der Faktentabelle "Akkumulieren akkumulieren"

8

Ich habe eine akkumulierte Snapshot- Faktentabelle, die den Ein- und Ausgang von Containern in einem Terminal verfolgt .

Die Container können auf drei verschiedene Arten ein- und aussteigen. Daher habe ich mir überlegt, eine spezifische Dimensionstabelle zu erstellen, in der diese drei möglichen Wege ( Zug, Schiff oder LKW ) aufgeführt sind.

Dann habe ich diesen Artikel gelesen, der im Grunde sagt, dass diese Technik falsch ist, aber ich kann nicht verstehen, warum.

Erster Artikel:

Manchmal, wenn eine Faktentabelle eine lange Liste von Fakten enthält, die in einer einzelnen Zeile nur spärlich ausgefüllt sind, ist es verlockend, eine Kennzahlentypdimension zu erstellen, die die Faktentabellenzeile auf einen einzelnen generischen Fakt reduziert, der durch die Kennzahlentypdimension identifiziert wird. Wir empfehlen diesen Ansatz im Allgemeinen nicht. Obwohl alle leeren Faktenspalten entfernt werden, multipliziert es die Größe der Faktentabelle mit der durchschnittlichen Anzahl belegter Spalten in jeder Zeile und erschwert die Berechnung innerhalb der Spalte erheblich. Diese Technik ist akzeptabel, wenn die Anzahl potenzieller Fakten extrem ist (in Hunderten), aber weniger als eine Handvoll auf eine bestimmte Faktentabellenzeile anwendbar wäre.

Ich verstehe, dass eine " Measure Type Dimension ", die für eine Transaktionsfaktentabelle implementiert ist, Probleme verursachen kann, wie in diesem anderen Artikel angegeben , aber ich kann keinen Nachteil erkennen, wenn sie für eine akkumulierte Snapshot-Tatsache verwendet wird .

Zweiter Artikel: (einige Nachteile der Implementierung einer "Maßtypdimension")

  1. [...] Wenn wir uns für eine "Maßtypdimension" entscheiden, verlieren wir diese Analysefähigkeit. Wenn eine Kennzahl nicht mit den anderen Kennzahlen kompatibel ist, können wir sie nicht addieren.
  2. [...] Je mehr Durchgänge unser SQL ausführen muss, um einen Bericht zu erstellen, desto langsamer ist der Bericht.
  3. [...] Wenn Sie im BI-Tool den Kennzahlfilter nicht einfügen, riskieren Sie, dass der Benutzer "Müllinformationen" erhält. Aus Sicht der Benutzerfreundlichkeit ist dieses Design ein Müll.

Antwort auf die Antwort von Mark Storey-Smith

Sehr nette Herangehensweise, daran hätte ich nie gedacht.

Eine andere Sache: Jeder Ein- und Ausstieg eines Fahrzeugs, das Container in das Terminal bringt, hat eine eindeutige ID, die mir andere Informationen gibt, wie: erwartete Ankunft des Fahrzeugs, tatsächliche Ankunft, wenn es sich um ein Schiff handelt, das Dock, wenn es sich um einen LKW handelt, die Mautstelle und viele andere Informationen ...

Dies sind 3 verschiedene Faktentabellen, die irgendwie mit der Container-Faktentabelle verknüpft sein müssen.

Ich dachte, dass die ID der Reise a ist degenerate dimension, also würde sie direkt in die Container-Faktentabelle gelangen. Mein Zweifel ist also: Soll ich 6 verschiedene Felder in die Container-Faktentabelle einfügen (Schiffsreise_in_ Schlüssel, Schiff_reise_aus_ Schlüssel, Zug_ Reise_in_ Schlüssel, Zug_ Reise_aus_ Schlüssel, LKW_ Reise_in_ Schlüssel, LKW_ Reise_aus_ Schlüssel) oder nur 2 andere Felder (Reise_in, Reise) zu diesen?

Ich hoffe mein Zweifel ist klar, danke.

Mattia Nocerino
quelle

Antworten:

3

Ich glaube, die Anleitung bezieht sich auf eine breite Faktentabelle, in der die meisten Messwerte null sind:

CREATE TABLE dbo.SparseFact
(
    Dim1Key     INT NOT NULL
    , Dim2Key   INT NOT NULL
    , Dim3Key   INT NOT NULL
    , Dim4Key   INT NOT NULL
    , Dim5Key   INT NOT NULL
    , Value1    INT NULL
    , Value2    INT NULL
    , Value3    INT NULL
    , Value4    INT NULL
    , Value5    INT NULL
    , Value6    INT NULL
    , Value7    INT NULL
    , Value8    INT NULL
    ..
    , Value101  INT NULL
    , Value102  INT NULL
    , Value103  INT NULL
);

Der Vorschlag ist, dass einige Leute alle Nullen sehen und sich stattdessen dafür entscheiden:

CREATE TABLE dbo.DontDoThisFact
(
    Dim1Key             INT NOT NULL
    , Dim2Key           INT NOT NULL
    , Dim3Key           INT NOT NULL
    , Dim4Key           INT NOT NULL
    , Dim5Key           INT NOT NULL
    , MeasureTypeKey    INT NOT NULL
    , Value             INT NOT NULL
);

Nicht gut.

In Ihrem Szenario würde ich mir so etwas ansehen, das sich sehr von dem Szenario unterscheidet, das in den Artikeln beschrieben wird, auf die Sie verwiesen haben.

CREATE TABLE dbo.InventoryFact
(
    ContainerKey        INT NOT NULL
    , TransportTypeKey  TINYINT NOT NULL
    , EntryDateTime     DATETIME NULL
    , ExitDateTime      DATETIME NULL
);

CREATE TABLE dbo.TransportType
(
    TransportTypeKey    TINYINT IDENTITY(1,1) NOT NULL
    , EntryTransport    CHAR(10) NOT NULL
    , ExitTransport     CHAR(10) NOT NULL
);

INSERT
    dbo.TransportType
SELECT
    EntryTransport
    , ExitTransport
FROM
    (
    SELECT EntryTransport = 'Train'
    UNION
    SELECT EntryTransport = 'Truck'
    UNION
    SELECT EntryTransport = 'Vessel'
    UNION
    SELECT EntryTransport = 'N/A'
    UNION
    SELECT EntryTransport = 'Unknown'
    ) en
CROSS JOIN
    (
    SELECT ExitTransport = 'Train'
    UNION
    SELECT ExitTransport = 'Truck'
    UNION
    SELECT ExitTransport = 'Vessel'
    UNION
    SELECT ExitTransport = 'N/A'
    UNION
    SELECT ExitTransport = 'Unknown'
    ) ex;

Zu den zusätzlichen Fragen ...

Ich würde hinzufügen ExpectedEntryDate, ExpectedExitDatezu Container/InventoryFact. Weniger sicher, ohne Sichtbarkeit aller Datenelemente, würde ich wahrscheinlich setzen EntryVoyageIdund ExitVoyageIdeine separate Junk - Dimension in zusammen als eine Reihe zusammen mit anderen degenerierten Datenelementen (Identifier für den LKW, Bahn , etc.).

Ich würde drei neue Dimensionen hinzufügen VesselVoyage, TruckVoyageund TrainVoyageund 6 Voyage Tasten (inbound / outbound) auf diese Tatsache (es ist 6 neue Schlüssel, nicht mehr als 6 zusätzliche Zeilen). Sie haben dann die Möglichkeit, Dockund Tollboothin der entsprechenden Reiseabmessung zu platzieren. Wenn Sie die generischen Daten in diesen Dimensionen ( VesselFlag, TruckCapacity) und die spezifischen in einer Junk-Dimension ( VesselName, VesselMMSI) behalten , explodieren sie nicht in der Größe.

Mark Storey-Smith
quelle
Hallo Markus, danke für diese Antwort. Dies gibt mir einen weiteren Zweifel, dass ich hier nicht in die Kommentare passen konnte. Ich habe meine Frage aktualisiert. Könnten Sie sie bitte überprüfen? Vielen Dank, ich habe Ihre Antwort bereits als die gute überprüft!
Mattia Nocerino