Skema Bintang dan Keping Salju
Modelkan data untuk analitik yang cepat.
Skema Bintang dan Keping Salju adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 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 Skema Gudang Data?
Dalam basis data transaksional (OLTP), Anda menormalisasi data untuk menghindari redundansi. Dalam gudang data, Anda sering kali sengaja melakukan denormalisasi — menukar ruang penyimpanan dengan kecepatan kueri. Dua pola klasik untuk mengatur tabel gudang data adalah Skema Bintang dan Skema Kepingan Salju.
Keduanya berpusat pada tabel fakta yang dikelilingi oleh tabel dimensi. Perbedaannya terletak pada sejauh mana Anda menormalisasi dimensi tersebut.
Tabel Fakta dan Tabel Dimensi
Tabel fakta menyimpan peristiwa terukur — penjualan, klik, pengiriman. Tabel ini memiliki banyak baris dan berisi ukuran numerik serta kunci asing ke dimensi.
Tabel dimensi menjelaskan konteks setiap peristiwa: siapa, apa, kapan, di mana. Dimensi memiliki lebih sedikit baris, tetapi lebih kaya akan kolom deskriptif.
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,
revenue NUMERIC(12, 2) NOT NULL
);
CREATE TABLE dim_product (
product_key SERIAL PRIMARY KEY,
product_name VARCHAR(200),
category VARCHAR(100),
brand VARCHAR(100),
unit_price NUMERIC(10, 2)
);Skema Bintang
Dalam skema bintang, setiap tabel dimensi terhubung langsung ke tabel fakta. Jika hubungan tersebut digambar di atas kertas, bentuknya seperti bintang — tabel fakta menjadi pusatnya, sedangkan dimensi menjadi titik-titiknya.
Tabel dimensi sepenuhnya terdenormalisasi: semua atribut deskriptif berada dalam satu tabel, meskipun beberapa atribut berulang di berbagai baris.
-- Star schema: all product info in one flat dimension table
CREATE TABLE dim_product (
product_key SERIAL PRIMARY KEY,
product_name VARCHAR(200),
category_name VARCHAR(100), -- denormalized
subcategory VARCHAR(100), -- denormalized
brand_name VARCHAR(100), -- denormalized
brand_country VARCHAR(100), -- denormalized
unit_price NUMERIC(10, 2)
);
CREATE TABLE dim_date (
date_key INT PRIMARY KEY, -- e.g. 20240315
full_date DATE,
year INT,
quarter INT,
month INT,
month_name VARCHAR(20),
week INT,
day_of_week VARCHAR(10)
);Kueri Skema Bintang
Tabel dimensi yang datar membuat kueri menjadi sederhana. Anda menggabungkan tabel fakta dengan satu atau beberapa dimensi lalu melakukan agregasi. Tidak ada penggabungan sekunder melalui rangkaian tabel yang ternormalisasi.
Inilah sebabnya skema bintang menghasilkan kueri analitis yang cepat — graf penggabungannya dangkal.
SELECT
d.year,
d.quarter,
p.category_name,
SUM(f.revenue) AS total_revenue,
SUM(f.quantity) AS units_sold
FROM fact_sales f
JOIN dim_date d ON d.date_key = f.date_key
JOIN dim_product p ON p.product_key = f.product_key
WHERE d.year = 2024
GROUP BY d.year, d.quarter, p.category_name
ORDER BY d.quarter, total_revenue DESC;Skema Kepingan Salju
Skema kepingan salju menormalisasi tabel dimensi lebih lanjut dengan memecahnya menjadi subdimensi. Misalnya, alih-alih menyimpan category_name dan brand_name di dalam dim_product, Anda membuat tabel dim_category dan dim_brand yang terpisah.
Diagram yang dihasilkan tampak seperti kepingan salju—lengan bercabang dari tabel-tabel yang saling terkait.
-- Snowflake schema: product dimension is normalized
CREATE TABLE dim_brand (
brand_key SERIAL PRIMARY KEY,
brand_name VARCHAR(100),
brand_country VARCHAR(100)
);
CREATE TABLE dim_category (
category_key SERIAL PRIMARY KEY,
category_name VARCHAR(100),
subcategory VARCHAR(100)
);
CREATE TABLE dim_product (
product_key SERIAL PRIMARY KEY,
product_name VARCHAR(200),
category_key INT REFERENCES dim_category(category_key),
brand_key INT REFERENCES dim_brand(brand_key),
unit_price NUMERIC(10, 2)
);Kueri Skema Kepingan Salju
Melakukan kueri pada skema kepingan salju memerlukan lebih banyak penggabungan untuk menyusun kembali data dimensi yang telah dipisahkan ke beberapa tabel. Pengoptimal kueri harus menelusuri tingkat tambahan tersebut, yang dapat menambah latensi dibandingkan dengan skema bintang.
Namun, dimensi yang dinormalisasi berukuran lebih kecil dan konsisten—memperbarui nama merek pada satu baris di dim_brand secara otomatis menerapkannya di semua tempat.
SELECT
d.year,
c.category_name,
b.brand_name,
SUM(f.revenue) AS total_revenue
FROM fact_sales f
JOIN dim_date d ON d.date_key = f.date_key
JOIN dim_product p ON p.product_key = f.product_key
JOIN dim_category c ON c.category_key = p.category_key
JOIN dim_brand b ON b.brand_key = p.brand_key
WHERE d.year = 2024
GROUP BY d.year, c.category_name, b.brand_name
ORDER BY total_revenue DESC;Kunci Pengganti vs Kunci Alami
Tabel dimensi biasanya menggunakan kunci pengganti—bilangan bulat yang dihasilkan oleh gudang data (misalnya, SERIAL)—alih-alih kunci alami dari sistem sumber.
Kunci pengganti tetap stabil meskipun sumber berubah, berukuran ringkas untuk tabel fakta berukuran besar, dan mendukung dimensi yang berubah perlahan yang memerlukan pelacakan riwayat.
-- Surrogate key (product_key) vs natural key (sku)
INSERT INTO dim_product (product_name, category_key, brand_key, unit_price)
VALUES ('Wireless Headphones', 3, 7, 89.99);
-- product_key is assigned by SERIAL -- the natural key (SKU) lives elsewhere
-- Natural key would be:
-- INSERT INTO dim_product (sku, product_name, ...)
-- VALUES ('WH-1000XM5', 'Wireless Headphones', ...);
-- Risky: SKU can be reused or reassigned by the source systemDimensi Tanggal
Dimensi tanggal bersifat khusus—dimensi ini hampir selalu ada dan biasanya telah diisi sebelumnya untuk tanggal selama bertahun-tahun. Menyimpan atribut turunan (tahun, kuartal, nama bulan, periode fiskal, penanda hari libur) dalam tabel dimensi menghindari penghitungan ulang saat kueri dijalankan.
-- Populate dim_date for one year using generate_series
INSERT INTO dim_date (date_key, full_date, year, quarter, month, month_name, week, day_of_week)
SELECT
TO_CHAR(d, 'YYYYMMDD')::INT AS date_key,
d AS full_date,
EXTRACT(YEAR FROM d)::INT AS year,
EXTRACT(QUARTER FROM d)::INT AS quarter,
EXTRACT(MONTH FROM d)::INT AS month,
TO_CHAR(d, 'Month') AS month_name,
EXTRACT(WEEK FROM d)::INT AS week,
TO_CHAR(d, 'Day') AS day_of_week
FROM generate_series('2024-01-01'::DATE, '2024-12-31'::DATE, '1 day') AS d;Dimensi yang Berubah Perlahan (SCD Type 2)
Apa yang terjadi ketika pelanggan berpindah kota atau produk berganti kategori? Anda perlu melacak riwayat. SCD Type 2 memasukkan baris dimensi baru untuk setiap perubahan, sekaligus menutup baris sebelumnya dengan tanggal akhir. Baris tabel fakta tetap menunjuk ke kunci dimensi lama sehingga keakuratan historis tetap terjaga.
-- SCD Type 2 customer dimension
CREATE TABLE dim_customer (
customer_key SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
customer_name VARCHAR(200),
city VARCHAR(100),
country VARCHAR(100),
valid_from DATE NOT NULL,
valid_to DATE,
is_current BOOLEAN DEFAULT TRUE
);
-- When a customer moves, close old row and insert new one:
UPDATE dim_customer
SET valid_to = CURRENT_DATE - 1, is_current = FALSE
WHERE customer_id = 42 AND is_current = TRUE;
INSERT INTO dim_customer (customer_id, customer_name, city, country, valid_from, is_current)
VALUES (42, 'Alice Muller', 'Berlin', 'Germany', CURRENT_DATE, TRUE);Bintang vs Kepingan Salju—Kompromi
Tidak ada satu skema yang selalu lebih baik. Pilihlah berdasarkan prioritas Anda:
- Bintang—lebih sedikit penggabungan, kueri lebih cepat, ETL lebih sederhana, biaya penyimpanan lebih tinggi. Paling sesuai untuk alat analitik yang berfokus pada pembacaan (Tableau, Power BI).
- Kepingan salju—dimensi yang dinormalisasi, lebih sedikit redundansi, pembaruan dimensi lebih mudah, tetapi memerlukan lebih banyak penggabungan. Lebih sesuai ketika dimensi berukuran besar atau digunakan bersama oleh beberapa tabel fakta.
-- Checking how much storage the denormalized category column costs
-- in a large dim_product (star schema) vs a separate dim_category (snowflake)
SELECT
COUNT(*) AS total_products,
COUNT(DISTINCT category_name) AS unique_categories,
pg_size_pretty(
SUM(pg_column_size(category_name))
) AS category_storage
FROM dim_product;Skema Galaksi (Konstelasi Fakta)
Ketika gudang data memiliki beberapa tabel fakta yang menggunakan tabel dimensi yang sama, hasilnya disebut skema galaksi (atau konstelasi fakta). Misalnya, gudang data ritel mungkin memiliki tabel fakta terpisah untuk penjualan dan pengembalian, yang keduanya merujuk ke dim_product dan dim_date yang sama.
Dimensi bersama memastikan penyaringan yang konsisten dan memudahkan perbandingan lintas tabel fakta.
CREATE TABLE fact_returns (
return_id SERIAL PRIMARY KEY,
date_key INT NOT NULL REFERENCES dim_date(date_key),
product_key INT NOT NULL REFERENCES dim_product(product_key),
customer_key INT NOT NULL,
quantity INT NOT NULL,
refund_amount NUMERIC(12, 2) NOT NULL
);
-- Cross-fact query: net revenue = sales - refunds
SELECT
d.year,
d.month,
SUM(s.revenue) AS gross_revenue,
SUM(r.refund_amount) AS total_refunds,
SUM(s.revenue) - COALESCE(SUM(r.refund_amount), 0) AS net_revenue
FROM dim_date d
LEFT JOIN fact_sales s ON s.date_key = d.date_key
LEFT JOIN fact_returns r ON r.date_key = d.date_key
WHERE d.year = 2024
GROUP BY d.year, d.month
ORDER BY d.month;Skema Bintang vs Kepingan Salju
Uji pemahaman Anda tentang skema bintang dan kepingan salju.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda mempelajari dua pola desain dasar gudang data:
- Skema Bintang—satu tabel fakta pusat yang dikelilingi tabel dimensi datar dan tidak dinormalisasi. Lebih sedikit penggabungan, kueri lebih cepat, dan penyimpanan sedikit lebih besar.
- Skema Kepingan Salju—tabel dimensi dinormalisasi lebih lanjut menjadi subdimensi. Redundansi lebih sedikit dan pembaruan lebih mudah, tetapi memerlukan lebih banyak penggabungan.
- Tabel fakta menyimpan peristiwa yang dapat diukur; tabel dimensi menyediakan konteks (siapa, apa, kapan, di mana).
- Kunci pengganti menjaga keakuratan historis dan memisahkan gudang data dari perubahan sistem sumber.
- SCD Type 2 melacak riwayat dimensi dengan menambahkan baris baru yang memiliki tanggal keberlakuan, alih-alih menimpa baris lama.
- Ketika beberapa tabel fakta menggunakan dimensi yang sama, desainnya menjadi skema galaksi (konstelasi fakta).
Pilih skema bintang untuk kesederhanaan dan kecepatan; pilih skema kepingan salju ketika dimensi berukuran besar, sering diperbarui, atau digunakan bersama oleh banyak tabel fakta.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Skema Bintang dan Keping Salju” gratis?
Ya — teks lengkap “Skema Bintang dan Keping Salju” 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 “Skema Bintang dan Keping Salju”?
Modelkan data untuk analitik yang cepat. 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 3 dari 4.
Berapa lama pelajaran “Skema Bintang dan Keping Salju” 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
- OLTP vs OLAP
- Tabel Fakta dan Dimensi
- Skema Bintang dan Keping Salju
- Menulis Kueri Analitis