Bir haber sitesinin trafiği anlık olarak katlandığında, kullanıcı yorumları biriktiğinde ve arşiv milyonlarca kayda ulaştığında, verinin güvenle ve tutarlı biçimde saklanması kritik hale gelir. İşte tam bu noktada uzun yıllardır olgunlaşmış, açık kaynaklı ve nesne-ilişkisel bir veritabanı olan PostgreSQL devreye girer.
İlgili içerikler: Veritabanı türleri rehberi · MySQL Nedir? · MariaDB Nedir?
PostgreSQL Nedir?
PostgreSQL (kısaca Postgres), açık kaynaklı bir nesne-ilişkisel veritabanı yönetim sistemidir (ORDBMS). Yani hem klasik ilişkisel veritabanlarının tablo, satır ve sütun modelini hem de kullanıcı tanımlı tipler, kalıtım ve karmaşık veri yapıları gibi nesne yönelimli yetenekleri bir arada sunar.
İlişkisel yaklaşımın temelinde SQL (Structured Query Language) dili yatar. PostgreSQL, SQL standardının geniş bir bölümünü uygular ve standarda yakın kalmayı önceliklerinden biri olarak benimser. Bu, öğrenilen bilginin taşınabilir olmasını ve sorguların öngörülebilir davranmasını sağlar.
Kısa Tarihçe
PostgreSQL'in kökeni, 1980'lerin ortasında California Üniversitesi Berkeley'de (UC Berkeley) yürütülen POSTGRES araştırma projesine dayanır. Proje, Michael Stonebraker liderliğinde, o dönemin ilişkisel sistemlerinin sınırlarını aşmayı, özellikle karmaşık veri tiplerini ve genişletilebilirliği hedefliyordu.
Zamanla projeye SQL desteği eklendi ve sistem "Postgres95" adıyla anıldı. Ardından yaygın olarak bilinen PostgreSQL adını aldı; bu ad hem ilişkisel köklerini hem de SQL desteğini vurgular. Bugün proje, ticari bir sahibi olmayan, dünya çapında gönüllü ve kurumsal katkıcılardan oluşan bir topluluk (PostgreSQL Global Development Group) tarafından geliştirilir.
Temel Özellikler
- Açık kaynak ve izin verici (permissive) bir lisansla ücretsiz kullanım
- ACID uyumlu, güvenilir işlem (transaction) yönetimi
- MVCC ile yüksek eş zamanlılık ve okuma/yazma çakışmalarının azaltılması
- Zengin veri tipi desteği: JSON/JSONB, diziler, aralıklar, UUID, geometrik tipler ve daha fazlası
- Genişletilebilir mimari: uzantılar, kullanıcı tanımlı tipler ve fonksiyonlar
- Çoklu prosedürel dil desteği (PL/pgSQL, PL/Python, PL/Perl gibi)
- Tam metin arama, çeşitli indeks türleri (B-tree, GIN, GiST, BRIN)
- Fiziksel ve mantıksal replikasyon seçenekleri
- Windows, Linux, macOS ve BSD gibi çok sayıda platformda çalışabilme
ACID ve MVCC: Veri Bütünlüğünün Temeli
PostgreSQL, işlemlerinde ACID ilkelerine uyar: Atomiklik (Atomicity), Tutarlılık (Consistency), İzolasyon (Isolation) ve Kalıcılık (Durability). Bu, bir işlemin ya bütünüyle uygulanmasını ya da hiç uygulanmamasını, tamamlanan verinin ise kalıcı olmasını garanti eder.
Eş zamanlılığı yönetmek için PostgreSQL MVCC (Multiversion Concurrency Control) yaklaşımını kullanır. Her işlem, verinin tutarlı bir anlık görüntüsünü görür; okuyucular yazıcıları, yazıcılar da okuyucuları çoğu durumda kilitlemez. Bu sayede yoğun okuma ve yazmanın bir arada olduğu senaryolarda daha akıcı bir davranış elde edilir.
Veri Tipleri ve Genişletilebilirlik
PostgreSQL'i öne çıkaran unsurlardan biri veri tipi zenginliği ve genişletilebilir olmasıdır. Standart sayısal, metinsel ve tarih/zaman tiplerinin yanı sıra JSON belgeleri, diziler, aralık (range) tipleri ve coğrafi veriler gibi özel yapıları da destekler.
| Tip / Yetenek | Kısa Açıklama |
|---|---|
| JSON / JSONB | Yapılandırılmamış belgeleri saklama; JSONB ikili ve indekslenebilir biçimdir |
| Array (dizi) | Tek bir sütunda birden çok değeri saklama |
| Range (aralık) | Sayı veya tarih aralıklarını tek bir değer gibi ele alma |
| UUID | Global olarak benzersiz tanımlayıcılar |
| hstore | Anahtar-değer çiftlerini tek bir alanda tutma |
| Kullanıcı tanımlı tipler | Kendi bileşik veya enum tiplerinizi oluşturma |
Bu esneklik sayesinde, katı ilişkisel modelle esnek belge saklama ihtiyacını aynı veritabanında birleştirebilirsiniz; ayrı bir belge veritabanına geçmeden yarı yapılandırılmış veriyi yönetebilirsiniz.
SQL ve Sorgu Örnekleri
Aşağıda bir haber sitesi senaryosunu düşünerek basit bir tablo oluşturma ve sorgulama örneği yer alıyor. Örnek, PostgreSQL'in JSONB desteğini de gösteriyor.
-- Basit bir makale tablosu
CREATE TABLE makaleler (
id BIGSERIAL PRIMARY KEY,
baslik TEXT NOT NULL,
yayin_tarihi TIMESTAMPTZ DEFAULT now(),
etiketler TEXT[], -- dizi tipi
meta JSONB -- esnek belge
);
-- Kayit ekleme
INSERT INTO makaleler (baslik, etiketler, meta)
VALUES (
'PostgreSQL Nedir?',
ARRAY['veritabani', 'sql'],
'{"okuma_suresi": 9, "kategori": "yazilim"}'
);-- JSONB alani icinde arama ve tarihe gore siralama
SELECT baslik,
meta->>'kategori' AS kategori
FROM makaleler
WHERE meta->>'kategori' = 'yazilim'
ORDER BY yayin_tarihi DESC
LIMIT 10;Örnekte görüldüğü gibi, klasik SQL sözdizimiyle JSON alanlarına erişmek için özel operatörler (->>, ->) kullanılır. Böylece ilişkisel ve belge tabanlı yaklaşımlar aynı sorguda buluşur.
Uzantılar: PostGIS ve Ötesi
PostgreSQL'in ekosistemini güçlü kılan en önemli özelliklerden biri uzantı (extension) mekanizmasıdır. Uzantılar, veritabanına yeni tipler, fonksiyonlar ve yetenekler ekler. En bilinen örneklerden biri, coğrafi ve konumsal veri işleme için kullanılan PostGIS'tir.
- PostGIS — coğrafi/konumsal (GIS) veri desteği
- pg_stat_statements — sorgu performansını izleme
- pg_trgm — bulanık metin arama ve benzerlik
- Tam metin arama — dahili sözlük ve dizinlerle metin sorgulama
Replikasyon ve Ölçeklenebilirlik
Üretim ortamlarında yüksek erişilebilirlik ve okuma yükünü dağıtmak için PostgreSQL çeşitli replikasyon seçenekleri sunar. Fiziksel (streaming) replikasyon, ana sunucudaki değişiklikleri bire bir yedek sunuculara aktarır. Mantıksal replikasyon ise tablo düzeyinde, seçili verilerin kopyalanmasına olanak tanır.
- Streaming replikasyon ile bekleme (standby) sunucular oluşturma
- Okuma sorgularını yedek sunuculara dağıtarak yükü azaltma
- Mantıksal replikasyon ile seçici veri kopyalama ve sürüm geçişleri
- Yedekleme ve noktaya kadar geri yükleme (PITR) desteği
PostgreSQL Diğer Veritabanlarına Göre Nerede Durur?
Her veritabanı belirli ihtiyaçlar için farklı dengeler sunar. Aşağıdaki karşılaştırma, PostgreSQL'i tanıdık alternatiflerle kabaca konumlandırmak içindir; kesin seçim daima projenizin gereksinimlerine bağlıdır.
| Sistem | Model | Öne Çıkan Yön |
|---|---|---|
| PostgreSQL | Nesne-ilişkisel, açık kaynak | Standartlara yakınlık, genişletilebilirlik, zengin veri tipleri |
| MySQL / MariaDB | İlişkisel, açık kaynak | Yaygın web yığınlarında popülerlik, geniş barındırma desteği |
| SQLite | Gömülü, dosya tabanlı | Sunucusuz, tek dosya; küçük ve yerel uygulamalar |
| Oracle / SQL Server | İlişkisel, ticari | Kurumsal araç setleri ve ticari destek |
Karşılaştırmalı ayrıntılar için MySQL Nedir?, SQLite Nedir? ve Oracle Database Nedir? yazılarına göz atabilirsiniz.
Tipik Kullanım Senaryoları
- Yüksek trafikli web ve içerik siteleri (haber portalları, bloglar)
- Karmaşık iş kuralları ve raporlama gerektiren kurumsal uygulamalar
- Coğrafi/konumsal uygulamalar (PostGIS ile harita ve konum servisleri)
- JSON belgeleriyle esnek şema gerektiren modern uygulamalar
- Analitik ve veri ambarı senaryolarının bir bölümü
Lisans ve Topluluk
PostgreSQL, kendi adını taşıyan izin verici (permissive) açık kaynak lisansı altında dağıtılır. Bu lisans, BSD ve MIT gibi lisanslara benzer biçimde esnektir; yazılımı ücretsiz kullanmaya, değiştirmeye ve dağıtmaya olanak tanır. Ticari bir sahibi olmaması, projenin bağımsız ve topluluk odaklı kalmasını sağlar.
Geniş bir kullanıcı ve geliştirici topluluğu; kapsamlı belgeler, posta listeleri ve düzenli sürümlerle projeyi canlı tutar. Bu olgunluk, PostgreSQL'i uzun ömürlü projeler için güvenilir bir temel yapar.
PostgreSQL Nasıl Çalışır? (Mimari Bakış)
PostgreSQL, istemci-sunucu mimarisiyle çalışır. Merkezde, veritabanı süreçlerini yöneten bir ana süreç (postmaster) bulunur; her istemci bağlantısı için ayrı bir sunucu süreci ayrılır. Bu süreç tabanlı model, kararlılık açısından güçlüdür: bir bağlantıda oluşan sorun, çoğu durumda diğer bağlantıları etkilemez.
Veri kalıcılığının anahtarı WAL (Write-Ahead Logging) mekanizmasıdır. PostgreSQL, bir değişikliği asıl veri dosyalarına yazmadan önce onu bir işlem günlüğüne (WAL) kaydeder. Böylece beklenmedik bir kapanmadan sonra sistem, bu günlüğü kullanarak tutarlı bir duruma dönebilir. Aynı WAL akışı, streaming replikasyonun da temelini oluşturur.
Sık kullanılan verinin bellekte tutulması için paylaşılan bir tampon alanı (shared buffers) kullanılır. Sorgular önce planlanır: sorgu planlayıcı, mevcut indeksleri ve istatistikleri değerlendirerek en uygun yürütme yolunu seçmeye çalışır. EXPLAIN komutuyla bu planı inceleyebilirsiniz.
İndeksleme ve Performans
Doğru indeksleme, PostgreSQL performansının belki de en belirleyici unsurudur. PostgreSQL, farklı sorgu türlerine uygun birden çok indeks tipi sunar; bunları veri şeklinize ve sorgu desenlerinize göre seçmek önemlidir.
| İndeks Tipi | Uygun Olduğu Durum |
|---|---|
| B-tree | Eşitlik ve aralık sorguları; en yaygın varsayılan tip |
| GIN | JSONB, dizi ve tam metin gibi çok değerli veriler |
| GiST | Coğrafi veri ve yakınlık/örtüşme sorguları |
| BRIN | Doğal olarak sıralı, çok büyük tablolar (örn. zaman serisi) |
Güvenlik ve Erişim Kontrolü
PostgreSQL, kurumsal ihtiyaçlara uygun bir yetkilendirme modeli sunar. Kullanıcılar ve gruplar "rol" (role) kavramıyla yönetilir; her rol için ayrıntılı yetkiler tanımlanabilir. İstemci kimlik doğrulaması, esnek bir yapılandırma dosyası (pg_hba.conf) üzerinden yönetilir.
- Rol tabanlı yetkilendirme (GRANT / REVOKE)
- Bağlantı düzeyinde kimlik doğrulama yöntemleri (parola, sertifika ve diğerleri)
- SSL/TLS ile şifreli bağlantı desteği
- Satır düzeyinde güvenlik (Row-Level Security) ile kayıt bazlı erişim denetimi
Kurulum ve Barındırma Seçenekleri
PostgreSQL, kendi sunucunuza kurulabildiği gibi bulut sağlayıcıların yönetilen hizmetleri üzerinden de kullanılabilir. Küçük projeler için tek bir sunucu yeterliyken, büyüyen sistemlerde replikasyon ve yedek sunucularla yüksek erişilebilirlik hedeflenir.
- Kendi sunucunuza (VPS/fiziksel) doğrudan kurulum
- Docker/konteyner tabanlı dağıtım
- Bulut tabanlı yönetilen veritabanı hizmetleri
Bulut tarafındaki seçenekleri karşılaştırmak için Bulut Veritabanı Servisleri yazısına göz atabilirsiniz.
Sık Sorulan Sorular
PostgreSQL ücretsiz mi?
Evet. PostgreSQL açık kaynaktır ve izin verici lisansı sayesinde ücretsiz kullanılabilir. Bazı şirketler, PostgreSQL üzerine ticari destek, yönetilen hizmet veya ek araçlar sunabilir; çekirdek yazılım ise ücretsizdir.
PostgreSQL bir NoSQL veritabanı mı?
Hayır. PostgreSQL ilişkisel bir çekirdeğe sahiptir. Ancak JSONB, diziler ve hstore gibi yapılarla NoSQL sistemlerine benzer esneklik sunabilir; bu ikisini bir arada kullanmanıza imkân tanır.
MySQL ile PostgreSQL arasında nasıl seçim yaparım?
Karar; ekibinizin deneyimi, mevcut barındırma altyapısı, ihtiyaç duyulan veri tipleri ve genişletilebilirlik beklentilerine bağlıdır. Standartlara yakınlık ve zengin tip desteği önceliğinizse PostgreSQL güçlü bir seçenektir. Ayrıntılı karşılaştırma için MySQL Nedir? yazısına bakın.