0Pricing
SQL Academy · Ders

Olgu ve Boyut Tabloları

Bir veri ambarının yapı taşları.

Olgu ve Boyut Tabloları, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 2. 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ı Nedir

Veri ambarı, raporlama ve analitik sorgular için tasarlanmış merkezi bir depodur. Hızlı yazma işlemleri için optimize edilen işlemsel bir veritabanının aksine ambar, büyük miktarda geçmiş veri üzerinde hızlı okuma işlemleri için ayarlanmıştır.

Bir ambarı düzenlemenin en yaygın yolu, verileri iki tablo türüne ayıran bir yıldız şeması kullanmaktır: olgu tabloları ve boyut tabloları.

Olgu Tabloları Tanımlandı

Bir olgu tablosu, ölçülebilir ve nicel olayları — analiz etmek istediğiniz şeyleri — depolar. Her satır; satış, web sayfası görüntüleme veya destek talebi gibi bir iş olayının tek bir gerçekleşmesini temsil eder.

Olgu tabloları genellikle geniş (çok sayıda satır) ve dar (az sayıda sütun) olur; sütunların çoğu boyut tablolarına yönelik yabancı anahtarlardan veya quantity ya da revenue gibi sayısal ölçülerden oluşur.

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

Boyut Tabloları Tanımlandı

Bir boyut tablosu, her olguya bağlam sağlayan açıklayıcı öznitelikleri depolar. Örnek olarak ürün boyutunda (ad, kategori, marka) veya tarih boyutunda (gün, ay, çeyrek, yıl) bulunan öznitelikler verilebilir.

Boyut tabloları genellikle kısa (daha az satır) ancak geniş (çok sayıda açıklayıcı sütun) olur. Olgu tablosuna vekil tamsayı anahtarları kullanılarak bağlanırlar.

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

Tarih Boyutu

Tarih boyutu, tüm ambarlardaki en yaygın boyuttur. Olgu tablosunda ham bir TIMESTAMP depolamak yerine, önceden oluşturulmuş bir takvim tablosuna başvuran bir tamsayı anahtar depolarsınız.

Bu sayede sorgu sırasında tarih hesaplamaları yapmadan mali çeyreğe, haftanın gününe, tatil göstergelerine ve diğer takvim özniteliklerine göre filtreleme veya gruplama yapabilirsiniz.

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

Yıldız Şeması Kalıbı

Ortada bir olgu tablosunun ve dışa doğru yayılan boyut tablolarının bulunduğu bir diyagram çizdiğinizde, bu yapı bir yıldıza benzer; yıldız şeması adı da buradan gelir.

Olgu tablosundaki yabancı anahtarlar her boyutun birincil anahtarlarına işaret eder. Sorgular genellikle ham sayılara açıklayıcı bağlam eklemek için olgu tablosunu bir veya daha fazla boyutla birleştirir.

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

Vekil Anahtarlar ve Doğal Anahtarlar

Boyut tabloları, herhangi bir iş anlamından bağımsız olarak veritabanı tarafından oluşturulan sentetik tamsayılar olan vekil anahtarları kullanır. Ürün SKU'su veya müşteri e-postası gibi doğal anahtarlar zaman içinde değişebilir; ancak vekil anahtarlar hiçbir zaman değişmez.

Vekil anahtarları kullanmak, olgu tablosunu üst sistemlerdeki değişikliklerden yalıtır ve tamsayı karşılaştırmaları dize karşılaştırmalarından daha ucuz olduğundan birleştirme işlemlerini hızlandırır.

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

Ayrıntı Düzeyi: Olgu Tablosundaki Detay Seviyesi

Bir olgu tablosunun ayrıntı düzeyi, tek bir satırın tam olarak neyi temsil ettiğini açıklar. Bir ambar oluşturmadan önce ayrıntı düzeyini belirtmeniz gerekir; örneğin, bir satış siparişindeki her bir ürün satırı için bir satır.

İyi tanımlanmış bir ayrıntı düzeyi, belirsiz toplulaştırmaları önler. Farklı satırlar farklı olayları temsil ediyorsa SUM ve COUNT sonuçlarınız anlamsız olur.

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

Toplanabilir, Kısmen Toplanabilir ve Toplanamayan Ölçüler

Olgular, nasıl toplulaştırılabildiklerine göre üç türe ayrılır:

  • Toplanabilir — tüm boyutlar üzerinden toplanabilir (örneğin revenue, quantity).
  • Kısmen toplanabilir — bazı boyutlar üzerinden toplanabilir, ancak tüm boyutlar üzerinden toplanamaz (örneğin hesap balance değeri müşteriler üzerinden toplanabilir, ancak zaman üzerinden toplanamaz).
  • Toplanamayan — anlamlı bir şekilde toplanamaz (örneğin unit_price, ratio). Bunun yerine AVG veya diğer toplulaştırmaları kullanın.
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;

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

Boyut öznitelikleri zaman içinde değişir; bir müşteri ülkesini değiştirebilir, bir ürünün kategorisi değişebilir. Yavaş Değişen Boyutlar (SCD) bu değişiklikleri yönetir:

  • Tür 1 — Eski değerin üzerine yazılır. Basittir, ancak geçmiş kaybolur.
  • Tür 2 — Yeni bir vekil anahtarla ve geçerlilik tarihleriyle yeni bir satır eklenir. Tüm geçmiş korunur; böylece geçmişteki olgular boyutun doğru sürümüne işaret etmeye devam eder.
-- 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);

Dejenere Boyutlar

Bazen bir boyut özniteliğinin kendi tablosuna ihtiyacı olmaz. Dejenere boyut, kendisine karşılık gelen bir boyut tablosu olmadan doğrudan olgu tablosunda bulunan bir boyut anahtarıdır.

Klasik örnekler arasında sipariş numaraları, fatura numaraları veya talep kimlikleri bulunur. Bunlar ayrıntıya inme işlemi için bağlam sağlar; ancak ayrı bir tabloda depolanmaya değer başka açıklayıcı sütunları yoktur.

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

Tam Yıldız Şemasını Sorgulama

Hepsini bir araya getirirsek: tipik bir ambar sorgusu, olgu tablosunu birkaç boyutla birleştirir, boyut özniteliklerine filtre uygular ve olgu tablosundaki ölçüleri toplulaştırır.

Sorgu iyileştiricisi, olgu tablosundaki yabancı anahtarlar dizinlendiği ve boyut tabloları görece küçük olduğu için bu çoklu birleştirmeleri verimli bir şekilde yönetebilir.

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;

Hızlı Kontrol: Olgu ve Boyut Karşılaştırması

Yıldız şemasında olgu ve boyut tablolarının nasıl farklılaştığını anlayıp anlamadığınızı sınayın.

Ders Özeti

Bu derste, bir veri ambarı yıldız şemasının temel yapı taşlarını öğrendiniz:

  • Olgu tabloları, sayısal ölçüler ve yabancı anahtarlarla birlikte ölçülebilir olayları (satışlar, tıklamalar, işlemler) barındırır.
  • Boyut tabloları, vekil anahtarları kullanarak açıklayıcı bağlam (kim, ne, nerede, ne zaman) sağlar.
  • Ayrıntı düzeyi, tek bir olgu satırının tam olarak neyi temsil ettiğini tanımlar; bunu oluşturmaya başlamadan önce belirtin.
  • Ölçüler toplanabilir, kısmen toplanabilir veya toplanamayabilir; bu özellik, bunları nasıl toplulaştıracağınızı belirler.
  • SCD Türü 2, geçerlilik tarihleriyle yeni satırlar ekleyerek geçmiş boyut değerlerini korur.
  • Dejenere boyutlar, açıklanacak ek öznitelikleri olmadığında olgu tablosunda bulunur.

Olgu ve boyut tablolarını anlamak, hızlı, ölçeklenebilir ve analitik açıdan güçlü ambarlar oluşturmanın temelidir.

Sıkça Sorulan Sorular

“Olgu ve Boyut Tabloları” dersi ücretsiz mi?

Evet — “Olgu ve Boyut Tabloları” 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.

“Olgu ve Boyut Tabloları” dersinde ne öğreneceğim?

Bir veri ambarının yapı taşları. 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 2. dersidir.

“Olgu ve Boyut Tabloları” 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