PostgreSQL üzerine

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
   stok<em>performans2(kod varchar(10))
   returns double precision as $$
declare
  stok</em>islem<em>rec record;
  stok</em>rec 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;</p>

<p>for stok<em>islem</em>rec in
    select * from stok<em>islem
    where stok</em>kodu = ?kod
    loop
     if stok<em>islem</em>rec.tip = 1 then
        performans := performans
            + stok<em>islem</em>rec.miktar * fiyat * 2.7;
     else
        performans := performans
             + stok<em>islem</em>rec.miktar * fiyat;
     end if;
     toplam := toplam + 1;
  end loop;</p>

<p>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 stokislem tablosunda 2006 yılına ait kayıtlar için bir index oluşturulabilir.
create index idx</em>stok<em>islem</em>2006 on stok<em>islem(tarih)
  where extract(year from tarih) = 2006;
Dolayısıyla şişmiş bir stok
islem 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 stok<em>rule as
   on delete to stok</em>islem
   do insert into stok<em>islem</em>log
      values(current<em>timestamp,'DEL',old.stok</em>kodu,current<em>user);
ş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 stok</em>yedek 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)
);</p>

<p>create table depo<em>islem (
   id serial not null primary key,
   depo</em>id integer not null
      references depo(id)
      on delete restrict
      on update cascade,
   tip smallint,
   tarih date default current<em>date
);
Depoislem tablosundaki kayıtları, kayıdın yılına göre depoislem2005, depoislem2006 adlı tablolara ayırmak istiyoruz. Bunun için depoislem tablosundan bu tabloları türetmemiz lazım.
create table depo</em>islem<em>2005() inherits(depo</em>islem);
create table depo<em>islem</em>2006() inherits(depo<em>islem);
Depo
islem2005 ve 2006 tabloları depoislem tablosuyla aynı alanlara sahip. Bu noktada depoislem 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</em>islem<em>2005</em>rule as
on insert to depo<em>islem
where extract(year from tarih) = 2005
do instead
  insert into depo</em>islem<em>2005(depo</em>id,tip,tarih)
  values(new.depo_id,new.tip,new.tarih);</p>

<p>create or replace rule depo<em>islem</em>2006<em>rule as
on insert to depo</em>islem
where extract(year from tarih) = 2006
do instead
  insert into depo<em>islem</em>2006(depo<em>id,tip,tarih)
  values(new.depo</em>id,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 depo<em>islem;
-- tüm depo</em>islem kayıtlarını döndürür.
select * from depo<em>islem</em>2006;
-- sadece 2006 yılına ait işlemleri döndürür.
Postgre SQL http://www.postgresql.org adresinde ikamet etmektedir.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>