0Pricing
SQL Academy · Pelajaran

Tabel Fakta dan Dimensi

Komponen dasar gudang data.

Tabel Fakta dan Dimensi adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Apa Itu Gudang Data?

Gudang data adalah repositori pusat yang dirancang untuk pelaporan dan kueri analitis. Berbeda dari basis data transaksional yang dioptimalkan untuk penulisan cepat, gudang data disesuaikan untuk pembacaan cepat atas data historis dalam jumlah besar.

Cara paling umum untuk mengatur gudang data adalah menggunakan skema bintang, yang membagi data menjadi dua jenis tabel: tabel fakta dan tabel dimensi.

Definisi Tabel Fakta

Tabel fakta menyimpan peristiwa terukur dan kuantitatif — hal-hal yang ingin Anda analisis. Setiap baris mewakili satu kejadian bisnis, seperti penjualan, kunjungan halaman web, atau tiket dukungan.

Tabel fakta biasanya memiliki banyak baris dan sedikit kolom, dengan sebagian besar kolom berupa kunci asing ke tabel dimensi atau ukuran numerik seperti quantity atau revenue.

CREATE TABLE fact_sales (
  sale_id      SERIAL PRIMARY KEY,
  date_key     INT NOT NULL,
  product_key  INT NOT NULL,
  customer_key INT NOT NULL,
  store_key    INT NOT NULL,
  quantity     INT NOT NULL,
  unit_price   NUMERIC(10, 2) NOT NULL,
  total_amount NUMERIC(12, 2) NOT NULL
);

Definisi Tabel Dimensi

Tabel dimensi menyimpan atribut deskriptif yang memberikan konteks pada setiap fakta. Contohnya adalah dimensi produk (nama, kategori, merek) atau dimensi tanggal (hari, bulan, kuartal, tahun).

Tabel dimensi biasanya memiliki sedikit baris, tetapi banyak kolom deskriptif. Tabel ini digabungkan dengan tabel fakta menggunakan kunci bilangan bulat pengganti.

CREATE TABLE dim_product (
  product_key  SERIAL PRIMARY KEY,
  product_name VARCHAR(200) NOT NULL,
  category     VARCHAR(100),
  brand        VARCHAR(100),
  unit_cost    NUMERIC(10, 2)
);

CREATE TABLE dim_customer (
  customer_key SERIAL PRIMARY KEY,
  full_name    VARCHAR(200) NOT NULL,
  email        VARCHAR(200),
  country      VARCHAR(100),
  segment      VARCHAR(50)
);

Dimensi Tanggal

Dimensi tanggal adalah dimensi yang paling umum dalam gudang data mana pun. Alih-alih menyimpan TIMESTAMP mentah dalam tabel fakta, Anda menyimpan kunci bilangan bulat yang merujuk ke tabel kalender yang telah dibuat sebelumnya.

Dengan begitu, kueri dapat menyaring atau mengelompokkan berdasarkan kuartal fiskal, hari dalam minggu, penanda hari libur, dan atribut kalender lainnya tanpa melakukan perhitungan tanggal saat kueri dijalankan.

CREATE TABLE dim_date (
  date_key       INT PRIMARY KEY,  -- e.g. 20240315
  full_date      DATE NOT NULL,
  day_of_week    VARCHAR(10),
  day_of_month   INT,
  month_num      INT,
  month_name     VARCHAR(20),
  quarter        INT,
  year           INT,
  is_holiday     BOOLEAN DEFAULT FALSE,
  fiscal_quarter INT
);

-- Sample row
INSERT INTO dim_date VALUES
  (20240315, '2024-03-15', 'Friday', 15, 3, 'March', 1, 2024, FALSE, 2);

Pola Skema Bintang

Ketika Anda menggambar diagram dengan satu tabel fakta di tengah dan tabel dimensi memancar ke luar, bentuknya seperti bintang — karena itu namanya skema bintang.

Kunci asing dalam tabel fakta menunjuk ke kunci utama setiap dimensi. Kueri biasanya menggabungkan tabel fakta dengan satu atau beberapa dimensi untuk menambahkan konteks deskriptif pada angka mentah.

-- Join fact to two dimensions to enrich a sales report
SELECT
  dp.product_name,
  dp.category,
  SUM(fs.quantity)     AS total_units_sold,
  SUM(fs.total_amount) AS total_revenue
FROM fact_sales fs
JOIN dim_product  dp ON dp.product_key  = fs.product_key
JOIN dim_date     dd ON dd.date_key     = fs.date_key
WHERE dd.year = 2024
GROUP BY dp.product_name, dp.category
ORDER BY total_revenue DESC;

Kunci Pengganti dibandingkan Kunci Alami

Tabel dimensi menggunakan kunci pengganti — bilangan bulat sintetis yang dihasilkan oleh basis data dan tidak bergantung pada makna bisnis apa pun. Kunci alami (seperti SKU produk atau alamat surel pelanggan) dapat berubah seiring waktu, tetapi kunci pengganti tidak pernah berubah.

Penggunaan kunci pengganti melindungi tabel fakta dari perubahan pada sistem hulu dan membuat penggabungan lebih cepat karena perbandingan bilangan bulat lebih murah daripada perbandingan teks.

-- Surrogate key approach: integer join is fast
SELECT fs.sale_id, dc.full_name, fs.total_amount
FROM fact_sales fs
JOIN dim_customer dc ON dc.customer_key = fs.customer_key
WHERE dc.country = 'Germany'
LIMIT 10;

-- Natural key approach (avoid in warehouses): slower string join
-- JOIN dim_customer dc ON dc.email = fs.customer_email

Granularitas: Tingkat Detail dalam Tabel Fakta

Granularitas tabel fakta menjelaskan dengan tepat apa yang diwakili oleh satu baris. Sebelum membangun gudang data, Anda harus menetapkan granularitasnya — misalnya, satu baris untuk setiap baris produk individual dalam pesanan penjualan.

Granularitas yang didefinisikan dengan baik mencegah agregasi yang ambigu. Jika baris yang berbeda mewakili peristiwa yang berbeda, hasil SUM dan COUNT Anda tidak akan bermakna.

-- Grain: one row per product per order line
-- Each row = one line item sold in one transaction
SELECT
  sale_id,
  date_key,
  product_key,
  quantity,
  unit_price,
  total_amount
FROM fact_sales
WHERE date_key = 20240315
ORDER BY sale_id;

Ukuran Aditif, Semi-Aditif, dan Non-Aditif

Fakta memiliki tiga jenis berdasarkan cara Anda dapat mengagregasikannya:

  • Aditif — dapat dijumlahkan di seluruh dimensi (misalnya revenue, quantity).
  • Semi-aditif — dapat dijumlahkan pada beberapa dimensi, tetapi tidak semuanya (misalnya balance akun dapat dijumlahkan antar pelanggan, tetapi tidak sepanjang waktu).
  • Non-aditif — tidak dapat dijumlahkan secara bermakna (misalnya unit_price, ratio). Gunakan AVG atau agregasi lainnya.
SELECT
  dd.month_name,
  SUM(fs.total_amount)         AS total_revenue,   -- additive
  AVG(fs.unit_price)           AS avg_unit_price,   -- non-additive: use AVG
  SUM(fs.quantity)             AS total_units       -- additive
FROM fact_sales fs
JOIN dim_date dd ON dd.date_key = fs.date_key
WHERE dd.year = 2024
GROUP BY dd.month_name, dd.month_num
ORDER BY dd.month_num;

Dimensi yang Berubah Perlahan (SCD Tipe 1 dan 2)

Atribut dimensi berubah seiring waktu — pelanggan berpindah negara, produk berganti kategori. Dimensi yang Berubah Perlahan (SCD) menangani perubahan ini:

  • Tipe 1 — Timpa nilai lama. Sederhana, tetapi riwayat hilang.
  • Tipe 2 — Tambahkan baris baru dengan kunci pengganti baru dan tanggal berlaku. Cara ini mempertahankan seluruh riwayat sehingga fakta historis tetap menunjuk ke versi dimensi yang benar.
-- SCD Type 2: add a new version of the row
ALTER TABLE dim_customer ADD COLUMN valid_from DATE;
ALTER TABLE dim_customer ADD COLUMN valid_to   DATE;
ALTER TABLE dim_customer ADD COLUMN is_current BOOLEAN DEFAULT TRUE;

-- Expire the old row
UPDATE dim_customer
SET is_current = FALSE,
    valid_to   = CURRENT_DATE - INTERVAL '1 day'
WHERE email = 'anna@example.com' AND is_current = TRUE;

-- Insert the updated version
INSERT INTO dim_customer (full_name, email, country, segment, valid_from, valid_to, is_current)
VALUES ('Anna Muller', 'anna@example.com', 'Austria', 'Premium', CURRENT_DATE, '9999-12-31', TRUE);

Dimensi Degeneratif

Terkadang atribut dimensi tidak memerlukan tabel sendiri. Dimensi degeneratif adalah kunci dimensi yang berada langsung dalam tabel fakta tanpa tabel dimensi yang terkait.

Contoh klasiknya adalah nomor pesanan, nomor faktur, atau pengenal tiket. Atribut ini memberikan konteks untuk penelusuran lebih rinci, tetapi tidak memiliki kolom deskriptif lain yang layak disimpan dalam tabel terpisah.

-- order_number is a degenerate dimension:
-- it lives in the fact table, no dim_order table needed
CREATE TABLE fact_order_lines (
  line_id      SERIAL PRIMARY KEY,
  order_number VARCHAR(20) NOT NULL,  -- degenerate dimension
  date_key     INT NOT NULL,
  product_key  INT NOT NULL,
  customer_key INT NOT NULL,
  quantity     INT NOT NULL,
  line_total   NUMERIC(12, 2) NOT NULL
);

SELECT order_number, SUM(line_total) AS order_total
FROM fact_order_lines
GROUP BY order_number
ORDER BY order_total DESC
LIMIT 5;

Menjalankan Kueri pada Skema Bintang Lengkap

Jika digabungkan: kueri gudang data yang umum menggabungkan tabel fakta dengan beberapa dimensi, menerapkan penyaring pada atribut dimensi, dan mengagregasikan ukuran dari tabel fakta.

Pengoptimal dapat menangani penggabungan banyak arah ini secara efisien karena kunci asing tabel fakta memiliki indeks dan tabel dimensi relatif kecil.

SELECT
  dd.year,
  dd.quarter,
  dp.category,
  dc.country,
  SUM(fs.quantity)     AS units_sold,
  SUM(fs.total_amount) AS revenue
FROM fact_sales fs
JOIN dim_date     dd ON dd.date_key     = fs.date_key
JOIN dim_product  dp ON dp.product_key  = fs.product_key
JOIN dim_customer dc ON dc.customer_key = fs.customer_key
WHERE dd.year IN (2023, 2024)
  AND dp.category = 'Electronics'
GROUP BY dd.year, dd.quarter, dp.category, dc.country
ORDER BY dd.year, dd.quarter, revenue DESC;

Pemeriksaan Singkat: Fakta dibandingkan Dimensi

Ujilah pemahaman Anda tentang perbedaan tabel fakta dan tabel dimensi dalam skema bintang.

Rangkuman Pelajaran

Dalam pelajaran ini Anda mempelajari dasar-dasar skema bintang gudang data:

  • Tabel fakta menyimpan peristiwa terukur (penjualan, klik, transaksi) beserta ukuran numerik dan kunci asing.
  • Tabel dimensi memberikan konteks deskriptif (siapa, apa, di mana, kapan) menggunakan kunci pengganti.
  • Granularitas menentukan dengan tepat apa yang diwakili oleh satu baris fakta — tetapkan sebelum membangun gudang data.
  • Ukuran dapat bersifat aditif, semi-aditif, atau non-aditif, yang menentukan cara Anda mengagregasikannya.
  • SCD Tipe 2 mempertahankan nilai dimensi historis dengan menambahkan baris baru beserta tanggal berlaku.
  • Dimensi degeneratif berada dalam tabel fakta jika tidak memiliki atribut tambahan untuk dideskripsikan.

Memahami tabel fakta dan tabel dimensi merupakan dasar untuk membangun gudang data yang cepat, dapat diskalakan, dan andal untuk analisis.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Tabel Fakta dan Dimensi” gratis?

Ya — teks lengkap “Tabel Fakta dan Dimensi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Tabel Fakta dan Dimensi”?

Komponen dasar gudang data. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Tabel Fakta dan Dimensi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. OLTP vs OLAP
  2. Tabel Fakta dan Dimensi
  3. Skema Bintang dan Keping Salju
  4. Menulis Kueri Analitis
← Kembali ke SQL Academy