- Katılım
- 17 Eki 2024
- Mesajlar
- 2
- Tepkime puanı
- 7
- Puanları
- 1
Geçmişi Saklayan Veritabanları: Bitemporal Tasarımın Gizli Gücü
Bugün, verinin sadece güncel halini saklayan alışılmış yapıların ötesine geçiyoruz. Bitemporal tasarım, verinin iki zaman ekseninde izlenmesini sağlar: Geçerli Zaman (valid time) ve İşlem Zamanı (transaction time). Bu sayede bir kaydın hangi tarihlerde gerçek dünyada mevcut olduğunu ve bu kaydın veritabanına hangi tarihlerde yazıldığını aynı anda sorgulayabiliriz. Özellikle finans, perakende ve sağlık gibi alanlarda yasal gereklilikler ve denetim ihtiyacı için bu yaklaşım adeta bir sigorta görevi görür.
- Temel kavramlar
- Geçerli Zaman (valid time): Bir kaydın kullanıcı tarafından hangi zamanlarda geçerli olduğunu gösterir.
- İşlem Zamanı (transaction time): Kayıtın veritabanına ne zaman yazıldığını ve ne zaman değiştiğini gösterir.
- Sürümleme: Değişiklikler, geçmişteki sürüm olarak saklanır; her sürüm kendi geçerli zaman aralığına sahiptir.
Neden bitemporal tasarım?
- Denetim ve veri güvenliği: Yasal incelemelerde hangi değerlerin hangi tarihlerde geçerli olduğunu ispatlamak kolaylaşır.
- Doğruluk ve geriye dönük analiz: Fiyatlandırma, kontrat değişiklikleri veya müşteri durumları gibi alanlarda geçmiş durumları kolayca sorgulayabilirsiniz.
- Olay odaklı analizler: Değişiklikleri olay akışı olarak saklayıp, geçmişteki kararların hangi verilerle alındığını izlemek mümkün olur.
- Tasarım adımları
- İki zaman eksenini tabloya dahil edin: geçerli zaman için valid_from/valid_to ve işlem zamanı için system_start/system_end (veya as_of gibi bir zamanı temsil eden alan).
- Indexleme stratejisi: Geçerli zaman aralıklarını temsil eden bir range tipi ile GiST/GIN gibi indeksler kullanın. Bu, geçmişe yönelik sorguları hızlı kılar.
- Depolama ve sürüm yönetimi: Her değişiklik bir sürüm olarak saklanır; gereksiz sürümleri temizlemek için retention politikaları oluşturun.
- Sorgu kalıpları: As-of (o anki durum), between valid_from/valid_to ve en son sys_start gibi sorgularla geçmişi hedefleyin.
Kod:
-- Basit bir bitemporal tablo taslağı (PostgreSQL uyumlu yaklaşım)
CREATE TABLE product_price (
product_id BIGINT NOT NULL,
price DECIMAL(10,2) NOT NULL,
valid_from TIMESTAMPTZ NOT NULL,
valid_to TIMESTAMPTZ NOT NULL,
sys_start TIMESTAMPTZ NOT NULL, -- bu sürümün veritabanına yazıldığı an
sys_end TIMESTAMPTZ NOT NULL, -- bu sürümün sona erdiği an (sonsuz için 'infinity' kullanılır)
PRIMARY KEY (product_id, valid_from, sys_start)
);
-- Geçerli olan fiyatı bul:
SELECT price
FROM product_price
WHERE product_id = 123
AND '2023-06-01 12:00:00+00' >= valid_from
AND '2023-06-01 12:00:00+00' < valid_to
AND sys_start <= '2023-06-01 12:00:00+00'
ORDER BY sys_start DESC
LIMIT 1;
-- Belirli bir ürünün geçmiş sürümlerini listele:
SELECT *
FROM product_price
WHERE product_id = 123
ORDER BY valid_from;
</CODE>
[LIST]
[*][B]Kullanışlı ipuçları[/B]
[*]İki zaman eksenini bir araya getirirken range/interval tiplerini düşünün; PostgreSQL için tsrange/tstzrange kullanımı sorgu performansını artırır.
[*]Açık uç durumlarda (valid_to = infinity) aralıklarının doğru yönetişimini sağlayın; end-of-life durumları için retention politikaları tanımlayın.
[*]Event sourcing ile birleşim: Her değişiklik bir olay olarak kaydedilir ve olay akışı üzerinden geçmiş analizi güçlendirilir.
[*]Güvenlik ve gizlilik: geçmiş verilerin erişimini regulatory ihtiyaçlara uygun olarak kısıtlayın (row-level security, veri maskeleme).
[/LIST]
[B]Kısa bir not[/B]: Bitemporal tasarım, standart CRUD yaklaşımlarının ötesinde düşünmeyi gerektirir. Verinin iki farklı zaman ekseninde saklanması, yanlış değişikliklerin kolayca geri alınmasını ve geçmişe dönük güvenilir analizleri mümkün kılar. Ancak depolama maliyeti ve sorgu karmaşıklığı da artırır; bu yüzden başlamadan önce hangi sorulara cevap aradığınızı netleştirmek kritik.
[QUOTE]Deneyimleriniz neler? Bitemporal tasarımı mevcut projelerinizde nasıl uyguluyorsunuz? Elde ettiğiniz kazanımlar veya karşılaştığınız zorlukları paylaşın; tartışmayı derinleştirelim.[/QUOTE]
[IMG]https://images.unsplash.com/photo-1517478327452-d0c4379fadc2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w3NjY2MDl8MHwxfHJhbmRvbXx8fHx8fHx8fDE3Njg0MTE4Nzl8&ixlib=rb-4.1.0&q=80&w=1080[/IMG]







