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_tosü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
- Geçmişi Neden Saklamalı?
- Yalnızca Ekleme Yapılan Olay Tabloları
- Zamansal ve Sürümlenmiş Satırlar
- Olaylardan Durumu Yeniden Oluşturma