Birincil Anahtar
Her tablonun bir, ama sadece bir, Birincil Anahtarı olabilir. Access 2000, her tablonun birincil anahtarını otomatik olarak endeksler (ve bu sayede veritabanı daha hızlı çalışır). Tablonuzda siz bir alanı Birincil Anahtar olarak atamadıysanız, Access 2000 bir birincil anahtar alanı oluşturmak ister; bunu onayladığınızda bir otomatik sayı alanı açar; tablonuzda zaten birinci alanda otomatik sayı türü bir veri varsa, Access 2000 bu alanı birincil anahtar olarak atar. Bu sebeple, iyi bir tablo tasarımı ilerde kullanmayacak bile olsanız, birinci alanı otomatik sayı olarak belirlemeyi gerektirir.
Birincil anahtar, hemen hemen daima sadece bir alandan oluşur. Fakat Access 2000, ancak çok pahalı veritabanı Server programlarının yapabileceği bir imkana da sahiptir: veri-işlem işiniz birden fazla alandan oluşan Birincil anahtar kullanmanızı gerektiriyorsa, bunu yapabilirsiniz. Çok-alanlı Birincil Anahtar, ileri düzeyde veri-işlem ve sorgulama bilgisi gerektirir.
Her veri türü birincil anahtar olamaz: birincil anahtar olarak kullanamayacağınız veri türleri, Internet adres bağlantısı (köprü), OLE ve not türleridir. Buna göre, metin, sayı, tarih/saat, para birimi, Evet/Hayır, ve otomatik sayı alanları birincil anahtar olarak kullanılabilir. Tablolarınız, birincil anahtar alanına göre otomatik olarak sıralanır. (Eğer bir Evet/Hayır alanını birincil anahtar yapmaya kararlıysanız, tablonuzda en fazla iki kayıt olması gerekir. Neden?)
Birincil anahtarın tabaloda birinci alan olması gerekmez; herhangi bir alan birincil anahtar olabilir. Fakat kendinizi tabolalarınızda birincil anahtar arama zorluğundan kurtarmak için daima birinci alanı birincil anahtar yapacağınız veriye ayırmanız iyi bir alışkanlık olur.
Birincil Anahtar Tayininde Püf Noktası
“Tablomda hangi alanı birincil anahtar yapmalıyım?” sorusu kaçınılmaz olarak sorulacak sorudur. Bu sorunun bir cevabı olabilir: Benzersiz veri içeren alanlardan birini birincil anahtar yapın. Birincil anahtar seçiminde anahtar kelime, “benzersiz” kelimesidir! Seçeceğiniz alandaki veri, her kayıt için özgün olmalıdır; başka hiç bir kayıtta tekrar etmemelidir. Kişilerin adlarını, soyadlarını içeren alanlar özgün olamaz. Öğrenci numaraları, araç plaka numaraları da bir kaç yıl sonra tekrar başka öğrenciye veya araca verilebilir. Telefon numaraları bir ülke için özgün olabilir (her bölgenin kodu farklı olacağı ve aynı bölge kodunda benzer numara bulunmayacağı için), ama veritabanınızda örneğin bölge kodu aynı olan Istanbul ve New York kentlerindeki dostlarınızın telefon numaraları varsa, zor bir tesadüf bile olsa, aynı numara bulunabilir.
Birincil anahtar alanı belirlerken, tablonuzda özgün-benzersiz veri bulunan alan arayın. Bütün alanlarınızdaki verilerin tekrar etmesi ihtimali varsa, yeni bir alan açın ve içine otomatik sayı koyun.. Gerisini Access 2000 düşünsün!
Bir tabloda birincil anahtar alanı tayini son derece kolaydır. Tabaloyu tasarım görünümünde açın; birincil anahtar olarak atamak istediğiniz alanın adının bulunduğu kutuyu sağ-tıklayın ve açılacak menüde birinci madde olan Birincil Anahtar maddesini seçin. Bu alanın adının önündeki kutuda küçük bir anahtar simgesi belirecektir.
Birincil anahtarın veritabanı için önemini ortaya koyacak küçük bir deney yapalım ve sonra birincil anahtarın birincil görevi olan tablo ilişkilendirme konusuna dönelim.
Yukarıdaki alıştırmayı yaptıysanız Çocuklar tablosunu (veya herhangi bir alanı Birincil Anahtar olarak tayin edilmiş bir başka tabloyu) açın, ve yeni bir satırda birincil anahtar alanına mevcut değerlerden birini tekrar yazın. İşinizin bittiğini belirtmek üzere başka bir hücreyi tıklayın; Access 2000 hemen hata mesajı verecektir:
Birincil anahtar alanındaki verinin özgün olması gerekir; yoksa bu anahtar aslî görevini yapamaz.
Tablolar Arası İlişki
Tablolar arasında ilişki kurmak suretiyle, veritabanı dosyamızı düz veritabanı olmaktan kurtardığımızı söylemiştik. Tablolar arası ilişki, Access 2000’in daha hızlı sorgu icrası yapmasını sağlar; veri-işlem işlerimiz daha verimli olur. Bu sayede verilerimizi güncelleştirirken, bütün tabloları elden geçirmek ve hatta yeniden girmek zorunda kalmayız; sadece güncelleştirilmesi gereken tabloya ek veya bu tabloda değişiklik yaparız.
Bir firma düşünelim: en az 200 firmadan hammadde alıyor ve en az 500 bayie mamül madde veriyor. Bu firmaların adreslerinden, alınan hammadde ve verilen mamül maddelerin özelliklerine kadar, diyelim ki 2 bin sütun dolduran verilerimizi tek tabloda topladığımızı varsayalım. Böyle bir tabloda, aldığımız mallara ilişkin bilgi sütunları, sattığımız mallara ilişkin satırlarda boş kalırken, sattığımız mallara ilişkin bilgi sütunları aldığımız mallara ilişkin satırlarda boş bırakılmak zorundadır. Bu hem gereksiz yere şişkin bir veritabanı dosyasına yol açar, hem de veri girişinde sayısız hatalara sebep olur. A firmasından aldığımız yeni bir mala ait yeni bir kayıt girerken, firmanın adından adresine, faks numarasından posta koduna kadar bütün bilgileri yeni satıra tekrar yazmak zorunda kalırız. Bu, yeni yazım hatalarına davetiye çıkartmak demektir. Tekrar eden bu bilgilerin dosya boyutuna bindireceği yükü düşünün!
Oysa elimizde bir firmalar tablosu, bir de mallar tablosu bulunsa; her bir malın hangi firmadan alındığı veya hangi firmaya verildiğini gösteren alana, firmalar tablosunun birincil anahtarından bağ kursak, hem tekrar-tekrar veri girişinin yol açacağı insanî hatalardan korunmuş oluruz (bu bilgileri girecek operatörlere vereceğiniz ücreti de unutmayın!), hem de işlenmesi kolay nisbeten küçük veritabanı dosyasına sahip oluruz.
Verilerimizi tek tabloda toplamanın sakıncalarını anladık. Ve diyelim ki elimizde böyle, beş veya altı tabloya bölünmüş bir veritabanı var. Şimdi, son 3 ay içinde mal aldığımız firmaların bir dökümünü çıkartmak istiyoruz. Beş-altı ayrı tabloyu mu kağıda dökeceğiz? Bu ayrı ayrı tablolara bölünmüş bilgileri nasıl birleştireceğiz? Başka bir deyişle, ayrı tablolara böldüğümüz verileri işare yarar, anlamlı diziler haline getirmek için nasıl birleştirebiliriz?
Bunu, tabloları herbirinin diğeri için anlamlı tek özgün alanından, yani Birincil Anahtarlarından birleştirerek yapabiliriz. Veritabanınızı bu birden fazla tabloya bölerek ve herbirine özgün birincil anahtar alanları koyarak tasarlasanız bile, aynı veritabanı içinde yer alıyorlar diye tablolarınız kendiliklerinden ilişki kurmazlar. Bunu bizim sağlamamız gerekir. Kendi tablolarımızda kendi ilişkilerimizi oluşturmadan önce, Access 2000’nin bunu nasıl sağladığını görmek, ilişki konusunda bize daha iyi fikir verecektir. Bunun için Access 2000’i çalıştırın; Yeni veritabanı oluşturmak üzere açılan pencerede Veritabanları sekmesini seçin ve Stok Yönetimi şablonunu işaretleyin. Yeni boş stok yönetimi veritabanınız oluşturulduğunda, eğer Access penceresi içinde küçültülmüş durumda ise veritabanı penceresini büyütün; Switchboard adı verilen veritabanını kullanmanız için oluşturulan grafik arayüzü kapatın.
Stok Yönetimi1 adlı yeni stok yönetimi veritabanınızın nesnelerinden Tablolar’ı seçtiğinizde, yedi adet aslî tablo oluşturulduğunu göreceksiniz: Ürünler, stok hareketleri, kategoriler, çalışanlar, sipariş formları, üreticiler ve nakliye yöntemleri. Stok yönetimi konusu ile hiç ilginiz yoksa bile, sadece ilişki konusunu kavramak için, bu tabloların bir firmanın elindeki stokları takip için gerekli ve yeterli olduğunu varsayalım.
Şimdi, Araçlar menüsünden İlişkiler maddesini seçin. Karşınıza şuna benzeyen bir pencere açılacaktır:
Açılan penceredeki kutular arasındaki çizgiler buradaki görüntüye benzemiyorsa, kutuları Mouse işaretçisiyle başlıklarından tutarak sürükleyebilir ve konumlarını buradakine benzer şekle getirebilirsiniz. Bu pencerede, kutuların başlığının tablo adlarını içerdiğine dikkat edin. Kutuların içindeki maddeler ise tablolardaki alanların adlarıdır. Her tablonun kutusunda bir alan adının koyu yazıldığını görüyor musunuz? Bu, o tablonun birincil anahtarı olan alandır. Bazı alanlardan çıkan çizgilerin diğer bir kutudaki alana bağlandığını görüyorsunuz. Dikkat ederseniz, aralarında çizgi bulunan alan adlarının aynı olduğunu da göreceksiniz.
Bu çizgilere ilişki denir; tabloların birbirleri ile hangi alanlarından ilişkide olduklarını gösterir. Şemaya veya Access İlişkiler Penceresi’ne tekrar bakarsanız, ilişki çizgilerinin bazılarının sol ucunda “1,” sağ ucunda sonsuz işaretinin bulunduğunu, bazı ilişkilerde işaretlerin yer değiştirdiğini ve diğerlerinde ise çizgilerin işaretsiz olduğunu göreceksiniz. Bu işaretler kurulan bağın niteliğini gösterir; bağın niteliği ise daha sonra iki tablo arasında yapılabilecek birleştirmede hangi kayıtların hangi kayıtlarla birleştirileceği veya Access’in deyimiyle eşleştirileceğini tayin eder. Bu tanımla biraz şifreli görünüyorsa da Access’te kurabileceğimiz ilişkilerin niteliklerini ele alınca manzara aydınlığa çıkacaktır. Tablolarınızın arasında üç tür ilişki olabilir:
Bire bir ilişki: İlişkilendirdiğiniz iki tablodan birincisi ile ikincisi arasında sadece bir kayıt eşleşebilir. Bu tür ilişkilendirmeyi tabalolarımızda sık kullanmadığımızı göreceksiniz; çünkü genellikle böyle tek gerçekli tablo yapmayız.
Bir-çok ilişkisi: Birbirine bağladığımız iki tablodan birindeki bir kayıt diğer tabloda birden fazla kayıtla eşleşebilir. İkinci bölümdeki örneğimizi hatırlarsanız: bir ailenin birden fazla çocuğu olabilir; fakat her çocuğun sadece bir ailesi olabilir. Dostlarnımızın çocuklarıyla birlikte bir tablosunu edinmek istersek, üç çocuklu dostlarımızın adı yeni tabloya üç ayrı satırda yazılacak, iki çocuklu dostlarımızın adları iki, tek çocuklu dostlarımızın adları ise bir kere girecektir. Neden? Çünkü aile bağı (Aile Sıra No alanı), Çocuklar tablosunda çok kayda işaret ediyor.
Çok-çok ilişkisi: İlişkilendirdiğimiz tablolardan birincisinde birden fazla alan, ikincisinde birden fazla kayda (ve tabiî ikincisindeki birden fazla alan birinci tablodaki birden fazla kayda) işaret ediyorsa, bu kez tablolar arasında çok-çok ilişkisi var demektir. Örnek tablomuzda böyle bir durum yok, ama bir sipariş veritabanı düşünün: her bir sipariş emrinde birden fazla mal sipariş ediliyor olabilir; mal tablosunda ise her bir mal birden fazla sipariş tablosunda görünüyor olabilir. Böyle bir ilişkinin sonucu ortaya çıkacak üçüncü tabloda hem hem her bir sipariş, hem de her bir mal birden fazla satırda görünecektir.
Şimdi bu bilgilerin ışığında biraz önce oluşturduğunuz Stok Yönetimi veritabanının ilişkiler penceresine bakalım. Şimdi bu veritabanındaki dosyaları kullanarak, firmamızın verdiği siparişlerle ilgili ve siparişi veren personele göre sipariş miktarlarını gösteren yeni bir tablo yapabilir miyiz? Yapabiliriz. Siparişi veren Personel, hangi tabloda hangi alandaki bilgi ile bulunacak? Çalışanlar tablosundaki ÇalışanNo alanındaki veri ile. Peki, bu alandaki kayıtlar, hangi tablodaki hangi alanda bulunan kayıtlarla eşleştirilecek? Sipariş formları tablosundaki ÇalışanNo alanındaki kayıtla. Yani Çalışanlar tablosundaki ÇalışanNo alanındaki veri Ahmet Çalışkan arkadaşımıza ait 812 ise ve bu değer, Sipariş formları tablosundaki kayıtlarda ÇalışanNo alanındaki değerlerle eşleşiyorsa, bu kayıt yeni tablomuza alınacak; sonra sırasıyla diğer değerler taranacak, eşleşenler yeni tabloya dahil edilecektir. (“Yeni tablo nerede ve nasıl oluşacak?” sorusunu şimdilik sormayın; bunu Sorgu ile yapacağız; ve daha sonra ele alacağız.)
Çalışanlar tablosundaki ÇalışanNo alanında Mehmet Tembeloğlu arkadaşızı belirten 813 şeklindeki veri, Sipariş formları tablosundaki kayıtlarda ÇalışanNo alanındaki hiç bir veri ile eşleşmiyorsa ne olacak? Yeni tabloda 813 şeklindeki ÇalışanNo’yu içeren bir kayıt olmayacaktır. Ve muhtemelen Mehmet Tembeloğlu, neden hiç sipariş vermediğini izah etmek zorunda kalacaktır!
Tablolarımız arasında ilişki oluşturma işini kendimiz yapmak istersek, yine biraz önce açtığımız Araçlar menüsünden İlişkiler maddesini geçerek açtığımız pencereyi açmamız gerekir. İkinci bölümdeki Adres Defteri alıştırmasını yaptıysanız, şimdi bu veritabanı dosyasını açabilirsiniz. Bu alıştırmayı yapmadı iseniz, şimdi ikinci bölüme dönüp bu dosyayı oluşturabilirsiniz! Veritabanı açıldığında veya tabloları oluşturma işini bitirdiğinizde Araçlar menüsünden İlişkiler maddesini seçin. Karşınıza şuna benzeyen bir görünüm gelecektir:
Biz kurmadığımız halde iki tablomuz arasındaki bu ilişki, Çocuklar tablosunu oluştururken, Aile Sıra No alanının doldurulması için Aile tablosunun aynı adlı alanına girilmiş kayıtlara bakılmasını istemiş olmamızdan kaynaklanıyor. Burada gördüğünüz çizgiyi ortasından sağ tıklayın ve açılan menüden Sil maddesini seçin; Access silme işlemini onaylattırmak istediğinde Evet’i tıklayın. Şimdi ilişki oluşturmaya sıfırdan başlayabiliriz.
Önce bir kere daha kurmak istediğimiz ilişkinin amacını tekrar edelim: yeni adres defterimizi oluşturduğumuz sırada öyle bir an olabilir ki, dostlarımızın çocuklarını gösteren, veya çocukların ailelerine göre sıralandığı bir liste yapmak isteyebiliriz. Böyle bir yeni tablo oluşturmaya kalktığımızda, Access’in hangi çocuğun hangi aileye ait olduğunu bilmesi gerekir. Bunu iki tabloyu ilişkilendirerek veya başka bir ifadeyle Access’e, hangi çocuğun hangi aileye ait olduğunu nasıl belirleyeceğini söyleyerek yapabiliriz. Access’e şunu söylemek zorundayız: Çocuklar tablosundaki kayıtlarla Aile tablosundaki kayıtları birleştirirken birinci tablonun Aile Sıra No alanındaki değerin Çocuk tablosundaki kaydın aynı isimli alanındaki değerle eşleşip eşleşmediğine dikkat et; eğer bu veriler aynı ise o zaman bu çocuk o aileye ait demektir; iki kaydı birleştirebilirsin.
Bunu söylemenin yolu ise çok kolay: İlişkiler tablosuna ait kutudaki AileSıraNo satırını Mouse işaretçisiyle tutup, götürüp Çocuk tablosundaki AileSıraNo satırının üzerine bırakın. (İlişkiler penceresini açtığınızda tablolarına ilişkin kutuları göremiyorsanız, İlişkiler menüsünden Tablo Göster maddesini; açılacak kutuda kayıtları arasında ilişki kuracağınız, dolayısıyla görüntülenmesini istediğiniz tabloları seçerek Ekle düğmesini tıklayın.)
Sürükleme sırasında Mouse işaretçisinin dikdörtgen ilişki simgesine dönüştüğünü göreceksiniz (işaretli). Mouse işaretçisi bırakacağınız yere dikkat etmelisiniz: Access 2000, dörtgeni hangi alan adı üzerinde bırakırsanız, o alanı ilişkilendirir. Mouse’un sol düğmesini bıraktığınız anda İlişkileri Düzenle diyalog kutusu açılacaktır.
Burada solda ilişkinin başladığı tablo ve alan ile ilişkinin kurulduğu tablo ve alan gösterilmektedir. Her ikisinin de seçme düğmelerini tıklayarak başka alanlar seçebilirsiniz. Bu listenin altında, “Bilgi tutarlılığına zorla” seçeneğine işaret koyarsanız, Access 2000 size iki seçenek daha verir: ilişkinin sol tarafındaki alan güncelleştirilirse, bu ilişkiye dahil tabloların da güncelleştirilmesi, alan silinecek olursa diğer tablodaki kayıtların da silinmesini sağlayabilirsiniz. (Güncelleştirme kullanışlı bir seçenek olmakla birlikte, silme işlemini otomatik hale getirmek, istemeden bilgi kaybına uğramanıza yol açabilir.)
İlişkileri Düzenle kutusunun sağ tarafındaki düğmelerden Birleştirme Türü düğmesini tıklaksanız, ilişkinin yönü ve türünü belirleme imkanını veren, üç seçenekli Birleştirme Özellikleri kutusunu açmış olursunuz. Burada yapacağınız tercihler, hangi tablodan hangi kaydın alınacağını belirler. (Sırasıyla her üç seçeneği seçtiğinizde, ilişki çizgisinin ucundaki okların yönünün nasıl değiştiğine dikkat edin.)
Kutuları sarısayla kapattığınızda, iki tabloyu ilişkilendirmiş, başka bir deyişle Access 2000’i bu tabloları kullanarak yapacağınız veri-işleme hazırlamış olursunuz. Bir veritabanındaki tablolar arasında ilişkileri oluştuğunuz zaman Access 2000, hiç bir yapmayacak, söz gelimi ortaya yeni bir tablo veya rapor çıkartmayacaktır. Bunu yapması için gerekli talimatı daha sonra vereceğiz. Şimdilik sadece Access’e, bu talimatı yerine getirmesi için gerekli bilgiyi vermiş, veritabanımızın tabloları arasındaki bağları tanıtmış olduk.
SÖZ VERİYORUM... USLU DURUCAM...