Monday, December 10, 2007

 

Bölüm 4 - "Poor Man's Database System"

Başlık için uygun bir türkçe tanım bulamadığım için Poor Man's Database System'i kullanmak zorunda kaldım. Bu defa 80 li yılların başında Otosan da geliştirdiğimiz "hierarchical" veri tabanı yazılımını anlatacağım. O günün bilgi teknolojileri koşullarını tekrar özetlersem, buzdolabı büyüklüğünde CPU, ekran bağlantısı henüz kavram olarak bile yok, max RAM 128 KB, max disk 300 MB, yazılım olarak sistemde sadece OS, Cobol compiler, ve de sequential ile random access file system mevcut. Tüm uygulamalar batch update mantığı ile hazırlanıyor, (seq dosyaların toplu halde güncellenmesi). Sistem bir de random access dosya erişimine izin veriyor ancak primary key nin ne olduğuna program içerisinde siz karar vermek zorundasınız.
Zaman geçip bizim malzeme planlama sistemi kapsam olarak genişledikçe, ve de dosya büyüklükleri arttıkça kullanıcılardan raporları seçme parametreleri ile hazırlama talepleri gelmeye başladı, örneğin sadece x malzemesinin stokları, veya y satıcısına verilmiş siparişler. Seq dosya organizasyonunda bu istekleri karşılamak için tüm dosyanın baştan okunmaya başlanılması zorunlu, arada seçilmiş kayıtlara tek okumada ulaşmak imkansız. Bu da zaman kaybı demek.
Ben de okuyarak çözüm arıyorum. James Martin in Database Organizations kitabında Random Access file organization techniques'i okuduktan sonra bu işi yapabileceğimize karar verdim.
Yöntem özetle şu şekilde çalışıyor:
1) Kendinize random erişeceğiniz dosya için bir büyüklük seçiyorsunuz, örneğin başlangıç için 20000 kayıt. Buna bağlı olarak da böldüğünde çoğunlukla tek sayı üretecek bir bölen, mesela 20009.
2) Yaratacağınız tabloda primary key olarak belirlenen alanı tesbit edip bir şekilde bundan sayısal bir değer üretecek bir algoritma hazırlayacaksınız. Biz, malzeme ana kütüğü için malzeme numarasını primary key olarak seçmiştik. Bu, alfanümerik bir alan olduğundan, basit bir yöntem ile alfanümerik bu alanı Cobol da nümerik olarak Redefine edince sonuç bir sayısal değer oluyordu.
3) Hashing algorithm in hazırlanması. Burada da sayısal değere dönüştürülmüş stok numarasını daha önce kararlaştırılan bölen (20009) a bölünce kalan, o stok numarasının random key değerini verir. Örneğin, 78VB9006AA stok numarasını nümerik değere dönüştürürsek 39125446 (gerçekte farklı bir sayı olur) ve de bunu 20009 a bölersek kalan 7851 sayısı bu kaydın asıl random primary key değeri elde edilir. Dolayısiyle dosyadaki 7851. nci kayıt 78VB006AA stok numarasına ait olacaktır. Bu algoritma da 2 hususa dikkat etmek gerekir:
bölme sonucu kalan sıfır çıkabilir veya
bölme sonucunda çıkan key değeri ile ilgili kayıt okunduğunda orada daha evvel kaydedilmiş başka bir stok numarasının olduğu görülür (synonym durumu) .
Şimdi bu 2 sorun ile nasıl başa çıkılır:
Random Access olarak erişilecek dosyada hashing sayısından sonrası overflow alanı olarak tesbit edilir. (örneğimizde 20010 dan başlamak üzere). Çünkü hiç bir zaman bölmenin kalanı 20009 veya daha büyük bir sayı olmayacaktır. Bu durumda algoritma 0 veya synonym ile sonuçlanırsa
kayıt overflow alanındaki ilk boş yere kaydedilir.
Bu mekanizmayı çalıştırabilmek için kayıt yapısında olması zorunlu alanlar:
Kayıt tipi (0 ise boş bir kayıt/ 1 ise dolu bir kayıt/ 5 ise iptal kayıt)
Primary key değeri
Stok numarası
Synonym kayıt adresi

Şimdi bir örnekle algoritmayı çalıştıralım:
78VB9006AA stok numarası için rutin 7851 i verdi.
Read Invalid ile 7851. nci kaydı okuduk, kayıt tipi 0-->bu kaydı kullanabiliriz, buna göre:
primary key = 7851
kayıt tipi = 1
Stok numarası = 78VB9006AA
Synonym kayıt adresi = 0 olarak kayıt güncellenir.

daha sonra 80AA0001BC için rutin tekrar 7851 değeri verdi. 7851. kayda Read Invalid sonrası kontrolde kayıt tipi = 1 (geçerli bir kayıt) ama stok numarası (78VB9006AA) # 80AA0001BC. Bu durumda overflow alanındaki ilk boş kayıt 20010 olduğundan, 78VB9006AA nın kaydına synonym kayıt adresi olarak 20010 u yazıp bu kaydı güncelleriz, daha sonra da 20010. ncu kaydı okuyup 80AA0001BC yi yaratırız. Bu mantık birden fazla synonym olması durumunda da geçerlidir, zincirde her okunan kayıtta stok numarası kontrol edilir, eşit olmama durumunda varsa synonym okunur yoksa zaten söz konusu stok numarası sisteme kayıtlı değildir. Dikkat edilmesi gereken başka bir önemli konu kayıt iptalleridir. Random Access organizasyonda kayıtların fiilen silinmesi söz konusu olamayacağından, yapılması gereken şey ilgili kaydın içini boşaltmak ve kayıt tipini de 0 a dönüştürmek. Ancak bu durumda, kayıtta synonym adresi dolu ise artık o kayda erişim imkansızlaşacağından yapılması gereken kaydın içini boşaltmak yerine kayıt tipini değiştirmek (örneğin 5 yapmak) yeterli olacaktır. Dosyaya erişim rutinlerine kayıt tipi 5 ise bu iptal edilmiş bir kayıttır mantığı sorunu çözecektir.
Bu mantıkla ihtiyaç duyulan her dosya için random access erişim sağlanabilir. Biz de malzeme ve satıcı ana kütüklerini bu yöntem ile oluşturup seçmeli erişim olanağını kullanıcılara sağlamıştık.
Buna bağlı olarak da diğer bir sorun satınalma siparişlerine malzeme veya satıcı kodundan erişebilme durumu idi. Kısaca özetlersem, her malzeme için her ay bir veya daha fazla satıcıya satınalma siparişi hazırlanırdı. Planlama sürekli olarak a malzemesine hangi siparişler açılmış, veya b satıcısında hangi malzemelerin siparişleri var sorusunu sorardı.Bu sorunu da pratik bir şekilde çözmek durumunda idik. Kullandığımız yöntem "linked lists" oldu.
Bu da 5. Bölümün konusu olacak. "Linked Lists" i bizim programlara eklediğimizde de zaten sonuç bir "network database" uygulaması idi. 0 lisans ücreti ile biz uzun bir süre şirketin malzeme planlamasını bir veri tabanı ortamında yürüttük. Sonraları sisteme ekranlar bağlanmaya başlandığında bizim programların alt yapısı stok numarası veya satıcı kodu girerek bilgilere ulaşmaya imkan sağladığından interactive mode a geçmek çok kolaylaşmıştı.

Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?