Sequence
İçindekiler:
- Girizgah
- Veritabanı sunucularının karşılaştırılması
- SQL Server
- PostgreSQL Sequence
- Oracle Sequence
- Transaction ve Sequence
Girizgah
Sequence nesneleri PostgreSQL, Oracle ve birkaç istisnai veritabanı yönetim sisteminde (VTYS) kullanılan bir çeşit veritabanı nesnesidir. Artan veya azalan bir sayı elde etmek için kullanılır. Bu nesneleri, yazılım kodlamalarında kullanılan sayaç değişkenleri gibi düşünmek mümkündür. Bu nesne, genellikle bir tabloya eklenecek olan bir kayda bir ID ayarlamak için kullanılır. Her yeni kayıt eklenirken, daha önce ID olarak en son kullanılan sayının bir fazlasını almak için sequence artırılır ve elde edilen bu yeni ve son sayı, yeni kaydın ID'si olarak, INSERT INTO ifadesinde kullanılır.
Bir veritabanında, sınırsız sayıda sequence nesnesi oluşturulup, istenildiği kadar tabloda/alanda kullanılabilir. Bir sequence nesnesi birden fazla tablo için kullanılabileceği gibi, her tablo için ayrı bir sequence nesnesi de oluşturulup kullanılabilir. Eğer ayrım gözetmeksizin tüm ID alanlarını mesela 10 haneli yapma gibi bir geleneğiniz varsa ve tablodaki ID değerlerinin ardışık olup olmaması sizin için hiç önemli değilse, ortak bir sequence oluşturup, birkaç tabloda birden aynı sequence nesnesini kullanabilirsiniz. Tabii ki bu durumda, sequence nesnesinin çok büyük bir değer üretip de, ID alanının alabileceği hane sayısını aşma ihtimalini her zaman göz önünde bulundurmalısınız. Yok eğer, tablodaki ID alanına kaydettiğiniz sayıların ardışık olması sizin için çok önemliyse (örneğin bankalardaki sıra numaraları veya evrakların üzerine not edilen başvuru numaraları gibi), tablo için ayrı ve müstakil bir sequence oluşturup kullanmanız gerekecektir. Özetle: Onlarca tablonun olduğu bir veritabanında, bir de onlarca sequence ile uğraşmak istemiyorsanız, mümkün olduğu kadar, ortak sequence nesneleri kullanın.
Veritabanı sunucularının sequencee noktasında karşılaştırılması
Diğer birçok VTYS'de sequence gibi bir nesne yoktur. Zira onlarda, tabloya yeni bir kayıt eklenirken, ID alanının otomatik olarak bir değer alması için hazır ve bazen sıkıntılı (bkz: SQL IDENTITY) yollar mevcuttur. PostgreSQL'de de kendine has bir hazır yol mevcuttur, aşağıda aktarılacaktır. Microsoft SQL Server'da tablo henüz oluşturulurken hangi alanın otomatik olarak bir sayı alacağı ayarlanabilmektedir. PostgreSQL ise her zamanki "geliştirici dostu" tavrını sürdürmekte ve hem sequence özelliğini hem de otomatik artan alan tanımlayabilme özelliğini bir arada sunmaktadır. VTYS'lerin ID değerleri üretme ile ilgili sunduğu olanaklar, aşağıda aktarılmaktadır.
SQL Server
CREATE TABLE OGRENCILER (
ID INT NOT NULL IDENTITY(1,1),
TAM_ADI VARCHAR(70) NOT NULL
);Bu ifadedeki
IDENTITY(1,1) ayarı sayesinde, tabloya yeni bir kayıt eklendiğinde, ID alanının otomatik olarak sıradaki sayı değerini alması sağlanmış olmaktadır. Örnekteki tablo, bir üniversitedeki öğrencilerin bilgilerinin kaydedildiği tablodur. Bilindiği gibi bir de dersler var maalesef! Öğrencinin kaydı eklenirken, hangi dersleri alacağı da kaydedilmek istenecektir haliyle. Öğrencinin alacağı dersler kaydedilirken, bu yeni öğrencinin ID bilgisine de ihtiyaç duyulacaktır. SQL Server'da bu ID'yi öğrenmek için genelde SELECT @@IDENTITY ifadesi kullanılır. Bu bir SELECT sorgusudur ve son üretilen ID bilgisini geriye döndürür. Geriye döndürülen bu ID bilgisi, sonraki INSERT ifadelerinde kullanılır ve böylece ilişkisel model için gerekli olan ID eşleşmeleri sağlanmış olur.Sequence kullanılan Oracle ve PostgreSQL gibi VTYS'lerde ise, ID'nin kaç olacağı, daha öğrencinin kaydı oluşturulmadan önce sayaç yardımıyla tespit edilebilmektedir. Bu, birçok avantajı da beraberinde getirmektedir. PostgreSQL ve Oracle'da sequence nesnelerinin nasıl kullanıldığı, aşağıda örneklerle aktarılmaktadır.
PostgreSQL Sequence:
INSERT INTO ogrenciler (
id,
tam_adi
) VALUES (
/*Yeni ID'yi üret ve ID alanına bu değeri kaydet:*/
nextVal('ogrenci_id_seq'),
'Kemal Etikan'
);
INSERT INTO ogrencilerin_dersleri (
id,
ogrenci_id,
ders_id
) VALUES (
/*bu tablonun ID'sini üret ve kaydet:*/
nextVal('ogrencilerin_dersleri_id_seq'),
/*öğrenci ID'si sequence'inin şu anki değerini bu tabloya kaydet:*/
currval('ogrenci_id_seq'),
187
);Önemli: Yukarıdaki örnekteki birinci INSERT ifadesinden sonra ikinci INSERT ifadesi çalıştırılacakken, başka bir kullanıcının transaction'ında (muamelesinde) bir nextVal('ogrenci_id_seq') komutu çalışırsa, sequence bir artmış ve değişmiş olacağından, ikinci INSERT ifadesindeki currval('ogrenci_id_seq') fonksiyonu, ilk INSERT ifadesindeki ID'den farklı bir değer alacaktır. Yani, ID'leri kullanarak kayıtları ilişkilendirme modeli çökmüş olacaktır. Bu olası sorun bertaraf etmek için, ilk INSERT ifadesinden önce nextVal('ogrenci_id_seq') komutu çalıştırılmak suretiyle ID tespit edilip yazılım değişkenine veya PLPGSQL değişkenine aktarılmalı ve her iki INSERT ifadesinde de bu ID değeri kullanılmalıdır. Aşağıdaki Oracle-ColdFusion örneğinde olduğu gibi.
Yukarıda da vurgulandığı gibi, PostgreSQL'de, bir alanın SQL Server'daki gibi otomatik olarak kendiliğinden bir değer almasını sağlamak mümkündür. Bunu yapmak için, alanın veri türünü BIGSERIAL veya SERAL olarak ayarlamak yeterli olacaktır. Bu nokta ile ilgili daha fazla bilgi için Serial Types resmi belgesine başvurunuz. Bu arada, Oracle'da böyle bir özellik/kolaylık/kıyak yoktur.
Ayrıca PostgreSQL'de, örneğin iki farklı tablodaki ID alanlarının aynı sequence nesnesini kullanarak değerlerini otomatik olarak almasını sağlamak mümkündür:
CREATE TABLE ogrenciler (
id INTEGER DEFAULT nextVal('kisi_id_seq'),
tam_adi varchar(60)
);CREATE TABLE ogretmenler (
id INTEGER DEFAULT nextVal('kisi_id_seq'),
bransi varchar(60)
);
PostgreSQL'de sequence nesneleri hakkında daha fazla bilgi için CREATE SEQUENCE ve Sequence Manipulation Functions resmi belgelerine başvurunuz. Ayrıca, PostgreSQL Technical Documentation resmi sitesindeki PostgreSQL CBT - Sequences belgesini de kesinlikle incelemelisiniz. Güncel bir PostgreSQL sürümündeki özellikleri aktaran belgeyi incelediğinizden emin olunuz.
Oracle Sequence:
Oracle ve ColdFusion kullanılarak geliştirilmiş olan örnek bir kod:
<cfquery name="qrySayac">
/*ID'yi üret ve tespit et*/
select OGRENCI_ID_SEQ.NEXTVAL as ID from dual
</cfquery><cfquery>
insert into OGRENCILER (
ID,
AD,
) values (
/*yukarıdaki sorguda tespit edilen ID'yi bu tabloya kaydet:*/
#qrySayac.ID#,
'Kemal Etikan'
)
</cfquery>
Transaction ve Sequence
Transaction Rollback geri alma işlemleri sequence nesnelerini etkilemez. Bu kural şu manaya gelir: bir sequence nesnesinin değeri bir artırıldıysa, bir Transaction içinde bile olsanız, Rollback yapıldığında, sequence nesnesinin değeri olduğu yerde yani son değerinde kalır. Bu durum, Sequence'lerdeki temel displinlerden ve gerekliliklerden biridir.
0 yorum:
Yorum Gönder