Yalnızca Ekleme Yapılan Olay Tabloları
Gerçekleşenleri kaydedin, hiçbir şeyin üzerine yazmayın.
Yalnızca Ekleme Yapılan Olay 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.
Yalnızca Eklemeli Tablo Nedir?
Yalnızca eklemeli olay tablosu, satırların yalnızca eklendiği, hiçbir zaman güncellenmediği veya silinmediği bir tablodur. Her satır, belirli bir anda gerçekleşmiş bir olayı temsil eder.
Bu kalıp, olay kaynaklamanın temelidir. Güncel durumu depolamak yerine her değişikliği değişmez bir olay olarak saklar ve böylece eksiksiz, denetlenebilir bir geçmiş elde edersiniz.
Olay Tablosu Oluşturma
İyi tasarlanmış bir olay tablosu kimin, hangi kaynağa, ne yaptığını ve ne zaman yaptığını kaydeder. occurred_at sütunu tam zaman damgasını kaydeder; DEFAULT NOW() ise bu alanın her zaman otomatik olarak doldurulmasını sağlar.
Bu tasarımda UPDATE veya DELETE bulunmadığına dikkat edin; satırlar bir kez yazıldıktan sonra kalıcıdır.
CREATE TABLE account_events (
id BIGSERIAL PRIMARY KEY,
account_id BIGINT NOT NULL,
event_type TEXT NOT NULL,
payload JSONB,
occurred_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);Olay Ekleme
Kullanıcının gerçekleştirdiği her eylem — oturum açma, para yatırma, e-posta değiştirme — yeni bir satıra dönüşür. Önceki bir olaya asla dönüp düzenleme yapmazsınız. Bir şeyin düzeltilmesi gerekiyorsa bunun yerine telafi edici bir olay eklersiniz.
Bu yaklaşım, gerçekleşenlerin tam sırasını korur.
INSERT INTO account_events (account_id, event_type, payload)
VALUES
(42, 'account_opened', '{"plan": "free"}'),
(42, 'email_verified', '{"email": "alice@example.com"}'),
(42, 'plan_upgraded', '{"from": "free", "to": "pro"}');Tüm Geçmişi Okuma
Her durum değişikliği bir satır olarak saklandığından, bir hesabın tüm geçmişini sorgulamak zaman sırasına göre düzenlenmiş basit bir SELECT sorgusudur. Bir kaydın tüm yaşamını ilk olaydan en son olaya kadar yeniden işleyebilirsiniz.
SELECT
id,
event_type,
payload,
occurred_at
FROM account_events
WHERE account_id = 42
ORDER BY occurred_at ASC;Güncel Durumu Türetme
Yalnızca eklemeli bir tabloda güncel durumu doğrudan saklamazsınız; en son ilgili olayı okuyarak bu durumu türetirsiniz. Burada 42 numaralı hesabın güncel planı, en son gerçekleşen plan_upgraded veya account_opened olayının belirttiği plandır.
ORDER BY occurred_at DESC LIMIT 1 kullanmak, en son anlık görüntüyü verimli biçimde getirir.
SELECT payload->>'to' AS current_plan
FROM account_events
WHERE account_id = 42
AND event_type IN ('account_opened', 'plan_upgraded')
ORDER BY occurred_at DESC
LIMIT 1;Kurallarla Değişmezliği Zorunlu Kılma
Yalnızca eklemeli olma garantisi, tablo üzerindeki herhangi bir UPDATE veya DELETE işlemini sessizce yok sayan bir RULE kullanılarak veritabanı düzeyinde uygulanabilir. Bu, yazma erişimi olan herhangi bir uygulamanın yanlışlıkla değişiklik yapmasını önler.
İstisna oluşturan bir tetikleyici daha da güçlü bir alternatiftir; işlemi hata vererek etkin biçimde reddeder.
CREATE RULE no_update_events AS
ON UPDATE TO account_events
DO INSTEAD NOTHING;
CREATE RULE no_delete_events AS
ON DELETE TO account_events
DO INSTEAD NOTHING;Tetikleyiciyle Değişmezlik
İstisna oluşturan bir tetikleyici, sessiz bir kuraldan daha katıdır; uygulama geçmişteki bir olayı değiştirmeye çalışırsa hemen hata alır. Böylece hatalar sessizce gizlenmek yerine görünür olur.
CREATE OR REPLACE FUNCTION deny_event_mutation()
RETURNS TRIGGER AS $$
BEGIN
RAISE EXCEPTION 'Event table is append-only: % is not allowed', TG_OP;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_deny_event_mutation
BEFORE UPDATE OR DELETE ON account_events
FOR EACH ROW EXECUTE FUNCTION deny_event_mutation();Olayları Zamana Göre Sayma
Yalnızca eklemeli tablolar, zamana dayalı analizleri kolaylaştırır. Her olayın bir zaman damgası olduğundan, ek sütunlara ihtiyaç duymadan gün, hafta veya aya göre gruplama yapabilirsiniz. Aşağıdaki örnek, her gün gerçekleşen her tür olayın sayısını hesaplar.
SELECT
DATE_TRUNC('day', occurred_at) AS day,
event_type,
COUNT(*) AS total
FROM account_events
GROUP BY 1, 2
ORDER BY 1, 2;Belirli Bir Zamandaki Durumu Yeniden Oluşturma
Bir olay günlüğünün en güçlü özelliklerinden biri, herhangi bir kaydın geçmişteki bir anda var olduğu haliyle yeniden oluşturulabilmesidir. İstenen zaman damgasına kadar olan olayları filtrelemeniz yeterlidir; zaman yolculuğu uzantısı gerekmez.
Bu özellik hata ayıklama, denetimler ve mevzuata uyum açısından son derece değerlidir.
-- What plan was account 42 on at the end of last month?
SELECT payload->>'to' AS plan_at_snapshot
FROM account_events
WHERE account_id = 42
AND event_type IN ('account_opened', 'plan_upgraded')
AND occurred_at <= DATE_TRUNC('month', NOW()) - INTERVAL '1 second'
ORDER BY occurred_at DESC
LIMIT 1;Düzeltmeler Yerine Telafi Edici Olaylar
Bir hata — örneğin yanlış bir ücretlendirme — fark edildiğinde hatalı olayı silmezsiniz. Bunun yerine, onu iptal eden veya tersine çeviren bir telafi edici olay eklersiniz. Her iki olay da günlükte görünür kalır; böylece tam olarak ne olduğunu ve düzeltmenin ne zaman yapıldığını görebilirsiniz.
Bu yaklaşım, denetim izini eksiksiz ve kurcalamaya karşı dayanıklı tutar.
-- A charge was applied by mistake; record a reversal
INSERT INTO account_events (account_id, event_type, payload)
VALUES (
42,
'charge_reversed',
'{"reason": "billing_error", "reverses_event_id": 17}'
);Büyük Olay Tablolarını Bölümlendirme
Olay tabloları hızla büyür. Zaman aralığına göre bölümlendirme, tek tek bölümleri küçük tutar, aralık sorgularını hızlandırır ve eski bölümlerin güncel verilere dokunmadan arşivlenmesine veya silinmesine olanak tanır.
PostgreSQL'in bildirimsel bölümlendirmesi bunu kolaylaştırır: occurred_at üzerinde bir RANGE bölümü tanımlayın ve ekleme işlemlerini veritabanının otomatik olarak yönlendirmesine izin verin.
CREATE TABLE account_events_2025
PARTITION OF account_events
FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');
CREATE TABLE account_events_2026
PARTITION OF account_events
FOR VALUES FROM ('2026-01-01') TO ('2027-01-01');Yalnızca Eklemeli Tablolar Bilgi Sınaması
Yalnızca eklemeli olay tablosu tasarımına ilişkin anlayışınızı sınayın.
Özet: Yalnızca Eklemeli Olay Tabloları
Bu derste yalnızca eklemeli olay tablolarının nasıl tasarlanacağını ve kullanılacağını öğrendiniz:
- Değişmezlik — satırlar bir kez eklenir ve hiçbir zaman değiştirilmez. Geçmişteki olaylar birer olgudur.
- Eksiksiz geçmiş — her durum değişikliği korunur; böylece eksiksiz denetim izleri ve belirli zamana yönelik sorgular mümkün olur.
- Telafi edici olaylar — hatalar, eski olayı silmek yerine yeni bir tersine çevirme olayı eklenerek düzeltilir.
- Uygulama — veritabanı düzeyindeki kurallar veya tetikleyiciler yanlışlıkla yapılan değişiklikleri önler.
- Ölçeklenebilirlik — aralık bölümlendirmesi, büyük olay günlüklerinin zaman içinde verimli çalışmasını sağlar.
Yalnızca eklemeli tablolar, olay kaynaklamanın, CQRS mimarilerinin ve denetlenebilirliğin ve geçmişe ilişkin doğruluğun hayati olduğu tüm sistemlerin bel kemiğidir.
Sıkça Sorulan Sorular
“Yalnızca Ekleme Yapılan Olay Tabloları” dersi ücretsiz mi?
Evet — “Yalnızca Ekleme Yapılan Olay 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.
“Yalnızca Ekleme Yapılan Olay Tabloları” dersinde ne öğreneceğim?
Gerçekleşenleri kaydedin, hiçbir şeyin üzerine yazmayın. 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.
“Yalnızca Ekleme Yapılan Olay 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
- Geçmişi Neden Saklamalı?
- Yalnızca Ekleme Yapılan Olay Tabloları
- Zamansal ve Sürümlenmiş Satırlar
- Olaylardan Durumu Yeniden Oluşturma