Revengeful
Emekli Yönetici
SQL Tanım,Giriş,Temel Bilgiler,Uygulamalar,Kodlama Dili
İyi bir veritabanı tasarımı yapabilmek için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur. Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır.İyi bir veritabanı tasarımı yapabilmek için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur. Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır. Ancak 5N, tasarım aşamasında size yol göstermek yerine hangi şartlara uygun tasarım yapmanız gerektiğini anlatır.
Bazen, bu kurallardan vazgeçmek durumunda kalabilirsiniz ancak, veritabanında saklanacak verilerin hacmi arttıkça bu kuralların daha sıkı sağlanmasında fayda vardır.
1.Nesneleri Tanımlayın:
Herhangi bir proje önünüzde konduğunda öncelikle nesneleri tanımlayın. Nesne, çeşitli özellikleri bulunan bir varlıktır. Başlangıçta özellikleri ile ilgilenmeyeceğiz.
Örnek:
Birkaç örnek proje için nesneleri verecek olursak,
Kütüphane sistemi: Kitap, üyeler, türler, ödünç hareketleri
E-ticaret sistemi: Ürünler, müşteriler, siparişler,teslimat, fatura bilgileri,üreticiler,tedarikçiler,dağıtıcılar...
Futbol Ligi: Takımlar, sahalar, oyuncular, fikstür, hakemler, antrenörler
Okul Sistemi: Öğrenciler, öğretmenler, dersler, derslikler
Sözlük: kelimeler, anlamlar,diller
2.Her nesne için bir tablo oluşturun:
Her bir nesne için bir tablo oluşturun ve her bir tabloya içereceği veriyi en iyi anlatan bir isim verin. Tablo oluşturma işini, bir kağıt üstünde sembolik olarak gösterebilirsiniz veya doğrudan MS Access, SQL Server, MySQL,Oracle ...gibi kullanmakta olduğunuz VTYS üstünden de oluşturabilirsiniz. Ama tüm proje bitinceye kadar bu tablolar üstünde muhtemel değişiklikler olacaktır.
Tablolar isim verirken mümkünse tekil isimler kullanın. Böyle yaparsanız hem daha anlaşılır bir tasarım yapmış olursunuz hem de daha sonra kodlama aşamasında karışıklığın önüne geçmiş olursunuz.
Örneğin içinde Kitap ile ilgili bilgiler bulunduracak tablonun adını Kitap koymak oldukça mantıklıdır.
Veritabanındaki herhangi bir veriye erişmeden önce tabloya erişilir.Bir veritabanında en çok muhatap olunan nesne grubu genellikle tabloalrdır. Buraya kadar hangi tabloları oluşturacağımıza karar verdik. Her bir tablonun içinde hangi bilgileri saklayacağımızı kabaca biliyoruz. Bu aşamada, tabloda yer alacak her bir kaydı bir diğerinden ayırabilecek bir sütuna ihtiyaç duyarız. Örneğin bir kitabı seçmek istediğimizde, bu kitabın hangi kitap olacağını öyle bir anlatabilmeliyiz ki, başka hiçbir kitap ile karışmamalı. Bunu yapmanın tek yolu, bir alanı birincil anahtar alan olarak belirlemektir.
Anahtar alan seçerken, sizi kısıtlamadığı sürece, doğal alanlar seçmeye dikkat etmenizde fayda vardır. Örneğin araçlar ile ilgili bir tablo yaparken, plakalarını anahtar alan olarak belirleyebilirsiniz. Çünkü her bir plakadan bir tek araç trafiğe çıkabilir. Bu bizi kısıtlamaz. Öğrenci tablosu için, öğrenci numarası doğal bir anahtar alandır çünkü aynı okulda, aynı numaradan bir öğrencinin daha bulunması söz konusu değildir.
Kitap tablosu için ISBN numarasını anahtar alan olarak tanımlayabilirsiniz ama, elinizde aynı kitaptan iki adet olduğunda, ISBN numarası sizi kısıtlayacaktır. elinizde iki adet ‘Önümüzdeki Yol’ kitabı varsa, her iki kitabın da ISBN numarası aynıdır.Kitapdan biri eski biri yeni olabilir.Bu bir kargaşaya neden olabilir. Çünkü eski kitabı kime yeni kitabı kime verdiğinizin takibini ISBN numarası ile mümkün değildir. Ancak bir E-Ticaret sitesi tasarlarken, stoktaki tüm Kitap birbiri ile eşdeğer olacağından ya da öyle olduğu varsayıldığından ISBN numarası birincil anahtar alan olabilir. Bu durumda, adet diye bir niteliğin aynı tabloda yer alması gerekecektir.
4.Nesnelerin gerekli her bir özelliği için tabloya bir sütun ekleyin
Tablo adlarını tamamladıktan ve anahtar adlarını belirledikten sonra, tablolarınıza sıradan adını veren nesnenin her bir özelliği için bir alan(sütun) ekleyin.
1.En başa birincil anahtar olarak belirlediğiniz alanı eklemek bir kural değildir ancak tablonuzun anlaşılırlığı ve göze hoş görünmesi açısından tercih etmenizin yararınıza olacak bir tekniktir.
2. Genellikle,yapay birincil anahtar alanlar tablo adı ile başlar ve sonunda ID vardır. ogenci tablosu için ogrenciID gibi.
Örneğin, kitap için:
Kitap no, ISBN no, kitap Adı, Yazarı, türü,Sayfa Sayısı, Özeti, fiyatı, baskı yılı...
Üye için: UyeNo, Adı, soyadı, e-mail adresi, ev telefonu, cep telefonu, iş telefonu....
Bu noktada, sizden istenen proje ile ilgili basılı formlar vs. varsa, bir göz atmanız hangi özelliklerin yer alması gerektiği konusunda karar vermenize yardımcı olacaktır.
Aklınızda hep şu olmalı: veri tekrarı olacak mı? Veri tekrarı olacaksa bir yerlerde hata yapıyorsunuzdur. Elinizdeki tablonun en az bir tabloya daha ayrılması gerekiyor demektir.
Şunu da unutmayın, her projeye uyacak evrensel bir veritabanı tasarım tekniği yoktur. Yani her şey sizin belli kurallar etrafında ne kadar teferruatlı düşünebildiğinize bağlıdır.
Örneğimizde, her bir kitap için tür belirledik ama, bir kitap hem kişisel gelişim kategorisine hem de hikaye kategorisine girebilir. Ya da e-ticaret sisteminde bir ürünün birden fazla reyonda yer alması gerekli olabilir. Veya bir kitap birden fazla kişi tarafından yazılmış olabilir..
Bir kitap için birden fazla türü kaydedebilmeyi ele alalım:
Bu türden bir sorunu çözmek için ilk akla gelen şey, Kitap için, 2.Tür,3.Tür diye iki alan daha eklemek. Ama çoğu Kitap bir tek türdendir ve bu Kitap için 2 alan hep boş kalacaktır. Öte yandan, 4 türe birden giren bir kitap olduğunda 4.tür bilgisini nereye yazacağız? Aynı alana mı? Ya da dört adet bölüm mü açacağız? Bunlar, veritabanı tasarımının doğasına terstir.
2.Çözüm yolu ise, bir kitabı iki kere kaydedip, birincisini, ‘Kişisel Gelişim’ türü olarak; ikincisini de ‘Hikaye’ olarak girmek.. Ancak bu durumda da diğer bilgiler tekrar edecektir. Ya da bir süre sonra, kitap hakkında girilen bilgilerin yanlış olduğunu fark ettiniz.Hangi kaydı güncelleyeceksiniz? Ya birini düzeltip birini unutursanız... Sonuçta veri tekrarı ve veri bütünlüğünün bozulması söz konusudur. Bu da yine ilişkisel veritabanı tasarımının doğasına terstir.
Bu durumda, türler diye bir yeni tablo oluşturup, bir de kitap_turler diye 2. tablo yu oluşturduktan sonra bu türden bilgileri burada tutmak gerekecektir. Böylelikle, hiçbir türde yer almayan Kitapdan 10 ayrı türde yer alan Kitapa kadar bütün olasılıklar için bir çözüm geliştirmiş oluruz.
6.Anahtar Alana Bağlı Olmayan Alanları Belirleyin
İlişkisel veritabanında, tablodan herhangi bir tek kayda erişmek için mutlaka bir farklı özellik sağlanmalıdır ve bu özellik de anahtar alan tarafından sağlanır. Ancak bazen, anahtar alan ile aynı satırda yer aldığı halde, anahtar alan ile birebir ilişkisi olmayan bir alan yer alabilir. Bu türden alanları elimine edip ayrı tablolara ayırmak gerekir.
Örneğin, ödünç tablosunu ele alacak olursak, ödünç verdiğimiz her kitabı ödünç alanın adresini de bilmek istediğimizde, bunu ödünç tablosuna yazamayız. Çünkü ödünç tablosunun birincil anahtar alanı oduncNo’dur ve bu alan, ödünç verme işlemi ile ilgilidir. Oysa ödünç alanın adresi, ödünç alan kişinin kendisine bağlı bir özelliktir. Bu kişinin her aldığı kitap için adresini tekrar yamaya gerek yoktur. Aynı şekilde otomasyon içerisinde başka yerlerde de bu kişinin adres bilgilerine muhtemelen ihtiyaç duyulabilir çünkü adres, üyenin bir özelliğidir.
Ödünç verilen kitabın adresini bilmek istediğimizde, üyeler adında bir tablo daha açıp, burada herkesin adresini tutmak durumundayız demektir. Ödünç tablosunun ise, oduncAlan bilgisi olarak, Üyeler tablosunun birincil anahtar alanına bir bağlantı(yabancı anahtar) içermesi daha doğru olur.
7.Tablolar arasındaki ilişkileri tanımlayın.
Her biri bir nesneye dair özellikleri barındıran tabloların tümünü göz önüne alın ve birbirleri ile olan ilişkilerini tanımlamaya çalışın. Örneğin Kitapı ödünç veririz. Bu durumda, ödünç tablosu ile Kitap tablosu ilişkili olacaktır. Kitap üyelere ödünç verilir. Bu durumda, ödünç ile üyeler arasında da bir ilişki vardır. Türler ile Kitap arasında bir ilişki vardır, bir kitabın en az bir türe dahil olması gerekir.
Bizim projemizdeki nesneler(tablolar) arasında aşağıdaki ilişkiler yer almaktadır:
Kitap.kitapNo (1)---(N) odunc.kitapNo
Uyeler.uyeNo(1)---(N)odunc.uyeNo
Tur.turNo(1)---(N)Kitap_tur.turNo
Kitap.kitapNo(1)---(N)Kitap_tur.kitapNo
Yazar.yazarNo(1)---(N)kitap_yazar.yazarNo
İki tablo arasında ilişkiyi sağlayan alanların aynı adda olması zorunluluk değildir. Teorik olarak tabloları istediğiniz herhangi iki alanları üstünden birleştirebilirsiniz. Ancak, türler tablosundaki türNo ile üyeler tablosundaki uyeNo alanını birleştirdiğinizde hiçbir işinize yaramayacak anlamsız bir ilişki ortaya koymuş olursunuz.
Bu ilişkileri analiz ederken, her bir alanın hangi tablo için birincil anahtar alan, hangi tablo için yabancı anahtar olduğunu not etmeniz, daha sonra fiziksel olarak veritabanını tasarlarken işinizi kolaylaştıracaktır. Hatta bu bilgileri bir şema üstünde de gösterebilirsiniz. İşte bir çok VTYS tarafından sağlanan örnek bir şema: diyagram_1: Bu kısımda anlatılanlar doğrultusunda örnek projemizin SQL Server 2000 üstünde görünen diyagramı. İlişkili her iki tablo bir birincil alan ve bir yabancı anahtar alan üstünden birbirine bağlanır. Aynı diyagramın bir benzerini MS Access ile degerçekleştirebiliriz.
İPUCU:
Farklı tablolardaki iki alan aynı veriyi tutuyorsa, iki alana da aynı adı vermek, karışıklığa yol açabilir gibi görünse de aslında daha düzgün bir yapı ortaya çıkar. KitapNo alanı, Kitap tablosunda da ödünç tablosunda da kitap numarası tutmaktadır. Bu alanlardan birine kitapNo diğerine oduncGidenKitapNo demek, kafa karışıklığına neden olabilir. En Mantıklısı her ikisine de kitapNo demektir.
Veritabanı Yönetim Sistemleri, kullanıcılar adına düşük seviye veri işlemlerini yerine getirip, kullanıcıya standart bir komut arayüzü veya grafik arayüzü ile veri yönetimi fonksiyonları sağlayan uygulamalarıdır.Veri tabanı yönetim sistemi(VTYS), yeni bir veritabanı oluşturmak, veri tabanını düzenlemek, geliştirmek ve bakımını yapmak gibi çeşitli karmaşık işlemlerin gerçekleştirildiği birden fazla programdan oluşmuş bir yazılım sistemidir. Veri tabanı yönetim sistemi, kullanıcı ile veri tabanı arasında bir arabirim oluşturmaktadır ve veri tabanına her türlü erişimi sağlar.
Veri tabanı yönetim sistemi, veri tabanını tanımlama, veri tabanını oluşturma ve üzerinde işlem yapma yeteneği olan bir yazılım sistemidir. Veri tabanının tanımlanması: veri tabanını oluşturan verilerin tip ve uzunluklarının belirlenmesidir. Veri tabanını oluşturulması ise veri için yer belirlemesi ve saklama ortamına verilerin yüklenmesini ifade eder. Veri tabanı üzerinde işlem yapmak; belirli bir veri üzerinde sorgulama yapmak, meydana gelen değişiklikleri yansıtmak için veri tabanın güncellenmesi ve rapor üretilmedi gibi işleri temsil eder. Ayrıca veri tabanı yönetim sistemi, verinin geri çağrılmasını sağlar. Veri tabanına yeni kayıt eklemek, eskileri çağırmak ve gerekli düzeltmeleri yapmak yoluyla, verinin bakımını ve sürekliliğini gerçekleştirir, kayıtlara yeni veri eklemek ve yeni kayıtlar oluşturmakla, veri tabanını genişletir.
Bir veri tabanı yönetim sistemi yazılım, karışık ve kapsamlı bir yazılımdır. Kısaca şu işleri gerçekleştirir:
Veri tabanı yönetim sistemi bu işlerini bazı özel alt diller (Structured Query Language,SQL v.b) kullanarak gerçekleştirir. Veri tabanı yönetim sistemi SQL komutunu ve diğer işlevlerini, aşağıdaki adımları sırayla gerçekleştirerek yapar:
Veri Tabanı Sistemi Kullanımının Avantajları
Veri tabanına duyulan ihtiyacın asıl nedeni merkezi kontroldür. Veri tabanı, veri tabanı yöneticisi tarafindan yönetilir ve sistem merkezi olarak veriler güncellenir. Veri tabanlarının avantajlarını kısaca şöyle sıralayabiliriz:
Veri Tabanı Sistemlerinin Dezavantajları
Dosya sisteminden veritabanı sistemine geçmenin bir çok yararı olmakla beraber bazı dezavantajlarda beraber gelmektedir
Verilerin tekrarı azalır. Böylece verilerde meydana gelen karışıklıklar önlenmiş olup bellekten tasarruf edilir,
Veri modeline göre veritabam yönetim sistemleri
Yapısal olarak bütün veri tabanları bir değildir. Veri tabanları verileri saklama ve onlara erişme bakımından farklı tiplere ayrılır.
Hiyerarşik Veri Tabanları
Bu veritabanı tipi, ana bilgisayar ortamlarında çalışan yazılımlar tarafından kullanılmaktadır. Bu türde en çok kullanılan yazılım, IBM tarafından çıkarılan IMS' dir. Uzun bir geçmişe sahip olmasına rağmen, PC ortamına uyarlanan hiyerarşik veri tabanları yoktur.
Hiyerarşik veri tabanları, bilgileri bir ağaç (tree) yapısında saklar. Kök (Root) olarak bir kayıt ve bu köke bağlı dal (Branch) kayıtlar bu tip veritabanının yapısını oluşturur. Yukarıda böyle bir veri tabanının yapısı gösterilmektedir.
Ağ Veri Tabanları
Hiyerarşik veri tabanlarının yetersiz kalmasından dolayı bilim adamlarının ortak çalışması sonucu ortay konulmuş bir veri tabanı türüdür
Ağ veri tabanları verileri ağaçların daha da gelişmiş hali olan graflar (ağacın kendiside özel bir graftır.) şeklinde saklarlar. Bu yapı en karışık yapılardan biridir.
İlişkisel Veri Tabanları
E.F. Codd Tarafından Geliştirilmiştir. Bu sistemde veriler tablo seklinde saklanır. Bu veri 'tabanı yönetim sisteminde veri alış verişi için özel işlemler kullanılır. Bu işlemlerde tablolar operandlar olarak kullanılır. Tablolar arasında ilişkiler belirtilir. Bu ilişkiler matematiksel bağıntılarla (ilişkilerle) temsil edilir. Günümüzde en çok tercih edilen ilişkisel veri tabanı ayrıca detaylı olarak anlatılacaktır.
Nesneye Yönelik Veri Tabanları
Günümüzde nesne kavramı her yerde kullanılmaya başladı. Pek çok kelime işlemci ve hesap tablosu programlarının alıştığımız görünümlerine artık bir de nesneler eklendi. Ancak bu gerçek anlamda bir nesneye yönelik yazılım demek değildir.
Yüzde yüz nesneye yönelik bir yazılımın tamamen nesneye temelli çalışması gerekir. Yazılımın mutlaka nesneye yönelik bir dilde yazılmış olması beklenir. Fakat Windows gibi işletim sistemi üzerinde çalışan yazılımlar bu özelliklere tümüyle sahip değiller. Sadece nesne kavramını kullanarak bazı ek özellikler sunar.
Nesneye yönelik veri tabanı da , C++ gibi nesneye dayalı bir dille (OOPL) yazılmış olan ve yine C++ gibi nesneye dayalı (OOPL) bir dille kullanılan veri tabanı anlamına geliyor. Günümüz teknolojisinde yüzde yüz nesneye yönelik bir veri tabanı yaygın olarak kullanıma sunulmuş değildir. Ancak nesneye yönelik veri tabanlarının bazı üstünlükleri olacağından söz ediliyor.
İlişkisel veri tabanları ile karşılaştırıldığında nesneye yönelik veri tabanlarının sahip olması gereken üstünlükler şunlardır:
Genel kabul görmüş 5 normalizasyon kuralı vardır. Bu kurallar, ilişkisel veritabanının tanımı ile birlikte ortaya konmuş kurallar olup burada özet olarak değinilmiştir.Aslında ilişkisel veri tabanı tasarımından ziyade bir tablo içerisinde yer alacak kaydın nelerden oluşma*sına karar vermeye yarayan normalizasyon kuralları başlı başına bir işlemdir. Sonuç itibari ile veritabanı tasarım aşamasında gerekli bir işlem olduğundan bu bölüme almayı uygun bulduk. Genel kabul görmüş 5 normalizasyon kuralı vardır. Burada her bir kuralı tam olarak anlatmak mümkün değildir. Ancak bu kurallar, ilişkisel veritabanının tanımı ile birlikte ortaya konmuştur. Özet olarak fikri vermesi açısından yer verilmiştir.
Yazıda anlatılan ilişkileri kavramak için, alttaki şemaya bir göz atabilirsiniz.
1. Normalizasyon Kuralı
Bir satırdaki bir alan yalnızca bir tek bilgi içerebilir. Örneğin kitap tablosunda, birden fazla yazarı olan kitap için yazar1, yazar2, yazar3 diye alanlar açsaydık, bu kurala uymamış olurduk. Böyle bir durumda, ayrıca yazarlar tablosu da oluşturarak kuralı çiğne*memiş oluruz
DİKKAT:Verileri virgül veya bir başka karakter ile ayırıp aynı alana girmek. Daha sonra program içerisinde split ile bu değerleri ayırmak. Ancak bu ilişkisel veritaba*nının doğasına terstir.
2. Normalizasyon Kuralı
Bir tablo için, anahtar olmayan her alan, birincil anahtar olarak tanımlı tüm alanlara bağlı olmak zorundadır. Mesela, Ödünç tablosunda KitapAdi diye bir alan eklese idik, bu sadece ödünç verilen kitap ile ilgili bir bilgi olacaktı ve oduncNo'na bağlı bir nitelik olmayacaktı. Bunu çözmek için, kitap adlarını ayrı bir tabloda tutarak sorunu çözdük.
Ya da anahtar alanın birden fazla alandan oluştuğu tablolarda, anahtar alanlardan sadece birine bağlı veriler, tabloda yer almamalı, ayrı bir tabloya taşınmalıdır.
Bunun tersi de geçerlidir. Yani iki ya da daha fazla tablonun birincil anahtarı aynı olamaz. Şayet böyle ise, bu iki tablo tek tabloya indirilmelidir.
3. Normalizasyon Kuralı
Bir tablo için, anahtarı olmayan bir alan, anahtarı olma*yan başka hiç bir alana bağlı olamaz. Örneğin, kitapları*mız için cilt tipi adında bir alan ekleyip burada da karton kapak için K, deri cilt için D, spiral cilt için S yazsaydık, bu kodlama, kitap tablosunun birincil anahtarı olan kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü bu kodlama bir başka anahtarı olmayan alana bağlıdır. Bunun sonucunda da veritabanımızda, karşılığı olmayan bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu olarak tutan alan aslında cilt tipi açıklaması olan başka bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır.
Bu durumda, ciltSekli adında bir tablo açmamız gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli olmalıdır. Ancak bundan sonra, kitaplar tablosunda ciltTipi adında bir sütun açıp buraya da D,S,K gibi kodları yazabiliriz.
4. Normalizasyon Kuralı
Birincil anahtar alanlar ile anahtarı olmayan alanlar arasında, birden fazla bağımsız bire-çok ilişkisine izin verilmez. Örneğin, tablomuzda yer alan bir kitap hem hikaye kitabı hem de kişisel gelişim kitabı olabilir.(Bu durumda kitabın adı, kişisel gelişim hikayeleri olurdu her halde) Bu durumu Kitap tablosunda nasıl ifade edeceğiz?
4.Normalizasyon kuralını sağlamak için, her bağımsız bire çok ilişki için ayrı bir tablo oluşturmak gerekir.
Bu örnekte, türler diye bir tablo açmamız gerekiyor. Daha sonra kitapTurleri diye bir başka tablo daha açma*mız gerekiyor. ‘Kişisel Gelişim Hikayeleri' adlı kitap için, öncelikle kitap numarası, Hikaye bölümünün kodunun yer aldığı bir satır; ardından da yine kitap numarası, ardından da kişisel gelişim türünün kodunun aldığı yeni bir satır daha eklemek gerekir.
5. Normalizasyon Kuralı
Tekrarlamaları ortadan kaldırmak için her bir tabloyu mümkün olduğunca küçük parçalara bölmek gerekir. Aslında ilk 4 kural sonuçta bu işe yarar ancak, bu kurallar kapsamında olmayan tekrarlamalar da 5.nolu normali*zasyon kuralı ile giderilir.
Örneğin, kitaplarımız için bir edinme şekli bilgisi girilecek sütun eklemek isteyelim: Bu bölüme girilebile*cek bilgiler bellidir: Bağış veya satın alma.
Bu bilgileri başka bir tabloda tutabiliriz. Böylelikle, kullanıcıların bu alan gelişi güzel bilgiler girmesini engellemiş oluruz. Bu da sorgulama esnasında verile*rimiz arasında bir tutarlılık sağlar. Bu işlem sonucunda, tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler başka bir tabloya taşınmış olur. Bu tablo için, veritabanı programlamada ‘look-up table' terimi kullanılır.
Ancak, veritabanı normalizasyon kuralları, bir ilişkisel veritabanının tasarlanma aşamalarını değil de ilişkisel veritabanında yer alacak kayıtların ilişkisel verita*banı ile uyumlu olup olmadığını denetlemeye yöneliktir.
Özetle ilişkisel bir veritabanı tasarımı şu dört öğeyi barındırmalıdır.
SQL’i iyi bilenler için bile seyrek kullanılan komutlara bir yerlerden bakmak bazen bir zorunluluk arz edebilmektedir. İşte kitapta böyle bir ihtiyacı da karşılamak üzere SQL’i enine boyuna ele aldım. Özellikle yapılabilecek hataları, akla takılabilecek soru ve sorunları, program geliştirme esnasında önemli olduğunu gördüğüm teknikleri püf noktaları halinde bulabilirsiniz.Basit bir Web uygulamasından, devasa kuruluşların ağır verilerine kadar, günümüzde bir çok alanda veritabanı uygulamalarına ihtiyaç duyulmaktadır. Seride özellikle, Web projeleri gibi küçük çaplı işlerinde Veritabanı kullanmak zorunda kalan ama bu konuda başlangıç aşamasında bile bilgi sahibi olmayan bir çok kişiye ışık tutacak şekilde hazırlandı. Bundan dolayı da SQL ve veritabanının dışında, bir veritabanının Web’e açılması, XML, Web servisleri ile başka sitelere hizmet sunma gibi konulara da nasıl yapılacağı konusunda fikir vermesi açısından bir noktaya kadar değinildi.
Tüm bunların yanında, SQL’i iyi bilenler için bile seyrek kullanılan komutlara bir yerlerden bakmak bazen bir zorunluluk arz edebilmektedir. İşte kitapta böyle bir ihtiyacı da karşılamak üzere SQL’i enine boyuna ele aldım. Özellikle yapılabilecek hataları, akla takılabilecek soru ve sorunları, program geliştirme esnasında önemli olduğunu gördüğüm teknikleri püf noktaları halinde bulabilirsiniz.
Veritabanı uygulamalarının kurgulamak bir çok platforma hakim olmayı gerektirir. Ciddi bir Web uygulaması meydana getirebilmek için öncelikle, SQL ve veritabanı konusunda temel bilgilere sahip olmak gerekir. Çünkü, tüm sistem, veritabanı şeması üstüne inşa edilir. Bunun üstüne, HTML ve ASP-ASP.NET-PHP gibi bir Web programlama tekniğine hakim olmak gerekir. Bu da yetmez, veri erişim bileşenlerini de yakından tanıyıp etkin olarak kullanabilmek gerekir. Bunun üstüne, güncel bir uygualma geliştirmek için XML’i yakından tanımak gerekir. XML Web Servisleri, Web’de kurumlar arası haberleşme açısından oldukça ciddi gelişmeler önermekte.
Seriyi hazırlarken, bu durumları göz önüne aldık. İlk kitapçıkta, İlişkisel Veritabanı ve SQL konuları ele alındı. İkinci ünitede bir popüler orta ve büyük ölçekli Veritabanı Yönetim Sistemi olan Microsoft SQL Server 2000, T-SQL ile VTYS üstünde dinamik programcıkların geliştirilmesi, belli başlı dinamik olarak SQL scriptleri oluşturma konularına da orta düzeye kadar yer verildi. Böylelikle, veritabanı işine sıfırdan başlayacak bir kullanıcının profesyonelliğin kapısından içeriye adım atacak hale gelebileceği bir kurs kitabı ortaya çıktı.
Üçüncü kitapta, VTYS uzayının dışında masa üstü uygulamalar veya Web uygulamaları geliştirmek için , VTYS’ye erişim sağlayan MDACs(Microsoft Data Access Compunents) inceleniyor. Bu konuda, OLE-DB, ADO, ADO.NET nesneleri tanıtılıyor. Son kitapta ise XML ve Web Servisleri konuları inceleniyor.
Özellikle SQL’e adanan ilk kitapçıkta olmak üzere, kolay ama çok şey öğrenilmesi gerektiğinden, serinin tamamındaki konu anlatımları sık sık ve kolaydan zora doğru giden örneklerle desteklendi.
Veritabanının tarihi gibi , uygulama geliştirme açısından çok da etkili olmayan konuları maalesef bu seride bulamayacaksınız. Bu türden, işe yaramayacak kuru bilgiler için bakılabilecek en iyi yer, bu konuda eğitim veren yüksek öğretim kurumlarımızda okutulan ders Kitapı olabilir.
Günlük hayatta, veritabanına hakim olamamış programcı arkadaşların, bu açıklarını daha fazla (SQL harici) kod ile kapatmaya çalıştıklarına defalarca şahit oldum. Böyle bir seri sayesinde, neyin veritabanı programlama kapsamında düşünülmesi, neyin istemci programa bırakılması konularının okurlar tarafından daha iyi anlaşılacağı kanaatindeyim.
Bu kitap sayesinde SQL’i öğrenen programcıların bunu nerede nasıl kullanacaklarını geniş örneklerle hem de güncel teknolojiler ışığında öğrenebilecekleri bir seri ortaya çıktı. Emeği geçen herkese teşekkürü borç bilirim.
Veritabanı istemci programları yazmak, SQL dışında başka dillere de hakim olmayı gerektirir. VBScript’ten tutun da PHP, Perl, ASP, ASP.Net gibi teknikler ile Web sayfası geliştirmeye aşina olmak yahut C/C++/C#, Java, Visual Basic gibi diller ile basit uygulamaları yapabiliyor olmak gerekir.SQL(Es-kü-el okunur) insanların veritabanı sistemleri ile konuşmasını sağlayan popüler bir dildir. Bu dil sayesinde, bir veritabanından kayıtları alabilir, değiştirebilir ya da yeni kayıtlar ekleyebiliriz. SQL bir dildir; ancak bir programlama dili değildir. Program geliştirme aşamasında SQL’den faydalanılır, ancak tek başına bu iş için yeterli değildir.
Verilerin belli özelliklerine göre gruplanıp diske kaydedilmesi işine veritabanı yönetimi denir. Veritabanlarından en popüler olanı, ilişkisel veritabanıdır. İlişkisel veritabanın kökeni, 1970’li yıllarda IBM laboratuarlarında yapılan çalışmalarda atılmıştır. Takip eden çalışmalarla, 1983’te SQL(Structural Query Language) standartları tanımlanmış ve ardından 1987 yılında önce ISO ardından da ANSI tarafından bir standart olarak kabul edilmiştir. Daha sonra, bu standartlar çerçevesinde bir çok veritabanı yönetim sistemleri geliştirilmiştir. Bunlardan belli başlıları, Oracle, Sybase, MS SQL Server, Informix ve MySQL’dir. Bu VTYS’lerin işlerin daha kolay yürümesi için kendi adlarına standart dilden uzaklaşan tarafları vardır. Ancak genel işlemlerde kullanılan dil tümü için de ortaktır ve SQL’dir.
Veritabanı Yönetim Sistemleri
Veri Tabanı Yönetim Sistemleri, fiziksel hafızada bilgileri çeşitli özelliklerine göre gruplandırıp şekillendirdikten sonra saklarlar. Saklanan bu veriyi, verilen SQL komutları ile insanların istekleri çerçevesinde işler, yeniden şekillendirirler. Yani, Veritabanı Yönetim Sistemi’nin bir ucunda, bilgisayar disk(ler)inde saklanan düzenlenmiş veriler diğer ucunda ise bir kullanıcı (genellikle insan) vardır. Veritabanı Yönetim Sistemleri konusunda daha geniş bilgi bir sonraki kitapçıkta verilecektir.
şekil 1.1 : VTYS disk üstündeki verileri daha kolay işleyip yönetmemizi sağlar. SQL ile VTYS’ye veriler üstünde nasıl bir işlem yapması istendiği anlatılır. VTYS bunu bizim adımıza gerçekleştirir.
Veritabanı Yönetim sistemleri, her zaman bir kullanıcıya, yönetim ekranlarından bilgi vermek için kullanılmaz. Bazen kullanıcı konumunda doğrudan bir insan yerine bir program da olabilir. İşte bir veritabanı programcısı, veritabanını çekip çevirmenin yanında, VTYS’ye bağlanıp veri alış-verişi ve veri üstünde değişiklik yapan bu ‘istemci programları’ da yazabilen kişidir.
Veritabanı istemci programları yazmak, SQL dışında başka dillere de hakim olmayı gerektirir. VBScript’ten tutun da PHP, Perl, ASP, ASP.Net gibi teknikler ile Web sayfası geliştirmeye aşina olmak yahut C/C++/C#, Java, Visual Basic gibi diller ile basit uygulamaları yapabiliyor olmak gerekir.
.Veritabanı programlama ile bir çok proje geliştirilebilir. Bir İngilizce-Türkçe sözlük bu yolla kolayca yazılabilir. Bir kütüphane takip otomasyonu, bir Hastane otomasyonu, Muhasebe programları ve daha bir çok otomasyon programı temelde veritabanı projesidir.
Günlük hayatta Veritabanı programlama telefon şirketleri tarafından yoğun olarak kullanılır. Konuşmaların süreleri ay boyunca veritabanlarında saklanır ve ay sonu geldiğinde istemci programlar tarafından her bir abonenin telefon faturası teker teker hesaplanır. Günde on binlerce abonenin birbirini aradığı bir durumun içinden başka hangi yolla çıkılabilir ki?
Bu bölümde İlişkisel veritabanı hakkındaki temel terim ve teoremleri öğreneceğiz.İlişkisel veritabanı günümüzde en yaygın kullanılan ilişkisel veritabanı sistemlerinden biridir. En çok kullanılan ilişkisel Veritabanı Yönetim Sistemlerine Oracle, Ms SQL Server, Sybase, Informix, MySQL gibi Veritabanı yönetim sistemlerini örnek olarak verebiliriz. Bu bölümde verilen uygulamaları test etmek için MS Access de bir noktaya kadar kullanılabilir ancak verilen örneklerin tamamı MS Access tarafından desteklenemez. Bu nedenle, örneklerin büyük bir çoğunluğu MS Access MS SQL Server 2000 üstünde test edilmiştir. ONLINE olarak kitabın içerdiği uygulamaları test etmek için adresinden faydalanabilirsiniz.
Bilgisayar ortamında veri saklamak için kullanılan yapılardan en büyüğüne dosya dendiğini biliyorsunuzdur. İlişkisel veritabanları, veritabanı denilen büyük dosyalardan oluşur. Veritabanı, içerisinde tabloları barındıran bir dosyadır. Her bir tablo, belli yapıya uygun verileri saklamak üzere tasarlanır. Tablolar, satırlardan ve sütunlardan oluşur.
'Ödünçalınan' kitaplarımıza bir çare bulmak için veritabanı uygulaması geliştirmeye ne dersiniz? Bu belki kitabımızı geri getirmez ama, hiç olmazsa kitabımızı getirmeyenin kim olduğunu bilebiliriz...Bir çoğumuzun başına gelmiştir. Arkadaşlara, eşe dosta bir çok kitap, kaset, CD veririz ve gidiş o gidiş. Böyle bir sorun ile nasıl başa çıkarız? Bu konuda bir proje geliştirelim:
Öncelikle elimizdeki bütün Kitaplarımızın bir listesini yapalım. Ama bunu yaparken, her bir kitaba numara vermeyi ihmal etmeyelim. Çünkü elimizde aynı kitaptan iki adet olabilir. Bunlardan biri eski öteki de yeni kitap olabilir. Bu durumda bu iki kitaptan hangisini kime verdiğimizi nasıl ayırt edeceğiz?
Daha sonra Kitaplarımızı şu şekilde bir listeye yazalım:
Şekil1.2 En başa Kitap No’nu, sonra Kitap Adı’nı ardından ISBN numarası’nı sonra Sayfa Sayısı’nı, Özeti’ni yazalım ve listeyi dolduralım.
Listenin her bir sütununda sırasıyla şu bilgiler yer alsın:
Kitap No :Her bir kitaba verdiğimiz numara
Kitap Ad :Her bir kitabın adı
ISBN Numarası:Her bir kitabın arkasında yer alan Uluslararası Standart Kitap Numarası
Sayfa Sayısı :Kitabın kaç sayfa olduğu
Özeti :Kitabın bir özet açıklaması
Amacımız, kime hangi kitabı verdiğimizi bilmek. O halde Kitap listesine ek olarak şimdi bir de ödünç listesi yapalım:
Şekil:1.3 Bu listede de, ödünç no, kitap no, ödünç alan, verme tarihi, Verme süresi, Geri Geldi mi şeklinde bir liste daha yapalım.
Kütüphanemizden verdiğimiz her bir kitabı bu listeye işlersek, hangi kitabımızın kimde kaldığını, süresi sonunda getirilip getirilmediğini kolayca takip edebiliriz. Buradaki Geri geldi mi hanesine gelen her kitap için bir işaret koyabiliriz ya da imza attırabiliriz.
Bu projeyi, bilgisayar ortamında yapmak, kağıt üstünde yapmaktan çok daha kolay olacaktır. Bu projede yer alan listelerin karşılığı veritabanında tablolardır. Hayatta bir çok şeyi listelerle çözeriz. Her bir listeye karşılık, veritabanı mantığında bir tablo gelir.
Tamam bu uygulamayı geliştireceğiz ama geliştirme sürecine başlamadan önce kullanacağımız kelimeler ne anlama geliyor, ortak ağızdan konuşmak için bunları tanıyalım..Veriler fiziksel hafızada Veri Dosyaları(DataFiles) halinde saklanır. Dosya, bilgisayarların bilgileri birbirinden ayırarak saklamak için kullandığı temel bilgi depolama yapısıdır. Bir dosyada, bir çok veri yer alabilir.Bir kütüphane otomasyonunu ele alacak olursak, kitap ile ilgili bilgiler, ödünç verilenler, kütüphaneden kitap alma hakları olan üyeler, CD ve kasetler ile ilgili bilgiler aynı veri dosyasında ama farklı tablolar içerisinde yer alabilir.
1.2.A.Tablolar:
Bir tablo yani günlük hayattaki ‘liste’ kavramı, satırlardan ve sütunlardan oluşur. Mesela Kitap listemizi(yani Kitap tablomuzu) ele alacak olursak, her bir satırda bir kitaba ait bilgiler yer almaktadır.
Alan(Field), Yapılandırılmış bilginin her bir kısmını saklamak üzere yapılan tanımlamadır.
Şekil1.4:Alan,her bir sütun için tanımlayıcı bilgileri tutan yapıdır.
Her bir alan, yapılandırılmış verinin bir birimini tutmak üzere tanımlanır. Her bir sütunun adı ile birlikte diğer bilgilerinin(en fazla kaç birimlik bilgi bu hücrede saklanabilecek, ne tür bilgi saklanacak vs.) ortaya koyduğu tanıma alan denir.
Satır(Row): Bir tabloda yer alan her bir kayıt bir satıra karşılık gelir. Örneğin Kitap tablosunda her bir satırda farklı bir kitap hakkındaki bilgi yer almaktadır.
Sütun(Column): Tablolar dikey sütunların yan yana gelmesiyle meydana gelmiştir. İlk sütunda kitap numaraları, ikinci sütunda kitap isimleri, üçüncü sütunda, ISBN numaraları yer almaktadır.
Kayıt(Record): Yapılandırılmış verilerden her birine bir kayıt denir. Yani, alan bilgileri ile birlikte her bir satır bir kayıttır. Bir kitap bilgisini ele alacak olursak,
Şekil1.5:Kayıt, alan tanımlamaları ile birlikte bir satırda yer alan bilgilere denir.
Bir kayıttır. Kayıt ile satır arasındaki temel fark, kayıt ile kastedilen yapının sütunlar hakkındaki bilgileri de içermesidir.
Veri Tipi(Data Type): Bilgisayar, kayıtları yapısal olarak tutarken, onların yapıları hakkında fikir sahibi olabilmek için bazı özelliklerinin önceden tanımlanması gerekir. Örneğin, kitap numarası alanının mutlaka bir tam sayı olacağını, Kitap adının harf ya da rakamlardan oluşacağını anlatmamız gerekir. Bir veritabanı oluşturulurken, her bir alanın tipinin ne olacağı tanımlanmak zorundadır. Bir alana tamsayı mı yoksa harf mi; tarih mi yoksa ondalıklı bir sayı mı geleceği ancak tanımlandıktan sonra kayıt girilebilir.
Ayrıca, bir alanın uzunluğu ne kadar olacak, harf girilebiliyorsa en fazla kaç harf girilebilecek, rakam ise en fazla kaç basamaklı olabilir... türden soruları yanıtlamak için de yine VTYS bir alan için veri tipi belirlememizi ister. Bir alan için hangi tip seçeneklerimizin olduğunu ilerleyen kısımlarda öğreneceğiz.
Zorlayıcı(Constraint): Herhangi bir alan için girilebilecek verileri kısıtlayıcı kurallara Zorlayıcılar denir. Kullanıcı, zorlayıcının istediği şekilde veri girmezse, VTYS hata verir. Böylelikle veritabanına kullanıcının keyfi değerler girmesi önlenmiş olur. Örneğin, kitap listemizde yer almayan bir kitabı ödünç vermeye kalktığımızda hata verecek bir kısıtlama tanımlayabiliriz.
İki ana grup zorlayıcı vardır; programlanabilir zorlayıcılar ve tanımlanabilir zorlayıcılar. İleride detaylandırılacaktır.
Anahtar(): Anahtar bir veya birden fazla alanın bir satır için niteleyici olarak girilmesi için tanımlanan özel bir çeşit zorlayıcıdır. Tekrarlamayacak bir anahtar alan tanımlandığında, Bu anahtar alana birincil anahtar alan denir. Primary , Unique , Foreign gibi türeleri vardır.
Veritabanı Tasarımı
İyi bir veritabanı tasarımı yapabilmek için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur. Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır.İyi bir veritabanı tasarımı yapabilmek için yeteneğinizi, bilginizi ve tecrübenizi kullanmanız gerekir. Bu iş için evrensel geçerliliği olan metotlar maalesef yoktur. Öncelikle, ilişkisel veritabanının tanımını çok iyi bilmek gerekir. Bununla ilgili olarak, 5 Normalizasyon kuralını okumanızda fayda vardır. Ancak 5N, tasarım aşamasında size yol göstermek yerine hangi şartlara uygun tasarım yapmanız gerektiğini anlatır.
Bazen, bu kurallardan vazgeçmek durumunda kalabilirsiniz ancak, veritabanında saklanacak verilerin hacmi arttıkça bu kuralların daha sıkı sağlanmasında fayda vardır.
1.Nesneleri Tanımlayın:
Herhangi bir proje önünüzde konduğunda öncelikle nesneleri tanımlayın. Nesne, çeşitli özellikleri bulunan bir varlıktır. Başlangıçta özellikleri ile ilgilenmeyeceğiz.
Örnek:
Birkaç örnek proje için nesneleri verecek olursak,
Kütüphane sistemi: Kitap, üyeler, türler, ödünç hareketleri
E-ticaret sistemi: Ürünler, müşteriler, siparişler,teslimat, fatura bilgileri,üreticiler,tedarikçiler,dağıtıcılar...
Futbol Ligi: Takımlar, sahalar, oyuncular, fikstür, hakemler, antrenörler
Okul Sistemi: Öğrenciler, öğretmenler, dersler, derslikler
Sözlük: kelimeler, anlamlar,diller
2.Her nesne için bir tablo oluşturun:
Her bir nesne için bir tablo oluşturun ve her bir tabloya içereceği veriyi en iyi anlatan bir isim verin. Tablo oluşturma işini, bir kağıt üstünde sembolik olarak gösterebilirsiniz veya doğrudan MS Access, SQL Server, MySQL,Oracle ...gibi kullanmakta olduğunuz VTYS üstünden de oluşturabilirsiniz. Ama tüm proje bitinceye kadar bu tablolar üstünde muhtemel değişiklikler olacaktır.
İPUCU:
Tablolar isim verirken mümkünse tekil isimler kullanın. Böyle yaparsanız hem daha anlaşılır bir tasarım yapmış olursunuz hem de daha sonra kodlama aşamasında karışıklığın önüne geçmiş olursunuz.
Örneğin içinde Kitap ile ilgili bilgiler bulunduracak tablonun adını Kitap koymak oldukça mantıklıdır.
3.Her bir tablo için bir anahtar alan seçin:
Veritabanındaki herhangi bir veriye erişmeden önce tabloya erişilir.Bir veritabanında en çok muhatap olunan nesne grubu genellikle tabloalrdır. Buraya kadar hangi tabloları oluşturacağımıza karar verdik. Her bir tablonun içinde hangi bilgileri saklayacağımızı kabaca biliyoruz. Bu aşamada, tabloda yer alacak her bir kaydı bir diğerinden ayırabilecek bir sütuna ihtiyaç duyarız. Örneğin bir kitabı seçmek istediğimizde, bu kitabın hangi kitap olacağını öyle bir anlatabilmeliyiz ki, başka hiçbir kitap ile karışmamalı. Bunu yapmanın tek yolu, bir alanı birincil anahtar alan olarak belirlemektir.
Anahtar alan seçerken, sizi kısıtlamadığı sürece, doğal alanlar seçmeye dikkat etmenizde fayda vardır. Örneğin araçlar ile ilgili bir tablo yaparken, plakalarını anahtar alan olarak belirleyebilirsiniz. Çünkü her bir plakadan bir tek araç trafiğe çıkabilir. Bu bizi kısıtlamaz. Öğrenci tablosu için, öğrenci numarası doğal bir anahtar alandır çünkü aynı okulda, aynı numaradan bir öğrencinin daha bulunması söz konusu değildir.
Kitap tablosu için ISBN numarasını anahtar alan olarak tanımlayabilirsiniz ama, elinizde aynı kitaptan iki adet olduğunda, ISBN numarası sizi kısıtlayacaktır. elinizde iki adet ‘Önümüzdeki Yol’ kitabı varsa, her iki kitabın da ISBN numarası aynıdır.Kitapdan biri eski biri yeni olabilir.Bu bir kargaşaya neden olabilir. Çünkü eski kitabı kime yeni kitabı kime verdiğinizin takibini ISBN numarası ile mümkün değildir. Ancak bir E-Ticaret sitesi tasarlarken, stoktaki tüm Kitap birbiri ile eşdeğer olacağından ya da öyle olduğu varsayıldığından ISBN numarası birincil anahtar alan olabilir. Bu durumda, adet diye bir niteliğin aynı tabloda yer alması gerekecektir.
4.Nesnelerin gerekli her bir özelliği için tabloya bir sütun ekleyin
Tablo adlarını tamamladıktan ve anahtar adlarını belirledikten sonra, tablolarınıza sıradan adını veren nesnenin her bir özelliği için bir alan(sütun) ekleyin.
İPUCU:
1.En başa birincil anahtar olarak belirlediğiniz alanı eklemek bir kural değildir ancak tablonuzun anlaşılırlığı ve göze hoş görünmesi açısından tercih etmenizin yararınıza olacak bir tekniktir.
2. Genellikle,yapay birincil anahtar alanlar tablo adı ile başlar ve sonunda ID vardır. ogenci tablosu için ogrenciID gibi.
Örneğin, kitap için:
Kitap no, ISBN no, kitap Adı, Yazarı, türü,Sayfa Sayısı, Özeti, fiyatı, baskı yılı...
Üye için: UyeNo, Adı, soyadı, e-mail adresi, ev telefonu, cep telefonu, iş telefonu....
Bu noktada, sizden istenen proje ile ilgili basılı formlar vs. varsa, bir göz atmanız hangi özelliklerin yer alması gerektiği konusunda karar vermenize yardımcı olacaktır.
5.Tekrarlayan nesne özellikleri için ek tablolar oluşturun
Aklınızda hep şu olmalı: veri tekrarı olacak mı? Veri tekrarı olacaksa bir yerlerde hata yapıyorsunuzdur. Elinizdeki tablonun en az bir tabloya daha ayrılması gerekiyor demektir.
Şunu da unutmayın, her projeye uyacak evrensel bir veritabanı tasarım tekniği yoktur. Yani her şey sizin belli kurallar etrafında ne kadar teferruatlı düşünebildiğinize bağlıdır.
Örneğimizde, her bir kitap için tür belirledik ama, bir kitap hem kişisel gelişim kategorisine hem de hikaye kategorisine girebilir. Ya da e-ticaret sisteminde bir ürünün birden fazla reyonda yer alması gerekli olabilir. Veya bir kitap birden fazla kişi tarafından yazılmış olabilir..
Bir kitap için birden fazla türü kaydedebilmeyi ele alalım:
Bu türden bir sorunu çözmek için ilk akla gelen şey, Kitap için, 2.Tür,3.Tür diye iki alan daha eklemek. Ama çoğu Kitap bir tek türdendir ve bu Kitap için 2 alan hep boş kalacaktır. Öte yandan, 4 türe birden giren bir kitap olduğunda 4.tür bilgisini nereye yazacağız? Aynı alana mı? Ya da dört adet bölüm mü açacağız? Bunlar, veritabanı tasarımının doğasına terstir.
2.Çözüm yolu ise, bir kitabı iki kere kaydedip, birincisini, ‘Kişisel Gelişim’ türü olarak; ikincisini de ‘Hikaye’ olarak girmek.. Ancak bu durumda da diğer bilgiler tekrar edecektir. Ya da bir süre sonra, kitap hakkında girilen bilgilerin yanlış olduğunu fark ettiniz.Hangi kaydı güncelleyeceksiniz? Ya birini düzeltip birini unutursanız... Sonuçta veri tekrarı ve veri bütünlüğünün bozulması söz konusudur. Bu da yine ilişkisel veritabanı tasarımının doğasına terstir.
Bu durumda, türler diye bir yeni tablo oluşturup, bir de kitap_turler diye 2. tablo yu oluşturduktan sonra bu türden bilgileri burada tutmak gerekecektir. Böylelikle, hiçbir türde yer almayan Kitapdan 10 ayrı türde yer alan Kitapa kadar bütün olasılıklar için bir çözüm geliştirmiş oluruz.
6.Anahtar Alana Bağlı Olmayan Alanları Belirleyin
İlişkisel veritabanında, tablodan herhangi bir tek kayda erişmek için mutlaka bir farklı özellik sağlanmalıdır ve bu özellik de anahtar alan tarafından sağlanır. Ancak bazen, anahtar alan ile aynı satırda yer aldığı halde, anahtar alan ile birebir ilişkisi olmayan bir alan yer alabilir. Bu türden alanları elimine edip ayrı tablolara ayırmak gerekir.
Örneğin, ödünç tablosunu ele alacak olursak, ödünç verdiğimiz her kitabı ödünç alanın adresini de bilmek istediğimizde, bunu ödünç tablosuna yazamayız. Çünkü ödünç tablosunun birincil anahtar alanı oduncNo’dur ve bu alan, ödünç verme işlemi ile ilgilidir. Oysa ödünç alanın adresi, ödünç alan kişinin kendisine bağlı bir özelliktir. Bu kişinin her aldığı kitap için adresini tekrar yamaya gerek yoktur. Aynı şekilde otomasyon içerisinde başka yerlerde de bu kişinin adres bilgilerine muhtemelen ihtiyaç duyulabilir çünkü adres, üyenin bir özelliğidir.
Ödünç verilen kitabın adresini bilmek istediğimizde, üyeler adında bir tablo daha açıp, burada herkesin adresini tutmak durumundayız demektir. Ödünç tablosunun ise, oduncAlan bilgisi olarak, Üyeler tablosunun birincil anahtar alanına bir bağlantı(yabancı anahtar) içermesi daha doğru olur.
7.Tablolar arasındaki ilişkileri tanımlayın.
Her biri bir nesneye dair özellikleri barındıran tabloların tümünü göz önüne alın ve birbirleri ile olan ilişkilerini tanımlamaya çalışın. Örneğin Kitapı ödünç veririz. Bu durumda, ödünç tablosu ile Kitap tablosu ilişkili olacaktır. Kitap üyelere ödünç verilir. Bu durumda, ödünç ile üyeler arasında da bir ilişki vardır. Türler ile Kitap arasında bir ilişki vardır, bir kitabın en az bir türe dahil olması gerekir.
Örnek:
Bizim projemizdeki nesneler(tablolar) arasında aşağıdaki ilişkiler yer almaktadır:
Kitap.kitapNo (1)---(N) odunc.kitapNo
Uyeler.uyeNo(1)---(N)odunc.uyeNo
Tur.turNo(1)---(N)Kitap_tur.turNo
Kitap.kitapNo(1)---(N)Kitap_tur.kitapNo
Yazar.yazarNo(1)---(N)kitap_yazar.yazarNo
İki tablo arasında ilişkiyi sağlayan alanların aynı adda olması zorunluluk değildir. Teorik olarak tabloları istediğiniz herhangi iki alanları üstünden birleştirebilirsiniz. Ancak, türler tablosundaki türNo ile üyeler tablosundaki uyeNo alanını birleştirdiğinizde hiçbir işinize yaramayacak anlamsız bir ilişki ortaya koymuş olursunuz.
Bu ilişkileri analiz ederken, her bir alanın hangi tablo için birincil anahtar alan, hangi tablo için yabancı anahtar olduğunu not etmeniz, daha sonra fiziksel olarak veritabanını tasarlarken işinizi kolaylaştıracaktır. Hatta bu bilgileri bir şema üstünde de gösterebilirsiniz. İşte bir çok VTYS tarafından sağlanan örnek bir şema: diyagram_1: Bu kısımda anlatılanlar doğrultusunda örnek projemizin SQL Server 2000 üstünde görünen diyagramı. İlişkili her iki tablo bir birincil alan ve bir yabancı anahtar alan üstünden birbirine bağlanır. Aynı diyagramın bir benzerini MS Access ile degerçekleştirebiliriz.
İPUCU:
Farklı tablolardaki iki alan aynı veriyi tutuyorsa, iki alana da aynı adı vermek, karışıklığa yol açabilir gibi görünse de aslında daha düzgün bir yapı ortaya çıkar. KitapNo alanı, Kitap tablosunda da ödünç tablosunda da kitap numarası tutmaktadır. Bu alanlardan birine kitapNo diğerine oduncGidenKitapNo demek, kafa karışıklığına neden olabilir. En Mantıklısı her ikisine de kitapNo demektir.
Veritabanı Yönetim Sistemleri
Veritabanı Yönetim Sistemleri, kullanıcılar adına düşük seviye veri işlemlerini yerine getirip, kullanıcıya standart bir komut arayüzü veya grafik arayüzü ile veri yönetimi fonksiyonları sağlayan uygulamalarıdır.Veri tabanı yönetim sistemi(VTYS), yeni bir veritabanı oluşturmak, veri tabanını düzenlemek, geliştirmek ve bakımını yapmak gibi çeşitli karmaşık işlemlerin gerçekleştirildiği birden fazla programdan oluşmuş bir yazılım sistemidir. Veri tabanı yönetim sistemi, kullanıcı ile veri tabanı arasında bir arabirim oluşturmaktadır ve veri tabanına her türlü erişimi sağlar.
Veri tabanı yönetim sistemi, veri tabanını tanımlama, veri tabanını oluşturma ve üzerinde işlem yapma yeteneği olan bir yazılım sistemidir. Veri tabanının tanımlanması: veri tabanını oluşturan verilerin tip ve uzunluklarının belirlenmesidir. Veri tabanını oluşturulması ise veri için yer belirlemesi ve saklama ortamına verilerin yüklenmesini ifade eder. Veri tabanı üzerinde işlem yapmak; belirli bir veri üzerinde sorgulama yapmak, meydana gelen değişiklikleri yansıtmak için veri tabanın güncellenmesi ve rapor üretilmedi gibi işleri temsil eder. Ayrıca veri tabanı yönetim sistemi, verinin geri çağrılmasını sağlar. Veri tabanına yeni kayıt eklemek, eskileri çağırmak ve gerekli düzeltmeleri yapmak yoluyla, verinin bakımını ve sürekliliğini gerçekleştirir, kayıtlara yeni veri eklemek ve yeni kayıtlar oluşturmakla, veri tabanını genişletir.
Bir veri tabanı yönetim sistemi yazılım, karışık ve kapsamlı bir yazılımdır. Kısaca şu işleri gerçekleştirir:
- Veri tabanını oluşturmak ve yönetmek
- Veri tabanına erişim yetkisi olan kullanıcılara erişim izni vermek
- Kullanıcı isteklerine uygun olarak veriye erişimi sağlamak
- Veri tabanında güncellemeler yapmak.
Veri tabanı yönetim sistemi bu işlerini bazı özel alt diller (Structured Query Language,SQL v.b) kullanarak gerçekleştirir. Veri tabanı yönetim sistemi SQL komutunu ve diğer işlevlerini, aşağıdaki adımları sırayla gerçekleştirerek yapar:
- Kullanıcı, veri tabanına erişimi olan bir yazılım içinde bu SQL komutunu yazar.
- Veri tabanı yönetim sistemi bu isteği alarak der ve analiz eder.
- Görünüm seviyeden kavramsal ve fiziksel seviyelere doğru denetleme yapar.
- Gerekli kayıtlan içeren disk dosyalarının yerini öğrenir.
- Gerekli olan kayıtları okumak için kontrolü işletim sistemine bırakır.
- İşletim sistemi gerekli veriyi disk dosyalarından okuyup veri tabanı yönetim sisteminin bufferlarına aktarır, kontrolü geri verir.
- Veritabanı yönetim sistemi bufferlarından verileri alarak oradan istenilen terminale gönderir.
Veri Tabanı Sistemi Kullanımının Avantajları
Veri tabanına duyulan ihtiyacın asıl nedeni merkezi kontroldür. Veri tabanı, veri tabanı yöneticisi tarafindan yönetilir ve sistem merkezi olarak veriler güncellenir. Veri tabanlarının avantajlarını kısaca şöyle sıralayabiliriz:
- Verilerin tekrarı azalır. Böylece verilerde meydana gelen karışıklıklar önlenmiş olup bellekten tasarruf edilir
- Yanlışlıkların giderilmesi. Tutarsız (hatalı) bilgilerin girişi engellenir. Dosya sisteminde bir değişildik olduğu zaman diğer bilgilerinde değiştirilmesi gerekiyordu
- Verinin paylaşımı sağlanır. Aynı veri tüm kolaylığıyla diğer kullanıcılar tarafindan da kullanılır
- Bilgilerin standartlaşması sağlanır. Belli standartlar varsa bu standartlara uyulması gerekir, ayrıca yeni standartlaşmalara doğru adımların atılması
Veri Tabanı Sistemlerinin Dezavantajları
Dosya sisteminden veritabanı sistemine geçmenin bir çok yararı olmakla beraber bazı dezavantajlarda beraber gelmektedir
- Veri tabanı sistemi iyi tasarlanmadığı taktirde, bazı bileşenler iyi bir şekilde oluşturulmamışsa sistem dosya sistemine göre çok daha kötü çalışabilir.
- Veri tabanı sisteminin kurulumu ve bakımı klasik dosya sistemine göre pahalı olabilir.
Verilerin tekrarı azalır. Böylece verilerde meydana gelen karışıklıklar önlenmiş olup bellekten tasarruf edilir,
Veri modeline göre veritabam yönetim sistemleri
Yapısal olarak bütün veri tabanları bir değildir. Veri tabanları verileri saklama ve onlara erişme bakımından farklı tiplere ayrılır.
Hiyerarşik Veri Tabanları
Bu veritabanı tipi, ana bilgisayar ortamlarında çalışan yazılımlar tarafından kullanılmaktadır. Bu türde en çok kullanılan yazılım, IBM tarafından çıkarılan IMS' dir. Uzun bir geçmişe sahip olmasına rağmen, PC ortamına uyarlanan hiyerarşik veri tabanları yoktur.
Hiyerarşik veri tabanları, bilgileri bir ağaç (tree) yapısında saklar. Kök (Root) olarak bir kayıt ve bu köke bağlı dal (Branch) kayıtlar bu tip veritabanının yapısını oluşturur. Yukarıda böyle bir veri tabanının yapısı gösterilmektedir.
Ağ Veri Tabanları
Hiyerarşik veri tabanlarının yetersiz kalmasından dolayı bilim adamlarının ortak çalışması sonucu ortay konulmuş bir veri tabanı türüdür
Ağ veri tabanları verileri ağaçların daha da gelişmiş hali olan graflar (ağacın kendiside özel bir graftır.) şeklinde saklarlar. Bu yapı en karışık yapılardan biridir.
İlişkisel Veri Tabanları
E.F. Codd Tarafından Geliştirilmiştir. Bu sistemde veriler tablo seklinde saklanır. Bu veri 'tabanı yönetim sisteminde veri alış verişi için özel işlemler kullanılır. Bu işlemlerde tablolar operandlar olarak kullanılır. Tablolar arasında ilişkiler belirtilir. Bu ilişkiler matematiksel bağıntılarla (ilişkilerle) temsil edilir. Günümüzde en çok tercih edilen ilişkisel veri tabanı ayrıca detaylı olarak anlatılacaktır.
Nesneye Yönelik Veri Tabanları
Günümüzde nesne kavramı her yerde kullanılmaya başladı. Pek çok kelime işlemci ve hesap tablosu programlarının alıştığımız görünümlerine artık bir de nesneler eklendi. Ancak bu gerçek anlamda bir nesneye yönelik yazılım demek değildir.
Yüzde yüz nesneye yönelik bir yazılımın tamamen nesneye temelli çalışması gerekir. Yazılımın mutlaka nesneye yönelik bir dilde yazılmış olması beklenir. Fakat Windows gibi işletim sistemi üzerinde çalışan yazılımlar bu özelliklere tümüyle sahip değiller. Sadece nesne kavramını kullanarak bazı ek özellikler sunar.
Nesneye yönelik veri tabanı da , C++ gibi nesneye dayalı bir dille (OOPL) yazılmış olan ve yine C++ gibi nesneye dayalı (OOPL) bir dille kullanılan veri tabanı anlamına geliyor. Günümüz teknolojisinde yüzde yüz nesneye yönelik bir veri tabanı yaygın olarak kullanıma sunulmuş değildir. Ancak nesneye yönelik veri tabanlarının bazı üstünlükleri olacağından söz ediliyor.
İlişkisel veri tabanları ile karşılaştırıldığında nesneye yönelik veri tabanlarının sahip olması gereken üstünlükler şunlardır:
- Nesneler, bir tabloda yer alan bir kayıttan çok daha karmaşık yapıya sahiplerdir ve daha esnek bir yapıda çok daha kullanışlı düzenlenebiliyorlar.
- Nesneye dayalı bir veri tabanında, yapısı gereği arama işlemleri çok hızlı yapılabilir. Özellikle büyük tablolarla uğraşırken ilişkisel veri tabanlarından çok daha hızlı sonuca ulaşırlar. Ancak çalışma mantığı tümüyle değişir
Veritabanı Normalizasyonu
Genel kabul görmüş 5 normalizasyon kuralı vardır. Bu kurallar, ilişkisel veritabanının tanımı ile birlikte ortaya konmuş kurallar olup burada özet olarak değinilmiştir.Aslında ilişkisel veri tabanı tasarımından ziyade bir tablo içerisinde yer alacak kaydın nelerden oluşma*sına karar vermeye yarayan normalizasyon kuralları başlı başına bir işlemdir. Sonuç itibari ile veritabanı tasarım aşamasında gerekli bir işlem olduğundan bu bölüme almayı uygun bulduk. Genel kabul görmüş 5 normalizasyon kuralı vardır. Burada her bir kuralı tam olarak anlatmak mümkün değildir. Ancak bu kurallar, ilişkisel veritabanının tanımı ile birlikte ortaya konmuştur. Özet olarak fikri vermesi açısından yer verilmiştir.
Yazıda anlatılan ilişkileri kavramak için, alttaki şemaya bir göz atabilirsiniz.
1. Normalizasyon Kuralı
Bir satırdaki bir alan yalnızca bir tek bilgi içerebilir. Örneğin kitap tablosunda, birden fazla yazarı olan kitap için yazar1, yazar2, yazar3 diye alanlar açsaydık, bu kurala uymamış olurduk. Böyle bir durumda, ayrıca yazarlar tablosu da oluşturarak kuralı çiğne*memiş oluruz
DİKKAT:Verileri virgül veya bir başka karakter ile ayırıp aynı alana girmek. Daha sonra program içerisinde split ile bu değerleri ayırmak. Ancak bu ilişkisel veritaba*nının doğasına terstir.
2. Normalizasyon Kuralı
Bir tablo için, anahtar olmayan her alan, birincil anahtar olarak tanımlı tüm alanlara bağlı olmak zorundadır. Mesela, Ödünç tablosunda KitapAdi diye bir alan eklese idik, bu sadece ödünç verilen kitap ile ilgili bir bilgi olacaktı ve oduncNo'na bağlı bir nitelik olmayacaktı. Bunu çözmek için, kitap adlarını ayrı bir tabloda tutarak sorunu çözdük.
Ya da anahtar alanın birden fazla alandan oluştuğu tablolarda, anahtar alanlardan sadece birine bağlı veriler, tabloda yer almamalı, ayrı bir tabloya taşınmalıdır.
Bunun tersi de geçerlidir. Yani iki ya da daha fazla tablonun birincil anahtarı aynı olamaz. Şayet böyle ise, bu iki tablo tek tabloya indirilmelidir.
3. Normalizasyon Kuralı
Bir tablo için, anahtarı olmayan bir alan, anahtarı olma*yan başka hiç bir alana bağlı olamaz. Örneğin, kitapları*mız için cilt tipi adında bir alan ekleyip burada da karton kapak için K, deri cilt için D, spiral cilt için S yazsaydık, bu kodlama, kitap tablosunun birincil anahtarı olan kitapNo alanına bağlı bir kodlama olmayacaktı. Çünkü bu kodlama bir başka anahtarı olmayan alana bağlıdır. Bunun sonucunda da veritabanımızda, karşılığı olmayan bir kodlama yer almış olacaktır. Cilt tipi bilgisini kodlu olarak tutan alan aslında cilt tipi açıklaması olan başka bir alana bağlıdır. Bu ilişki başka bir tabloda tutulmalıdır.
Bu durumda, ciltSekli adında bir tablo açmamız gerekir. Bu tablonun alanları da ciltTipKodu ve ciltSekli olmalıdır. Ancak bundan sonra, kitaplar tablosunda ciltTipi adında bir sütun açıp buraya da D,S,K gibi kodları yazabiliriz.
4. Normalizasyon Kuralı
Birincil anahtar alanlar ile anahtarı olmayan alanlar arasında, birden fazla bağımsız bire-çok ilişkisine izin verilmez. Örneğin, tablomuzda yer alan bir kitap hem hikaye kitabı hem de kişisel gelişim kitabı olabilir.(Bu durumda kitabın adı, kişisel gelişim hikayeleri olurdu her halde) Bu durumu Kitap tablosunda nasıl ifade edeceğiz?
4.Normalizasyon kuralını sağlamak için, her bağımsız bire çok ilişki için ayrı bir tablo oluşturmak gerekir.
Bu örnekte, türler diye bir tablo açmamız gerekiyor. Daha sonra kitapTurleri diye bir başka tablo daha açma*mız gerekiyor. ‘Kişisel Gelişim Hikayeleri' adlı kitap için, öncelikle kitap numarası, Hikaye bölümünün kodunun yer aldığı bir satır; ardından da yine kitap numarası, ardından da kişisel gelişim türünün kodunun aldığı yeni bir satır daha eklemek gerekir.
5. Normalizasyon Kuralı
Tekrarlamaları ortadan kaldırmak için her bir tabloyu mümkün olduğunca küçük parçalara bölmek gerekir. Aslında ilk 4 kural sonuçta bu işe yarar ancak, bu kurallar kapsamında olmayan tekrarlamalar da 5.nolu normali*zasyon kuralı ile giderilir.
Örneğin, kitaplarımız için bir edinme şekli bilgisi girilecek sütun eklemek isteyelim: Bu bölüme girilebile*cek bilgiler bellidir: Bağış veya satın alma.
Bu bilgileri başka bir tabloda tutabiliriz. Böylelikle, kullanıcıların bu alan gelişi güzel bilgiler girmesini engellemiş oluruz. Bu da sorgulama esnasında verile*rimiz arasında bir tutarlılık sağlar. Bu işlem sonucunda, tutarsızlıklara neden olabilecek ve sık tekrarlayan veriler başka bir tabloya taşınmış olur. Bu tablo için, veritabanı programlamada ‘look-up table' terimi kullanılır.
Ancak, veritabanı normalizasyon kuralları, bir ilişkisel veritabanının tasarlanma aşamalarını değil de ilişkisel veritabanında yer alacak kayıtların ilişkisel verita*banı ile uyumlu olup olmadığını denetlemeye yöneliktir.
Özetle ilişkisel bir veritabanı tasarımı şu dört öğeyi barındırmalıdır.
- Veri tekrarı yapılmamalıdır.
- Boş yer mümkün olduğunca az olmalıdır.
- Veri bütünlüğü sağlanmalıdır.
- Veriler, aralarında bir ilişki tanımlanmaya müsait olmalıdır.
ÖNSÖZ
SQL’i iyi bilenler için bile seyrek kullanılan komutlara bir yerlerden bakmak bazen bir zorunluluk arz edebilmektedir. İşte kitapta böyle bir ihtiyacı da karşılamak üzere SQL’i enine boyuna ele aldım. Özellikle yapılabilecek hataları, akla takılabilecek soru ve sorunları, program geliştirme esnasında önemli olduğunu gördüğüm teknikleri püf noktaları halinde bulabilirsiniz.Basit bir Web uygulamasından, devasa kuruluşların ağır verilerine kadar, günümüzde bir çok alanda veritabanı uygulamalarına ihtiyaç duyulmaktadır. Seride özellikle, Web projeleri gibi küçük çaplı işlerinde Veritabanı kullanmak zorunda kalan ama bu konuda başlangıç aşamasında bile bilgi sahibi olmayan bir çok kişiye ışık tutacak şekilde hazırlandı. Bundan dolayı da SQL ve veritabanının dışında, bir veritabanının Web’e açılması, XML, Web servisleri ile başka sitelere hizmet sunma gibi konulara da nasıl yapılacağı konusunda fikir vermesi açısından bir noktaya kadar değinildi.
Tüm bunların yanında, SQL’i iyi bilenler için bile seyrek kullanılan komutlara bir yerlerden bakmak bazen bir zorunluluk arz edebilmektedir. İşte kitapta böyle bir ihtiyacı da karşılamak üzere SQL’i enine boyuna ele aldım. Özellikle yapılabilecek hataları, akla takılabilecek soru ve sorunları, program geliştirme esnasında önemli olduğunu gördüğüm teknikleri püf noktaları halinde bulabilirsiniz.
Veritabanı uygulamalarının kurgulamak bir çok platforma hakim olmayı gerektirir. Ciddi bir Web uygulaması meydana getirebilmek için öncelikle, SQL ve veritabanı konusunda temel bilgilere sahip olmak gerekir. Çünkü, tüm sistem, veritabanı şeması üstüne inşa edilir. Bunun üstüne, HTML ve ASP-ASP.NET-PHP gibi bir Web programlama tekniğine hakim olmak gerekir. Bu da yetmez, veri erişim bileşenlerini de yakından tanıyıp etkin olarak kullanabilmek gerekir. Bunun üstüne, güncel bir uygualma geliştirmek için XML’i yakından tanımak gerekir. XML Web Servisleri, Web’de kurumlar arası haberleşme açısından oldukça ciddi gelişmeler önermekte.
Seriyi hazırlarken, bu durumları göz önüne aldık. İlk kitapçıkta, İlişkisel Veritabanı ve SQL konuları ele alındı. İkinci ünitede bir popüler orta ve büyük ölçekli Veritabanı Yönetim Sistemi olan Microsoft SQL Server 2000, T-SQL ile VTYS üstünde dinamik programcıkların geliştirilmesi, belli başlı dinamik olarak SQL scriptleri oluşturma konularına da orta düzeye kadar yer verildi. Böylelikle, veritabanı işine sıfırdan başlayacak bir kullanıcının profesyonelliğin kapısından içeriye adım atacak hale gelebileceği bir kurs kitabı ortaya çıktı.
Üçüncü kitapta, VTYS uzayının dışında masa üstü uygulamalar veya Web uygulamaları geliştirmek için , VTYS’ye erişim sağlayan MDACs(Microsoft Data Access Compunents) inceleniyor. Bu konuda, OLE-DB, ADO, ADO.NET nesneleri tanıtılıyor. Son kitapta ise XML ve Web Servisleri konuları inceleniyor.
Özellikle SQL’e adanan ilk kitapçıkta olmak üzere, kolay ama çok şey öğrenilmesi gerektiğinden, serinin tamamındaki konu anlatımları sık sık ve kolaydan zora doğru giden örneklerle desteklendi.
Veritabanının tarihi gibi , uygulama geliştirme açısından çok da etkili olmayan konuları maalesef bu seride bulamayacaksınız. Bu türden, işe yaramayacak kuru bilgiler için bakılabilecek en iyi yer, bu konuda eğitim veren yüksek öğretim kurumlarımızda okutulan ders Kitapı olabilir.
Günlük hayatta, veritabanına hakim olamamış programcı arkadaşların, bu açıklarını daha fazla (SQL harici) kod ile kapatmaya çalıştıklarına defalarca şahit oldum. Böyle bir seri sayesinde, neyin veritabanı programlama kapsamında düşünülmesi, neyin istemci programa bırakılması konularının okurlar tarafından daha iyi anlaşılacağı kanaatindeyim.
Bu kitap sayesinde SQL’i öğrenen programcıların bunu nerede nasıl kullanacaklarını geniş örneklerle hem de güncel teknolojiler ışığında öğrenebilecekleri bir seri ortaya çıktı. Emeği geçen herkese teşekkürü borç bilirim.
GİRİŞ
Veritabanı istemci programları yazmak, SQL dışında başka dillere de hakim olmayı gerektirir. VBScript’ten tutun da PHP, Perl, ASP, ASP.Net gibi teknikler ile Web sayfası geliştirmeye aşina olmak yahut C/C++/C#, Java, Visual Basic gibi diller ile basit uygulamaları yapabiliyor olmak gerekir.SQL(Es-kü-el okunur) insanların veritabanı sistemleri ile konuşmasını sağlayan popüler bir dildir. Bu dil sayesinde, bir veritabanından kayıtları alabilir, değiştirebilir ya da yeni kayıtlar ekleyebiliriz. SQL bir dildir; ancak bir programlama dili değildir. Program geliştirme aşamasında SQL’den faydalanılır, ancak tek başına bu iş için yeterli değildir.
Verilerin belli özelliklerine göre gruplanıp diske kaydedilmesi işine veritabanı yönetimi denir. Veritabanlarından en popüler olanı, ilişkisel veritabanıdır. İlişkisel veritabanın kökeni, 1970’li yıllarda IBM laboratuarlarında yapılan çalışmalarda atılmıştır. Takip eden çalışmalarla, 1983’te SQL(Structural Query Language) standartları tanımlanmış ve ardından 1987 yılında önce ISO ardından da ANSI tarafından bir standart olarak kabul edilmiştir. Daha sonra, bu standartlar çerçevesinde bir çok veritabanı yönetim sistemleri geliştirilmiştir. Bunlardan belli başlıları, Oracle, Sybase, MS SQL Server, Informix ve MySQL’dir. Bu VTYS’lerin işlerin daha kolay yürümesi için kendi adlarına standart dilden uzaklaşan tarafları vardır. Ancak genel işlemlerde kullanılan dil tümü için de ortaktır ve SQL’dir.
Veritabanı Yönetim Sistemleri
Veri Tabanı Yönetim Sistemleri, fiziksel hafızada bilgileri çeşitli özelliklerine göre gruplandırıp şekillendirdikten sonra saklarlar. Saklanan bu veriyi, verilen SQL komutları ile insanların istekleri çerçevesinde işler, yeniden şekillendirirler. Yani, Veritabanı Yönetim Sistemi’nin bir ucunda, bilgisayar disk(ler)inde saklanan düzenlenmiş veriler diğer ucunda ise bir kullanıcı (genellikle insan) vardır. Veritabanı Yönetim Sistemleri konusunda daha geniş bilgi bir sonraki kitapçıkta verilecektir.
şekil 1.1 : VTYS disk üstündeki verileri daha kolay işleyip yönetmemizi sağlar. SQL ile VTYS’ye veriler üstünde nasıl bir işlem yapması istendiği anlatılır. VTYS bunu bizim adımıza gerçekleştirir.
Veritabanı Yönetim sistemleri, her zaman bir kullanıcıya, yönetim ekranlarından bilgi vermek için kullanılmaz. Bazen kullanıcı konumunda doğrudan bir insan yerine bir program da olabilir. İşte bir veritabanı programcısı, veritabanını çekip çevirmenin yanında, VTYS’ye bağlanıp veri alış-verişi ve veri üstünde değişiklik yapan bu ‘istemci programları’ da yazabilen kişidir.
Veritabanı istemci programları yazmak, SQL dışında başka dillere de hakim olmayı gerektirir. VBScript’ten tutun da PHP, Perl, ASP, ASP.Net gibi teknikler ile Web sayfası geliştirmeye aşina olmak yahut C/C++/C#, Java, Visual Basic gibi diller ile basit uygulamaları yapabiliyor olmak gerekir.
Veritabanı Nerelerde Kullanılır?
.Veritabanı programlama ile bir çok proje geliştirilebilir. Bir İngilizce-Türkçe sözlük bu yolla kolayca yazılabilir. Bir kütüphane takip otomasyonu, bir Hastane otomasyonu, Muhasebe programları ve daha bir çok otomasyon programı temelde veritabanı projesidir.
Günlük hayatta Veritabanı programlama telefon şirketleri tarafından yoğun olarak kullanılır. Konuşmaların süreleri ay boyunca veritabanlarında saklanır ve ay sonu geldiğinde istemci programlar tarafından her bir abonenin telefon faturası teker teker hesaplanır. Günde on binlerce abonenin birbirini aradığı bir durumun içinden başka hangi yolla çıkılabilir ki?
1.İlişkisel Veritabanı Kavramı
Bu bölümde İlişkisel veritabanı hakkındaki temel terim ve teoremleri öğreneceğiz.İlişkisel veritabanı günümüzde en yaygın kullanılan ilişkisel veritabanı sistemlerinden biridir. En çok kullanılan ilişkisel Veritabanı Yönetim Sistemlerine Oracle, Ms SQL Server, Sybase, Informix, MySQL gibi Veritabanı yönetim sistemlerini örnek olarak verebiliriz. Bu bölümde verilen uygulamaları test etmek için MS Access de bir noktaya kadar kullanılabilir ancak verilen örneklerin tamamı MS Access tarafından desteklenemez. Bu nedenle, örneklerin büyük bir çoğunluğu MS Access MS SQL Server 2000 üstünde test edilmiştir. ONLINE olarak kitabın içerdiği uygulamaları test etmek için adresinden faydalanabilirsiniz.
Bilgisayar ortamında veri saklamak için kullanılan yapılardan en büyüğüne dosya dendiğini biliyorsunuzdur. İlişkisel veritabanları, veritabanı denilen büyük dosyalardan oluşur. Veritabanı, içerisinde tabloları barındıran bir dosyadır. Her bir tablo, belli yapıya uygun verileri saklamak üzere tasarlanır. Tablolar, satırlardan ve sütunlardan oluşur.
1.1.Günlük Hayatta ilişkisel Veritabanı
'Ödünçalınan' kitaplarımıza bir çare bulmak için veritabanı uygulaması geliştirmeye ne dersiniz? Bu belki kitabımızı geri getirmez ama, hiç olmazsa kitabımızı getirmeyenin kim olduğunu bilebiliriz...Bir çoğumuzun başına gelmiştir. Arkadaşlara, eşe dosta bir çok kitap, kaset, CD veririz ve gidiş o gidiş. Böyle bir sorun ile nasıl başa çıkarız? Bu konuda bir proje geliştirelim:
Öncelikle elimizdeki bütün Kitaplarımızın bir listesini yapalım. Ama bunu yaparken, her bir kitaba numara vermeyi ihmal etmeyelim. Çünkü elimizde aynı kitaptan iki adet olabilir. Bunlardan biri eski öteki de yeni kitap olabilir. Bu durumda bu iki kitaptan hangisini kime verdiğimizi nasıl ayırt edeceğiz?
Daha sonra Kitaplarımızı şu şekilde bir listeye yazalım:
Şekil1.2 En başa Kitap No’nu, sonra Kitap Adı’nı ardından ISBN numarası’nı sonra Sayfa Sayısı’nı, Özeti’ni yazalım ve listeyi dolduralım.
Listenin her bir sütununda sırasıyla şu bilgiler yer alsın:
Kitap No :Her bir kitaba verdiğimiz numara
Kitap Ad :Her bir kitabın adı
ISBN Numarası:Her bir kitabın arkasında yer alan Uluslararası Standart Kitap Numarası
Sayfa Sayısı :Kitabın kaç sayfa olduğu
Özeti :Kitabın bir özet açıklaması
Amacımız, kime hangi kitabı verdiğimizi bilmek. O halde Kitap listesine ek olarak şimdi bir de ödünç listesi yapalım:
Şekil:1.3 Bu listede de, ödünç no, kitap no, ödünç alan, verme tarihi, Verme süresi, Geri Geldi mi şeklinde bir liste daha yapalım.
Kütüphanemizden verdiğimiz her bir kitabı bu listeye işlersek, hangi kitabımızın kimde kaldığını, süresi sonunda getirilip getirilmediğini kolayca takip edebiliriz. Buradaki Geri geldi mi hanesine gelen her kitap için bir işaret koyabiliriz ya da imza attırabiliriz.
Bu projeyi, bilgisayar ortamında yapmak, kağıt üstünde yapmaktan çok daha kolay olacaktır. Bu projede yer alan listelerin karşılığı veritabanında tablolardır. Hayatta bir çok şeyi listelerle çözeriz. Her bir listeye karşılık, veritabanı mantığında bir tablo gelir.
1.2.Temel Kavramlar
Tamam bu uygulamayı geliştireceğiz ama geliştirme sürecine başlamadan önce kullanacağımız kelimeler ne anlama geliyor, ortak ağızdan konuşmak için bunları tanıyalım..Veriler fiziksel hafızada Veri Dosyaları(DataFiles) halinde saklanır. Dosya, bilgisayarların bilgileri birbirinden ayırarak saklamak için kullandığı temel bilgi depolama yapısıdır. Bir dosyada, bir çok veri yer alabilir.Bir kütüphane otomasyonunu ele alacak olursak, kitap ile ilgili bilgiler, ödünç verilenler, kütüphaneden kitap alma hakları olan üyeler, CD ve kasetler ile ilgili bilgiler aynı veri dosyasında ama farklı tablolar içerisinde yer alabilir.
1.2.A.Tablolar:
Bir tablo yani günlük hayattaki ‘liste’ kavramı, satırlardan ve sütunlardan oluşur. Mesela Kitap listemizi(yani Kitap tablomuzu) ele alacak olursak, her bir satırda bir kitaba ait bilgiler yer almaktadır.
Alan(Field), Yapılandırılmış bilginin her bir kısmını saklamak üzere yapılan tanımlamadır.
Şekil1.4:Alan,her bir sütun için tanımlayıcı bilgileri tutan yapıdır.
Her bir alan, yapılandırılmış verinin bir birimini tutmak üzere tanımlanır. Her bir sütunun adı ile birlikte diğer bilgilerinin(en fazla kaç birimlik bilgi bu hücrede saklanabilecek, ne tür bilgi saklanacak vs.) ortaya koyduğu tanıma alan denir.
Satır(Row): Bir tabloda yer alan her bir kayıt bir satıra karşılık gelir. Örneğin Kitap tablosunda her bir satırda farklı bir kitap hakkındaki bilgi yer almaktadır.
Sütun(Column): Tablolar dikey sütunların yan yana gelmesiyle meydana gelmiştir. İlk sütunda kitap numaraları, ikinci sütunda kitap isimleri, üçüncü sütunda, ISBN numaraları yer almaktadır.
Kayıt(Record): Yapılandırılmış verilerden her birine bir kayıt denir. Yani, alan bilgileri ile birlikte her bir satır bir kayıttır. Bir kitap bilgisini ele alacak olursak,
Şekil1.5:Kayıt, alan tanımlamaları ile birlikte bir satırda yer alan bilgilere denir.
Bir kayıttır. Kayıt ile satır arasındaki temel fark, kayıt ile kastedilen yapının sütunlar hakkındaki bilgileri de içermesidir.
Veri Tipi(Data Type): Bilgisayar, kayıtları yapısal olarak tutarken, onların yapıları hakkında fikir sahibi olabilmek için bazı özelliklerinin önceden tanımlanması gerekir. Örneğin, kitap numarası alanının mutlaka bir tam sayı olacağını, Kitap adının harf ya da rakamlardan oluşacağını anlatmamız gerekir. Bir veritabanı oluşturulurken, her bir alanın tipinin ne olacağı tanımlanmak zorundadır. Bir alana tamsayı mı yoksa harf mi; tarih mi yoksa ondalıklı bir sayı mı geleceği ancak tanımlandıktan sonra kayıt girilebilir.
Ayrıca, bir alanın uzunluğu ne kadar olacak, harf girilebiliyorsa en fazla kaç harf girilebilecek, rakam ise en fazla kaç basamaklı olabilir... türden soruları yanıtlamak için de yine VTYS bir alan için veri tipi belirlememizi ister. Bir alan için hangi tip seçeneklerimizin olduğunu ilerleyen kısımlarda öğreneceğiz.
Zorlayıcı(Constraint): Herhangi bir alan için girilebilecek verileri kısıtlayıcı kurallara Zorlayıcılar denir. Kullanıcı, zorlayıcının istediği şekilde veri girmezse, VTYS hata verir. Böylelikle veritabanına kullanıcının keyfi değerler girmesi önlenmiş olur. Örneğin, kitap listemizde yer almayan bir kitabı ödünç vermeye kalktığımızda hata verecek bir kısıtlama tanımlayabiliriz.
İki ana grup zorlayıcı vardır; programlanabilir zorlayıcılar ve tanımlanabilir zorlayıcılar. İleride detaylandırılacaktır.
Anahtar(): Anahtar bir veya birden fazla alanın bir satır için niteleyici olarak girilmesi için tanımlanan özel bir çeşit zorlayıcıdır. Tekrarlamayacak bir anahtar alan tanımlandığında, Bu anahtar alana birincil anahtar alan denir. Primary , Unique , Foreign gibi türeleri vardır.