SQL Academy · Ders

Yıldız ve Kar Tanesi Şemaları

Hızlı analiz için verileri modelleyin.

3. ders / 413 adım

Yıldız ve Kar Tanesi Şemaları, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.

Veri Ambarı Şeması Nedir

İşlemsel (OLTP) bir veritabanında gereksiz tekrarı önlemek için verileri normalleştirirsiniz. Veri ambarında ise depolama alanını sorgu hızıyla değiş tokuş ederek verileri çoğu zaman kasıtlı olarak normalleştirmezsiniz. Ambar tablolarını düzenlemek için kullanılan iki klasik kalıp Yıldız Şeması ve Kar Tanesi Şemasıdır.

Her ikisinin merkezinde bir olgu tablosu ve çevresinde boyut tabloları bulunur. Aralarındaki fark, bu boyutları ne ölçüde normalleştirdiğinizdir.

Olgu Tabloları ve Boyut Tabloları

Bir olgu tablosu, satışlar, tıklamalar ve sevkiyatlar gibi ölçülebilir olayları depolar. Geniştir (çok sayıda satır içerir) ve boyutlara yönelik yabancı anahtarların yanı sıra sayısal ölçüler barındırır.

Bir boyut tablosu, her olayın bağlamını açıklar: kim, ne, ne zaman, nerede. Boyutlar daha dardır (daha az satır içerir), ancak açıklayıcı sütunlar açısından daha zengindir.

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

Yıldız Şeması

Bir yıldız şemasında her boyut tablosu olgu tablosuna doğrudan bağlanır. İlişkileri kâğıda çizdiğinizde yapı bir yıldıza benzer; olgu tablosu merkezde, boyutlar ise uçlarda yer alır.

Boyut tabloları tamamen normalleştirilmemiştir: bazı öznitelikler satırlar arasında tekrarlansa bile tüm açıklayıcı öznitelikler tek bir tabloda bulunur.

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

Yıldız Şeması Sorgusu

Düz boyut tabloları sorguları basitleştirir. Olgu tablosunu bir veya daha fazla boyutla birleştirip toplulaştırırsınız. Normalleştirilmiş tablo zincirleri üzerinden ikincil birleştirme işlemleri yapmanız gerekmez.

Yıldız şemalarının hızlı analitik sorgular sunmasının nedeni budur; birleştirme grafiği sığdır.

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;

Kar Tanesi Şeması

Kar tanesi şeması, boyut tablolarını alt boyutlara ayırarak daha da normalleştirir. Örneğin, dim_product içinde category_name ve brand_name saklamak yerine, ayrı dim_category ve dim_brand tabloları oluşturursunuz.

Ortaya çıkan diyagram kar tanesine benzer — birbiriyle ilişkili tabloların dallanan kolları vardır.

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

Kar Tanesi Şeması Sorgusu

Kar tanesi şemasını sorgulamak, tablolar arasında bölünmüş boyut verilerini yeniden birleştirmek için daha fazla birleştirme işlemi gerektirir. Sorgu iyileştiricisi ek düzeyler arasında ilerlemelidir; bu da yıldız şemasına kıyasla gecikmeyi artırabilir.

Bununla birlikte, normalleştirilmiş boyutlar daha küçüktür ve tutarlıdır — dim_brand içindeki tek bir satırda marka adını güncellemek, değişikliği her yerde otomatik olarak uygular.

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;

Vekil Anahtarlar ve Doğal Anahtarlar

Boyut tablolarında genellikle kaynak sistemdeki doğal anahtar yerine, ambar tarafından üretilen bir vekil anahtar — örneğin bir tamsayı (SERIAL) — kullanılır.

Vekil anahtarlar, kaynak değişse bile sabit kalır; büyük olgu tablolarında az yer kaplar ve geçmişin izlenmesi gereken yavaş değişen boyutları destekler.

-- 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 system

Tarih Boyutu

Tarih boyutu özeldir — neredeyse her zaman bulunur ve genellikle uzun yıllara ait tarihlerle önceden doldurulur. Yıl, çeyrek, ay adı, mali dönem ve tatil göstergesi gibi türetilmiş öznitelikleri boyut tablosunda saklamak, bunları sorgu zamanında yeniden hesaplama gereğini ortadan kaldırır.

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

Yavaş Değişen Boyutlar (SCD Türü 2)

Bir müşteri şehir değiştirdiğinde veya bir ürünün kategorisi değiştiğinde ne olur? Geçmişi izlemeniz gerekir. SCD Türü 2, her değişiklik için yeni bir boyut satırı ekler ve önceki satırı bir bitiş tarihiyle kapatır. Olgu tablosundaki satır yine eski boyut anahtarını gösterir; böylece geçmiş doğruluğu korunur.

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

Yıldız ve Kar Tanesi — Artılar ve Eksiler

Hiçbir şema her durumda daha iyi değildir. Önceliklerinize göre seçim yapın:

  • Yıldız — daha az birleştirme, daha hızlı sorgular, daha basit ETL ve daha yüksek depolama maliyeti. Okuma ağırlıklı analiz araçları (Tableau, Power BI) için en uygunudur.
  • Kar tanesi — normalleştirilmiş boyutlar, daha az veri tekrarı ve daha kolay boyut güncellemeleri sağlar; ancak daha fazla birleştirme gerektirir. Boyutlar büyük olduğunda veya birden çok olgu tablosu arasında paylaşıldığında daha uygundur.
-- 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;

Galaksi Şeması (Olgu Takımyıldızı)

Bir veri ambarında boyut tablolarını paylaşan birden çok olgu tablosu bulunduğunda ortaya çıkan yapıya galaksi şeması (veya olgu takımyıldızı) denir. Örneğin, bir perakende veri ambarında aynı dim_product ve dim_date tablolarına başvuran, satışlar ve iadeler için ayrı olgu tabloları bulunabilir.

Paylaşılan boyutlar tutarlı filtrelemeyi zorunlu kılar ve farklı olgu tabloları arasındaki karşılaştırmaları kolaylaştırır.

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;

Yıldız ve Kar Tanesi Şeması

Yıldız ve kar tanesi şemalarını anlayıp anlamadığınızı sınayın.

Ders Özeti

Bu derste iki temel veri ambarı tasarım desenini incelediniz:

  • Yıldız Şeması — düz ve normalleştirilmemiş boyut tablolarıyla çevrelenmiş merkezi bir olgu tablosu. Daha az birleştirme, daha hızlı sorgular ve biraz daha fazla depolama.
  • Kar Tanesi Şeması — boyut tabloları alt boyutlara ayrılarak daha da normalleştirilir. Daha az veri tekrarı ve daha kolay güncellemeler sağlar; ancak daha fazla birleştirme gerektirir.
  • Olgu tabloları ölçülebilir olayları saklar; boyut tabloları bağlam sağlar (kim, ne, ne zaman, nerede).
  • Vekil anahtarlar, geçmiş doğruluğunu korur ve veri ambarını kaynak sistemdeki değişikliklerden bağımsızlaştırır.
  • SCD Türü 2, eski satırların üzerine yazmak yerine geçerlilik tarihleriyle yeni satırlar ekleyerek boyut geçmişini izler.
  • Birden çok olgu tablosu boyutları paylaştığında tasarım galaksi (olgu takımyıldızı) şemasına dönüşür.

Basitlik ve hız için yıldız şemasını; boyutlar büyük, sık güncellenen veya birçok olgu tablosu arasında paylaşılan durumdaysa kar tanesi şemasını seçin.

Başlamak ücretsiz

Yapay zeka eğitmeniyle SQL öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
46
Dersler
183

Sıkça Sorulan Sorular

“Yıldız ve Kar Tanesi Şemaları” dersi ücretsiz mi?

Evet — “Yıldız ve Kar Tanesi Şemaları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.

“Yıldız ve Kar Tanesi Şemaları” dersinde ne öğreneceğim?

Hızlı analiz için verileri modelleyin. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Yıldız ve Kar Tanesi Şemaları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. OLTP ve OLAP Karşılaştırması
  2. Olgu ve Boyut Tabloları
  3. Yıldız ve Kar Tanesi Şemaları
  4. Analitik Sorgular Yazma
← SQL Academy Sayfasına Dön