Ingres, 1976 yılında Berkeley Üniversitesinde geliştirilmeye başlayan unix tabanlı RDBMS’dir. 1986 yılında Michael Stonebraker tarafından Ingres veritabanının bir uzantısı olarak geliştirilmeye başlanan RDBMS’ye postgres – ingres’den sonra gelen, post-gres- adını verdi. Bu projenin geliştirilmesindeki amaç “nesne ilişkili” bir yapı kullanarak veri saklamaktı. Aslında PostgreSQL ORDBMS olarak nitelendirilebilir.
Proje, 90′lı yıllara kadar geliştirilmeye devam etti. Daha sonra Michael StoneBreaker’ın asistanları 1996 yılında Postgres’i bir adım ileri taşıyarak PostgreSQL adıyla geliştirmeye devam ettiler. O zamandan bu zamana kadar bir çok özellikle zenginleştirilen PostgreSQL, sağlam yapısı ile nam salmıştır. Windows port’u ise 7. sürümde gerçekleşti.
PostgreSQL,
- Stored Procedures,
- Triggers,
- Primary/Foreign Keys
- Sequences,
- Views
özelliklerinin yanında
- Inheritance
- Operator Classes
- Partial Indices
- Rules
gelişmiş özelliklerde sunuyor.
Bu özelliklerden bazıları:
Stored Procedures
PostgreSQL’de stored procedure’ler PL/TCL, PL/pgSQL, Java, C++, Ruby, PHP gibi dillerde yazılabilir.
create or replace function
stokperformans2(kod varchar(10))
returns double precision as $$
declare
stokislemrec record;
stokrec record;
performans integer := 0;
toplam integer := 0;
begin
select into stok_rec * from stok where kod = ?kod;
if not found then
raise exception '% kodlu stok bulunamadı!',?kod;
for stokislemrec in
select * from stokislem
where stokkodu = ?kod
loop
if stokislemrec.tip = 1 then
performans := performans
+ stokislemrec.miktar * fiyat * 2.7;
else
performans := performans
+ stokislemrec.miktar * fiyat;
end if;
toplam := toplam + 1;
end loop;
return performans / toplam;
end;
$$ language plpgsql;
Partial Indices (Kısmi İndex)
Sadece belirli koşula sahip kayıtlar için index oluşturabilirsiniz. Örneğin stok
islem tablosunda 2006 yılına ait kayıtlar için bir index oluşturulabilir.
create index idx
stok
islem2006 on stok
islem(tarih)
where extract(year from tarih) = 2006;
Dolayısıyla şişmiş bir stokislem tablosunda tüm kayıtlar için bir index oluşturmak yerine yılları baz alarak index oluşturmak performansı arttıracaktır.
Rules (Kurallar)
Tablodaki kayıtlar üzerinde yapılan işlemler için kurallar tanımlayabilirsiniz. Örneğin stok tablosundan bir kayıt silindiğinde log tablosuna bu işlemin kaydını tutan bir kural
create or replace rule stokrule as
on delete to stokislem
do insert into stokislemlog
values(currenttimestamp,'DEL',old.stokkodu,currentuser);
şeklinde yazılabilir. Tabi bu işlemler trigger kullanılarakta yapılabilir fakat bazı durumlarda trigger yerine rule tercih etmek performans kazancı sağlayabilir çünkü triggerlar genelde her kayıt için teker teker çalışırken rule’lar birden fazla kayıt için aynı anda kullanılabilir.
Geçici Tablolar
PostgreSQL select ifadeleri kullanarak geçici veya kalıcı tablolar yaratmanıza izin verir.
create temp table stokyedek as select * from stok;
Import/Export (İthal/ihraç)
PostgreSQL’de bir tablodaki tüm veriler bir dosyaya kaydedebilir ve bir dosyadan geri yükleyebilirsiniz.
copy stok to './stok.kopya';
copy stok from './stok.kopya';
Partioned Tables (Parçalanmış Tablolar)
PostgreSQL’de verilerin tamamını bir tabloda saklamak yerine verileri belli koşullara göre farklı tablolara kaydetmek mümkündür. Bunu yapmak için Inheritance ve Rule mekanizması kullanılır. Örneğin depo ve depo işlem diye tablolar oluşturalım.
create table depo (
id serial not null primary key,
kod varchar(10),
adi varchar(30)
);
create table depoislem (
id serial not null primary key,
depoid integer not null
references depo(id)
on delete restrict
on update cascade,
tip smallint,
tarih date default currentdate
);
Depoislem tablosundaki kayıtları, kayıdın yılına göre depo
islem2005, depo
islem2006 adlı tablolara ayırmak istiyoruz. Bunun için depo
islem tablosundan bu tabloları türetmemiz lazım.
create table depo
islem
2005() inherits(depoislem);
create table depo
islem2006() inherits(depo
islem);
Depoislem
2005 ve 2006 tabloları depoislem tablosuyla aynı alanlara sahip. Bu noktada depo
islem tablosuna kaydedilmek üzere yollanan kayıtları yılları baz alarak ayrıştırmamız lazım ve bunu rule ile yapabiliriz.
create or replace rule depo
islem
2005rule as
on insert to depo
islem
where extract(year from tarih) = 2005
do instead
insert into depoislem
2005(depoid,tip,tarih)
values(new.depo_id,new.tip,new.tarih);
create or replace rule depoislem2006rule as
on insert to depoislem
where extract(year from tarih) = 2006
do instead
insert into depoislem2006(depoid,tip,tarih)
values(new.depoid,new.tip,new.tarih);
Bu kadar. Çok fazla SQL yazmak gerekiyor ama sağlam bir yapı oluşturmaya çalışıyorsak bundan yakınmamalıyız.
select * from depoislem;
-- tüm depoislem kayıtlarını döndürür.
select * from depoislem2006;
-- sadece 2006 yılına ait işlemleri döndürür.
Postgre SQL
http://www.postgresql.org adresinde ikamet etmektedir.