0Pricing
SQL Academy · Ders

Geçmişi Neden Saklamalı?

Geçmişten denetim, geri alma ve analiz.

Geçmişi Neden Saklamalı?, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 1. 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.

Üzerine Yazmanın Sorunu

Her UPDATE veya DELETE çalıştırdığınızda eski veriler sonsuza kadar kaybolur. Bu verimli görünebilir, ancak gerçek sorunlar doğurur: geçen salı fiyat neydi? veya bu kaydı kim ve ne zaman değiştirdi? gibi soruları yanıtlayamazsınız.

Geçmişi korumak, yalnızca en son sürümü değil, bir satırın her sürümünü saklamak anlamına gelir. Bu derste bunun neden önemli olduğunu ve SQL'in bunu yapmanıza nasıl yardımcı olduğunu inceleyeceksiniz.

Geçmişi Korumak için Üç Neden

Bir veritabanındaki geçmiş verileri korumanın üç klasik nedeni vardır:

1. Denetim — bir değişikliğin gerçekleştiğini, bunu kimin yaptığını ve ne zaman yaptığını kanıtlamak.
2. Geri alma — tüm veritabanını geri yüklemeden bir hatayı geri almak.
3. Analiz — geçmişle ilgili soruları yanıtlamak, eğilimleri fark etmek ve dönemleri karşılaştırmak.

İyi tasarlanmış bir geçmiş stratejisi, depolama alanını gereğinden fazla çoğaltmadan bu üç gereksinimi de karşılar.

Basit Bir Denetim Tablosu

En basit yaklaşım, her değişikliği kaydeden ayrı bir denetim tablosu kullanmaktır. Her satır eski değeri, yeni değeri, değişikliği kimin yaptığını ve ne zaman yaptığını yakalar.

Aşağıda bir products tablosu için denetim tablosu gösterilmektedir. operation sütunu INSERT, UPDATE veya DELETE değerlerini saklar.

CREATE TABLE products_audit (
  audit_id   SERIAL PRIMARY KEY,
  product_id INT            NOT NULL,
  operation  VARCHAR(6)     NOT NULL,  -- INSERT / UPDATE / DELETE
  old_price  NUMERIC(10,2),
  new_price  NUMERIC(10,2),
  changed_by TEXT           NOT NULL,
  changed_at TIMESTAMPTZ    NOT NULL DEFAULT NOW()
);

Denetim Tablosunu Doldurma

Bir denetim tablosuna elle yazabilirsiniz; ancak en güvenilir yaklaşım, veriler her değiştiğinde otomatik olarak çalışan bir veritabanı tetikleyicisidir. Böylece hiçbir uygulama kodu günlük kaydını atlayamaz.

Tetikleyicileri ele almadan önce yapıyı göstermek için burada doğrudan tek bir denetim satırı ekliyoruz.

INSERT INTO products_audit (product_id, operation, old_price, new_price, changed_by)
VALUES (42, 'UPDATE', 9.99, 12.49, 'alice');

SELECT * FROM products_audit ORDER BY changed_at DESC LIMIT 5;

Denetim İzini Okuma

Denetim tablosunda satırlar birikmeye başladığında, denetimle ilgili soruları yanıtlamak için bunları sorgulayabilirsiniz. Aşağıdaki sorgu, tek bir ürünün en yeniden eskiye sıralanmış tam fiyat geçmişini gösterir.

SELECT
  changed_at,
  changed_by,
  operation,
  old_price,
  new_price
FROM products_audit
WHERE product_id = 42
ORDER BY changed_at DESC;

Geçerlilik Tarihleri: Geçerlilik Zamanına Dayalı Geçmiş

Denetim tablosu değişikliği ne zaman yaptığınızı (işlem zamanı) kaydeder. Bazen ayrıca bir şeyin gerçek dünyada ne zaman geçerli olduğunu — yani geçerlilik zamanını — izlemeniz gerekir.

Ana tabloya valid_from ve valid_to sütunlarını eklemek, geçerlilik zamanına dayalı bir geçmiş oluşturur; buna bazen yavaş değişen boyut da denir (SCD Türü 2).

CREATE TABLE employee_history (
  id          SERIAL PRIMARY KEY,
  employee_id INT            NOT NULL,
  department  TEXT           NOT NULL,
  salary      NUMERIC(10,2)  NOT NULL,
  valid_from  DATE           NOT NULL,
  valid_to    DATE           -- NULL means current record
);

-- Current record for employee 7
INSERT INTO employee_history (employee_id, department, salary, valid_from)
VALUES (7, 'Engineering', 85000, '2023-01-01');

Yavaş Değişen Bir Kaydı Güncelleme

Bir çalışan departman değiştirdiğinde satırını UPDATE etmezsiniz. Bunun yerine valid_to değerini ayarlayarak eski satırı kapatır ve bitiş tarihi olmayan yeni bir satır eklersiniz. Böylece tüm geçmiş korunur.

-- Step 1: close the current record
UPDATE employee_history
SET valid_to = '2024-06-01'
WHERE employee_id = 7 AND valid_to IS NULL;

-- Step 2: insert the new record
INSERT INTO employee_history (employee_id, department, salary, valid_from)
VALUES (7, 'Product', 90000, '2024-06-01');

-- Verify history
SELECT department, salary, valid_from, valid_to
FROM employee_history
WHERE employee_id = 7
ORDER BY valid_from;

Zaman İçindeki Bir Noktayı Sorgulama

Geçerlilik zamanı sütunları sayesinde belirli bir tarihte neyin geçerli olduğunu sorabilirsiniz — bu, basit bir UPDATE modeliyle mümkün olmazdı.

WHERE yan tümcesi, hedef tarihin satırın geçerlilik aralığı içinde olup olmadığını denetler.

-- What department and salary did employee 7 have on 2023-09-15?
SELECT department, salary, valid_from, valid_to
FROM employee_history
WHERE employee_id = 7
  AND valid_from <= '2023-09-15'
  AND (valid_to > '2023-09-15' OR valid_to IS NULL);

Sistem Sürümlü Zamansal Tablolar

Modern SQL veritabanları (PostgreSQL 16+, SQL Server, MySQL 8) sistem sürümlü zamansal tabloları destekler. Veritabanı, işlem zamanını gizli sütunlarda otomatik olarak izler ve geçmiş durumları özel bir söz dizimiyle sorgulayabilirsiniz.

SQL Server örneği — kavram tüm veritabanı sistemlerinde aynıdır:

-- SQL Server / MariaDB style (illustrative)
CREATE TABLE orders (
  order_id    INT PRIMARY KEY,
  status      VARCHAR(20),
  total       NUMERIC(10,2),
  SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START,
  SysEndTime   DATETIME2 GENERATED ALWAYS AS ROW END,
  PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
) WITH (SYSTEM_VERSIONING = ON);

-- Query historical state
SELECT * FROM orders FOR SYSTEM_TIME AS OF '2024-01-15 12:00:00'
WHERE order_id = 100;

Geri Alma İçin Geçmişi Kullanma

Geçmiş tabloları yalnızca okumak için değildir; hataları geri almak için de kullanılabilir. Bir toplu iş 500 fiyat kaydını bozduysa, yedeğe dokunmadan bunları denetim tablosundan geri yükleyebilirsiniz.

-- Undo all price changes made by the bad batch job at a specific time
UPDATE products p
SET price = a.old_price
FROM products_audit a
WHERE p.id         = a.product_id
  AND a.operation  = 'UPDATE'
  AND a.changed_by = 'batch_job'
  AND a.changed_at BETWEEN '2024-03-10 02:00:00' AND '2024-03-10 02:05:00';

-- Confirm affected rows
SELECT COUNT(*) AS rows_restored FROM products_audit
WHERE changed_by = 'batch_job'
  AND changed_at BETWEEN '2024-03-10 02:00:00' AND '2024-03-10 02:05:00';

Zaman İçinde Analiz

Geçmiş verileri, zaman serisi analizlerinin önünü açar. Bir ölçütün zaman içinde nasıl değiştiğini izleyebilir, aydan aya değerleri karşılaştırabilir veya anormallikleri tespit edebilirsiniz; üstelik ayrı bir veri ambarına dokunmanız gerekmez.

Bu sorgu, denetim tablosunu kullanarak bir ürünün her takvim ayındaki ortalama fiyatını gösterir.

SELECT
  DATE_TRUNC('month', changed_at) AS month,
  ROUND(AVG(new_price), 2)         AS avg_price
FROM products_audit
WHERE product_id = 42
  AND operation IN ('INSERT', 'UPDATE')
GROUP BY 1
ORDER BY 1;

Bilginizi Sınayın

SQL'de geçmiş verilerin depolanması konusundaki anlayışınızı sınayın.

Özet: Geçmişi Neden Saklamalı?

Bu derste verilerin üzerine yazmanın neden riskli olduğunu ve SQL kalıplarının denetim, geri alma ve analiz için geçmişi nasıl koruduğunu öğrendiniz.

Temel çıkarımlar:

  • Denetim tabloları, kim tarafından ve ne zaman gerçekleştirildiğiyle birlikte her INSERT, UPDATE ve DELETE işlemini günlüğe kaydeder.
  • Geçerlilik zamanı (SCD Tür 2) satırları, gerçek dünyadaki zaman çizelgelerini kaydetmek için valid_from / valid_to sütunlarını kullanır.
  • Belirli zamana yönelik sorgular, bu tarih sütunlarına göre filtreleme yaparak geçmişle ilgili soruları yanıtlar.
  • Sistem sürümlü zamansal tablolar, işlem zamanı takibini veritabanı düzeyinde otomatikleştirir.
  • Geçmiş verileri, yedeklere ihtiyaç duymadan hedefli geri almayı ve zengin zaman serisi analizlerini mümkün kılar.

Geçmişi korumak bir yük değildir; güvenilir ve denetlenebilir sistemlerin temelidir.

Sıkça Sorulan Sorular

“Geçmişi Neden Saklamalı?” dersi ücretsiz mi?

Evet — “Geçmişi Neden Saklamalı?” 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.

“Geçmişi Neden Saklamalı?” dersinde ne öğreneceğim?

Geçmişten denetim, geri alma ve analiz. 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 1. dersidir.

“Geçmişi Neden Saklamalı?” 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. Geçmişi Neden Saklamalı?
  2. Yalnızca Ekleme Yapılan Olay Tabloları
  3. Zamansal ve Sürümlenmiş Satırlar
  4. Olaylardan Durumu Yeniden Oluşturma
← SQL Academy Sayfasına Dön