Zamansal ve Sürümlenmiş Satırlar
Geçerlilik zamanı ve belirli zamandaki sorgular.
Zamansal ve Sürümlenmiş Satırlar, 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.
Zamansal Tablolar Nelerdir?
Zamansal tablolar, verilerin zaman içinde nasıl değiştiğini izlemenizi sağlar. Bir şey değiştiğinde satırın üzerine yazmak yerine zamansal tablo, o satırın geçerli olduğu zaman aralığıyla etiketlenmiş her sürümünü korur.
İki temel kavram vardır: geçerlilik zamanı (olgunun gerçek dünyada doğru olduğu zaman) ve işlem zamanı (veritabanının olguyu kaydettiği zaman). İkisini birleştirdiğinizde tam anlamıyla iki zamanlı bir tablo elde edersiniz.
Geçerlilik Zamanı ve İşlem Zamanı Karşılaştırması
Geçerlilik zamanı, bir olgunun gerçek dünyada doğru olduğu zamanı ifade eder; örneğin bir çalışanın 2020-01-01 ile 2022-06-30 arasındaki maaşı. İşlem zamanı, veritabanı satırının eklendiği veya geçerliliğinin sona erdiği zamandır. Birlikte şu iki soruyu yanıtlarlar: Ne doğruydu? ve Bunu ne zaman öğrendik?
Pratik kullanım senaryolarının çoğu, valid_from ve valid_to sütunları kullanılarak elle uygulanabilen geçerlilik zamanı takibiyle başlar.
Geçerlilik Zamanı Tablosu Oluşturma
Sürümlü satırları depolamanın en basit yolu, valid_from ve valid_to zaman damgası sütunlarını eklemektir. valid_to değerinin NULL olması (veya 9999-12-31 gibi uzak bir geleceği gösteren bir belirteç kullanılması), satırın şu anda etkin olduğu anlamına gelir.
CREATE TABLE employee_salary (
id SERIAL PRIMARY KEY,
employee_id INT NOT NULL,
salary NUMERIC(12, 2) NOT NULL,
valid_from DATE NOT NULL,
valid_to DATE
);
INSERT INTO employee_salary (employee_id, salary, valid_from, valid_to)
VALUES
(1, 50000, '2020-01-01', '2022-06-30'),
(1, 60000, '2022-07-01', NULL);Güncel Sürümü Sorgulama
Her çalışan için şu anda etkin olan satırı bulmak üzere valid_to IS NULL olan (ucu açık) satırları veya bugünün tarihinin geçerlilik aralığı içinde kaldığı satırları filtreleyin. '9999-12-31' gibi bir belirteç değeri kullanmak, aralık karşılaştırmalarını kolaylaştırır.
SELECT employee_id, salary
FROM employee_salary
WHERE valid_to IS NULL
ORDER BY employee_id;Belirli Zamana Göre Sorgular
Belirli zamana göre sorgu şu soruyu sorar: Belirli bir anda veriler nasıldı? Verilen zaman damgasının geçerlilik penceresi içinde kaldığı satırları filtrelersiniz. Bu, zamansal tabloların en güçlü özelliklerinden biridir.
-- What was employee 1's salary on 2021-03-15?
SELECT employee_id, salary, valid_from, valid_to
FROM employee_salary
WHERE employee_id = 1
AND valid_from <= '2021-03-15'
AND (valid_to IS NULL OR valid_to > '2021-03-15');Sürümlü Satırı Güncelleme
Bir olgu değiştiğinde mevcut satırı yerinde UPDATE etmezsiniz. Bunun yerine valid_to değerini ayarlayarak mevcut satırı kapatır ve yeni değerle yeni bir satır INSERT edersiniz. Böylece eksiksiz geçmiş korunur.
-- Employee 1 gets a raise effective 2023-01-01
BEGIN;
-- Close the current open row
UPDATE employee_salary
SET valid_to = '2022-12-31'
WHERE employee_id = 1
AND valid_to IS NULL;
-- Insert the new version
INSERT INTO employee_salary (employee_id, salary, valid_from, valid_to)
VALUES (1, 72000, '2023-01-01', NULL);
COMMIT;Geçerlilik Dönemleri İçin Tarih Aralığı Kullanma
PostgreSQL'in daterange türü, bir geçerlilik dönemini tek bir sütun olarak zarif biçimde modeller. Bir tarihin aralık içinde bulunup bulunmadığını denetlemek için @> (içerir) işleçini kullanabilir ve aynı varlık için dönemlerin çakışmasını önlemek üzere bir dışlama kısıtı ekleyebilirsiniz.
CREATE TABLE employee_salary_v2 (
id SERIAL PRIMARY KEY,
employee_id INT NOT NULL,
salary NUMERIC(12, 2) NOT NULL,
valid_period DATERANGE NOT NULL,
EXCLUDE USING GIST (employee_id WITH =, valid_period WITH &&)
);
INSERT INTO employee_salary_v2 (employee_id, salary, valid_period)
VALUES
(1, 50000, '[2020-01-01, 2022-07-01)'),
(1, 60000, '[2022-07-01, infinity)');Tarih Aralığıyla Belirli Zamana Göre Sorgu
daterange yaklaşımıyla belirli zamana göre sorgu oldukça okunaklı hale gelir. @> işleci, verilen tarihin aralık içinde bulunduğunu denetler ve alt ve üst sınırları otomatik olarak ele alır.
-- What was employee 1's salary on 2021-03-15?
SELECT employee_id, salary, valid_period
FROM employee_salary_v2
WHERE employee_id = 1
AND valid_period @> '2021-03-15'::date;Sistem Sürümlü Tablolar (SQL Standardı)
SQL:2011 standardı, sistem sürümlü zamansal tabloları kullanıma sundu. Veritabanı, işlem zamanı sütunları olan row_start ve row_end alanlarını otomatik olarak yönetir. PostgreSQL'de bunu taklit edersiniz; SQL Server ve MariaDB'de ise SYSTEM VERSIONING yerleşik olarak bulunur.
Aşağıdaki örnek, kavrama başvuru olması için SQL Server / MariaDB söz dizimini gösterir.
-- SQL Server / MariaDB syntax (reference)
CREATE TABLE dbo.Product (
ProductID INT PRIMARY KEY,
Name VARCHAR(100),
Price DECIMAL(10,2),
SysStart DATETIME2 GENERATED ALWAYS AS ROW START,
SysEnd DATETIME2 GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (SysStart, SysEnd)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Product_History));Zamansal Birleştirmeler: İki Tabloyu Zamana Göre Hizalama
Yaygın bir zorluk, iki zamansal tabloyu eşleşen zaman dönemlerine göre birleştirmektir. Örneğin, çalışan maaşlarını her ikisinin de geçerlilik dönemleri bulunan departman atamalarıyla birleştirmek. Varlık anahtarı AND örtüşme koşulu üzerinden, aralıklar için && kullanarak veya açık tarih karşılaştırmalarıyla birleştirme yaparsınız.
CREATE TABLE dept_assignment (
employee_id INT,
department VARCHAR(50),
valid_period DATERANGE
);
INSERT INTO dept_assignment VALUES
(1, 'Engineering', '[2020-01-01, infinity)'),
(1, 'Marketing', '[2019-01-01, 2020-01-01)');
-- Periods where employee 1 was in Engineering AND had salary > 55000
SELECT s.salary, d.department,
s.valid_period * d.valid_period AS overlap_period
FROM employee_salary_v2 s
JOIN dept_assignment d
ON s.employee_id = d.employee_id
AND s.valid_period && d.valid_period
WHERE s.employee_id = 1
AND s.salary > 55000;Boşlukları ve Çakışmaları Önleme
Zamansal tablolardaki iki yaygın veri kalitesi sorunu boşluklar (kayıt bulunmayan dönemler) ve çakışmalardır (aynı anda geçerli olan iki satır). && içeren dışlama kısıtı, çakışmaları veritabanı düzeyinde önler. Boşlukları tespit etmek için bir sorguyla eksik kapsama alanlarını denetlemek gerekir.
-- Find gaps in salary history for employee 1
-- (periods where upper(prev) < lower(next))
SELECT
upper(a.valid_period) AS gap_start,
lower(b.valid_period) AS gap_end
FROM employee_salary_v2 a
JOIN employee_salary_v2 b
ON a.employee_id = b.employee_id
AND upper(a.valid_period) < lower(b.valid_period)
WHERE a.employee_id = 1
AND NOT EXISTS (
SELECT 1 FROM employee_salary_v2 c
WHERE c.employee_id = 1
AND lower(c.valid_period) > upper(a.valid_period)
AND lower(c.valid_period) < lower(b.valid_period)
)
ORDER BY gap_start;Bilginizi Sınayın
Zamansal tablolar ve belirli zamana göre sorgular konusundaki anlayışınızı sınayın.
Özet: Zamansal ve Sürümlü Satırlar
Bu derste, geçerlilik zamanı sütunlarını ve PostgreSQL'in daterange türünü kullanarak zaman içinde değişen verilerin nasıl modellenebileceğini öğrendiniz. Temel çıkarımlar:
- Geçmiş satırların üzerine asla yazmayın; eski satırı kapatıp yeni bir sürüm ekleyin.
- Verileri geçmişteki herhangi bir anda almak için belirli zamana göre sorguları (
valid_from <= target AND valid_to > target) kullanın. @>işleciyle birlikte kullanılandaterangetürü, zamansal sorguları kısa ve okunaklı hale getirir.&&(aralık çakışması) üzerindeki dışlama kısıtları, veri bütünlüğünü veritabanı düzeyinde zorunlu kılar.- Zamansal birleştirmeler, geçerlilik dönemlerinin kesişimine göre iki geçmişi hizalar.
Bu kalıplar, olay kaynaklamanın, denetim günlüğü tutmanın ve geçmişe ilişkin doğruluğun önemli olduğu her sistemin temelini oluşturur.
Sıkça Sorulan Sorular
“Zamansal ve Sürümlenmiş Satırlar” dersi ücretsiz mi?
Evet — “Zamansal ve Sürümlenmiş Satırlar” 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.
“Zamansal ve Sürümlenmiş Satırlar” dersinde ne öğreneceğim?
Geçerlilik zamanı ve belirli zamandaki sorgular. 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.
“Zamansal ve Sürümlenmiş Satırlar” 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