“Mengukur Dimensi Jenis” di tabel fakta “Akumulasi Cuplikan”

8

Saya memiliki tabel fakta snapshot terakumulasi yang melacak masuk dan keluarnya kontainer di terminal .

Wadah dapat masuk dan keluar dengan 3 cara berbeda , jadi saya berpikir untuk membuat tabel dimensi spesifik yang mencantumkan 3 cara yang memungkinkan ini ( kereta, kapal atau truk ).

Kemudian saya membaca artikel ini yang pada dasarnya mengatakan bahwa teknik ini salah, tetapi saya tidak mengerti mengapa.

Artikel pertama:

Kadang-kadang ketika tabel fakta memiliki daftar panjang fakta yang jarang diisi dalam setiap baris individu, itu tergoda untuk membuat dimensi tipe ukuran yang mengecilkan baris tabel fakta menjadi fakta umum tunggal yang diidentifikasi oleh dimensi tipe ukuran. Kami biasanya tidak merekomendasikan pendekatan ini. Meskipun menghapus semua kolom fakta kosong, ini mengalikan ukuran tabel fakta dengan jumlah rata-rata kolom yang ditempati di setiap baris, dan itu membuat perhitungan intra-kolom jauh lebih sulit. Teknik ini dapat diterima ketika jumlah fakta potensial ekstrim (dalam ratusan), tetapi kurang dari segelintir akan berlaku untuk setiap baris tabel fakta yang diberikan.

Saya mengerti bahwa jika " Ukuran Ukuran Dimensi " diterapkan untuk tabel fakta transaksi dapat menimbulkan masalah seperti yang dikatakan artikel lain ini , tetapi saya tidak dapat melihat kelemahan jika digunakan untuk mengumpulkan fakta snapshot .

Artikel kedua: (beberapa kelemahan menerapkan "Ukuran Tipe Dimensi")

  1. [...] Jika kita menggunakan "Ukuran Tipe Dimensi" kita akan kehilangan kemampuan analitik ini. Jika satu ukuran tidak kompatibel dengan ukuran lainnya, kami tidak dapat menambahkannya.
  2. [...] Semakin banyak jumlah melewati SQL kita perlu dijalankan untuk menghasilkan laporan, semakin lambat laporan.
  3. [...] Pada alat BI, jika Anda tidak memasang filter jenis ukur, Anda berisiko pengguna mendapatkan “informasi sampah”. Dari sudut pandang kegunaan, desain ini adalah sampah.

Tanggapan untuk jawaban Mark Storey-Smith

Pendekatan yang sangat bagus, saya tidak akan pernah memikirkan hal itu.

Hal lain: setiap masuk dan keluar kendaraan yang membawa kontainer ke terminal memiliki ID unik yang memberi saya informasi lain seperti: kedatangan kendaraan yang diharapkan, kedatangan aktual, apakah itu kapal dermaga, jika itu truk, jalan tol dan banyak informasi lain ...

Ini adalah 3 tabel fakta yang berbeda dan mereka harus dihubungkan entah bagaimana dengan tabel fakta wadah.

Saya berpikir bahwa ID dari pelayaran adalah degenerate dimension, jadi itu akan langsung masuk ke tabel fakta wadah. Jadi, keraguan saya adalah: haruskah saya menambahkan 6 bidang yang berbeda dalam tabel fakta wadah (vessel_voyage_in_key, vessel_voyage_out_key, train_voyage_in_key, train_voyage_out_key, truck_voyage_in_key, truck_voyage_out_key) atau hanya 2 bidang lainnya (voyage_in, berbagai tautan pelayaran ke tabel pelayaran yang terkait dengan tautan dinamis ke voyage)?

Saya harap keraguan saya jelas, terima kasih.

Mattia Nocerino
sumber

Jawaban:

3

Saya percaya panduan ini mengacu pada tabel fakta yang luas di mana sebagian besar nilai pengukuran adalah nol:

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
);

Sarannya adalah bahwa beberapa orang akan melihat semua nol dan memutuskan untuk melakukan ini sebagai gantinya:

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
);

Tidak baik.

Dalam skenario Anda, saya pikir saya akan melihat sesuatu seperti ini, yang sangat berbeda dengan skenario yang dijelaskan dalam artikel yang Anda referensikan.

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;

Untuk pertanyaan tambahan ...

Saya akan menambahkan ExpectedEntryDate, ExpectedExitDateke Container/InventoryFact. Kurang yakin, tanpa visibilitas dari semua elemen data, saya mungkin akan menempatkan EntryVoyageIddan ExitVoyageIddalam dimensi sampah yang terpisah bersama sebagai satu baris bersama dengan item data degenerasi lainnya (pengidentifikasi untuk truk, kereta api dll).

Saya akan menambahkan 3 dimensi baru untuk VesselVoyage, TruckVoyagedan TrainVoyagedan 6 kunci Voyage (inbound / outbound) untuk fakta yang satu ini (ini 6 kunci baru, bukan 6 baris tambahan). Anda kemudian memiliki opsi penempatan Dockdan Tollboothdalam dimensi Voyage yang sesuai. Jika Anda menyimpan data umum dalam dimensi ini ( VesselFlag, TruckCapacity) dan spesifik dalam dimensi sampah ( VesselName, VesselMMSI) mereka tidak akan meledak dalam ukuran.

Mark Storey-Smith
sumber
Hai Mark, terima kasih atas jawaban ini. Ini memberi saya keraguan lain bahwa saya tidak dapat memuat komentar di sini. Saya telah memperbarui pertanyaan saya .. bisakah periksa? Terima kasih banyak, saya sudah memeriksa jawaban Anda sebagai jawaban yang bagus!
Mattia Nocerino