Selamlar. Bu yazıda PostgreSQL Array Veri Türü hakkında bilgiler vereceğim. Belirttiğim gibi veri türleri hakkında yazılar yazmaya devam ediyorum. Son yazı timestamp ve interval hakkındaydı.
PostgreSQL Array Veri Türü Ne İşe Yarar?
PostgreSQL Array Veri Türü, verileri diziler halinde tutmaya yarayan sütunları oluşturmak için kullanılırlar. Bu çok genelleyici tabir yetersiz olduğu için örneklerle göreceğiz. Biraz bahsetmek gerekiyorsa array sütunlar PostgreSQL tarafında önemli bir yere sahipler. Hepsini deneyemediğim için bir şey diyemiyorum ancak denediğim bütün türlerin kendisine ait array destekleri de var.
Hatta user-defined veri türleri için bu veri türünün yaptığı eyleme karşılık türleri postgresql kendisi oluşturuyor. Array veri türünün programlama dillerinde gördüğünüz yapıdan hiçbir farkı bulunmamakta. Bundan dolayı da ekstra öğrenme gibi bir durum söz konusu değil. Bu türün diğeri veri tabanı yönetim sistemlerinde olup olmadığına dair bir bilgim yok ve araştırmadım. O yüzden şimdilik sadece PostgreSQL için var diyorum.
Nasıl Kullanılır?
Öncelikle hayal ederek başlayalım. Diyelim ki bir tablomuz var adı da müşteriler. Müşterilerimizin birden fazla telefonunun olduğunu ya da olabileceğini biliyoruz. Bazı senaryolarda şöyle bir kaydetme gerçekleştirilebilir:
12345,123435,12516,221661
Bu yöntem işe yarar olabilir sorgunun kesinlik kazanması adına birden fazla değişken devreye sokulur. Bir diğer senaryo ise musteriler tablosu ve musteritelefonlar tablosunun join ile birbirine bağlanmış olması. Şu anda en çok kullanılan yöntemlerden birisi de bu zaten. Array türünde ise kolon kendisi array verisi sakladığı için join ya da seperator mantığıyla bir saklama olmayacak. Hadi tablo oluşturalım:
create table musteriler( id serial primary key, musteriadi varchar(60), telefonlar varchar[] );
Sorgu başarıyla çalıştığında sevindiğimi belirtmeliyim. Çünkü PostgreSQL öğrenme aşamasında bu yazıyı yazıyorum ve bu yazıdan önce denediğim konuları yazıya aktarıyorum. Şimdi bu tabloya nasıl veri ekleriz? Öncelikle beklendiği şekliyle bir ekleme yapalım:
insert into musteriler(musteriadi, telefonlar) values('dennis ritchie', array [ '921905201', '215261261' ]);
Beklenen yöntem köşeli parantezler arasında olması şeklindeydi. Bir problemimiz var her şey iyi hoş düşünülmüşken o array keywordü olmadan bu yapının ne olduğunun anlaşılamaması garip. Oldu ki unuttunuz bunu başka nasıl yaparsınız? Süslü parantezleri kullanabilirsiniz:
insert into musteriler(musteriadi, telefonlar) values('linus torvalds', '{123456,23511}');
Açıkcası ilk yöntem bana daha zarif geldi. Eklerken şartlarımızı öğrendik ya array keywordü ve köşeli parantez ya da süslü parantezler gerekiyor bize. Bu tabloyu nasıl çekeriz? Örneğin burada where sorgusunu da devreye aldık diyelim:
select musteriadi, telefonlar from musteriler where musteriadi = 'dennis ritchie';
İyi de hala biz array mantığını tam olarak göremedik. Bu sorgu sadece eklediğimiz ikinci yöntemi içeren kolonu gösteriyor. Örneğin array kolondaki 2. veriye nasıl erişirim? Burada belki de array bilgimizi değiştiren tek şey var. Dizi sıfırdan değil birinci indexten başlıyor. Örnek:
select musteriadi, telefonlar[2] from musteriler where musteriadi = 'dennis ritchie';
Bu arada istersek kolondaki 2. değerler arasında where sorgusu da yapabiliyoruz. Çok garip geliyor ama oluyor:
select musteriadi, telefonlar[2] from musteriler where telefonlar[2] = '215261261';
PostgreSQL Array Veri Türü ile Arama Yapma
Bu da önemli bir konu aslında. Bu konuda array içerisinde arama işlemi yapmanız gerekiyorsa any isimli fonksiyon kullanılır. Ayrıca bir üst örnekte index bilindiği için where sorgusuna direkt girişebildik. Fakat burada böyle bir şansımız yok ise arama yapmak en mantıklı işlem oluyor:
select musteriadi, telefonlar from musteriler where '215261261' = ANY(telefonlar);
Arrayleri Açmak
Nasıl çevirilebileceğini bilemediğim için böyle isimlendirdim. Normalde tek satırda yer alan bilgi kümesini her bir array elemanı için satıra dönüştürecek şekilde düzenliyor. Eğer array kolonda 10 adet veri var ise her bir değeri satıra çevirecektir. Tabi birden fazla kolonla çalışıyorsanız bazı kolonlar duplicate gibi görünecektir. Arrayleri bulunduğu yapıdan çıkarıp satıra dökme işlemini unnest fonksiyonu ile sağlıyoruz:
select musteriadi, unnest(telefonlar) from musteriler where '215261261' = ANY(telefonlar);
Burada iki satırda da müşterinin adı görünecek. Aynı zamanda iki farklı telefonu da görünmüş olacak. Arrayler konusunda ayrıca tanımlama yaparken boyut belirtme, çok boyutlu array konularına da giriş yapabilirsiniz. Bu yazıda sadece basit olarak nasıl kullanılacağını anlattım.
Temel anlamda arrayleri anlatan bu yazının daha geniş anlatımına ulaşmak için resmi dokümanlara bakabilirsiniz. Herhangi bir sorunuz var ise yorum bırakabilir ya da iletişim sayfasından mail atabilirsiniz.
Okuduğunuz için teşekkürler.