»
Y
A
N
M
E
N
Ü
«
PostgreSQL üzerine
ibrahim dursun @ 28 Şubat 2006 17:56

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 stokislem tablosunda 2006 yılına ait kayıtlar için bir index oluşturulabilir.
create index idxstokislem2006 on stokislem(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 depoislem2005, depoislem2006 adlı tablolara ayırmak istiyoruz. Bunun için depoislem tablosundan bu tabloları türetmemiz lazım.
create table depoislem2005() inherits(depoislem);
create table depoislem2006() inherits(depoislem);
Depoislem2005 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 depoislem2005rule as
on insert to depoislem
where extract(year from tarih) = 2005
do instead
  insert into depoislem2005(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.


Bir yorum bırakın

»  Substance: WordPress   »  Style: Ahren Ahimsa