MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

PHP ve Veritabani Baglantilari - BOLUM 1 Yazar: Serkan Tarih: 01/03/02

Neredeyse butun kullanisli programlar veriyi saklamak ve yeri geldiginde de sakladiklari veriyi okumak ihtiyaci hissederler.Bundan onceki makale ve orneklerimizde, bunun bir cesidi olan text dosyalari ile calismayi ayrintili olarak aciklamistik.

Dosya sistemleri, tasarim,performans ve olculebilirlik kavramlari goz onunde bulunduruldugunda acikaca gorulmektedir ki bu is icin yaratilmamislardir...

Geriye kalan tek secenek verileri bu is icin tasarlanmis database sistemleri icine yerlsetirmektir.

Yazimizin bundan sonraki bolumunde size bu baglantilari nasil yapabilceginizi gostermeye calisacagiz.Simdi isterseniz bir ozet cikaralim ve konu basliklarini kisaca inceleyelim :

- Veritabanlari'nin avantajlari ve klasik dosya sistemi ile olan farkli yapilari.

- "Iliskilendirilmis Veritabani Sistemi" ve bu sistemin bazi kavramlari:Indeksleme,normallestirme(butun verileri bir tek tablo yerine, tablolara bolup saklamak ve bu islemin dusunce yapisi,teknik prensipleri.)

- Ucretsiz olarak dagitilan bir veritabani sistemi :MySQL...Nasil kurarim,nasil yonetirim?

- Bazi PHP fonksiyonlarinin gosterilmesi ve veritabanina baglanti...

- Anlatilan parcalari birlestirmek ve MySQL veritabaninda veri cekmek,degistirmek ve bazi yonetim fonksiyonlarinin tanitimi,anlatimi...

  Simdiye kadar hic karsilasmadiginiz cok ozel teknik detaylara deginecegiz.Goreceksiniz ki veritabani uygulamalari ve PHP ile bu veritabalarina arayuz olusturmak sanildigindan daha kolay ve gercekten de inanilmaz bir VERIMLILIK sagliyor :)

  Veritabanlari

  Bir programci olarak en onemli sorumlulugunuz, dogru "veri depolama modelini " kurmak olacaktir.Bu cumlenin daha Turkcesi,programlariniz veriyi nasil depolayacak ve istediginiz zaman da depodan nasil okuyacak?

  Veri depolama modeli genelde o uygulamanin karsilayacagi ihtiyaclar goz onunde bulundurularak hazirlanir.Cok kucuk miktarda veri saklayacaksaniz "text dosyalarini" kullanmaniz daha avantajlidir.Saklanacak veya islenecek veri miktari arttikca daha zel cozumler aramaniz gerekmektedir.Ornegin amazon.com gibi bir sitenin butun verileri bir text dosyasinda saklamasi sizce mumkunmudur? Siparis edilen bir kitabin elinize gecmesi bir yuzyil falan surebilirdi :)

  Neden? Cunku dosya sistemi verileri sirasiz(duzensiz) bir formatta saklar...

  Veritabani,basit olarak ifade etmek istersek, verinin organize bir sekilde saklandigi ve istendiginde uzerinde degisiklik veya erisime izin veren bir kolleksiyondur.

  Organize bir sekilde kelimesi ile anlatilan verilerin neredeyse devamli denecek kadar sirali ve istendiginde uzerinde degisiklik uygulanabilir olmasidir.

  Veritabani Yonetim Sistemi veya bilinen adiyla "Veritabani Motoru" (Ingilizcesi Database Management System veya DBMS'dir.) bir yazilim yardimiyla veritabani icindeki saklama,degistirme ekleme gibi islemlerin yapilmasina verilen isimdir.Biz bu ilk bolumde,veriatabani tasarimi olarak iki konu uzerinde yogunlasacagiz.Ilk olarak deginecegimiz konu veri modelleri ikincisi ise veritabani mimarisidir.

  Simdi ilk konumuza girelim ve veritabaninin performansini arttirmak icin dogru veri modelini nasil sececegimizi gorelim:

  Veri Modelleri

  En basit yol olarak, veritabanlari veriyi tablolar icine yerlestirerek saklarlar.Bu tablolar satir(rows) ve sutun (columns) lardan olusmaktadir.Burada bahsedilen her satir bir kayit(record),her sutun ise alan(field) olarak isimlendirilmektedir.(Bu isimlendirme pratikte tablolarin bu sekilde kullanilmasindan kaynaklanmaktadir.)

  Bu aciklamalarin isiginda gozunuzun onunde bir tablo canlandirin...Her satirda bir kayit ve yukardan asagiya dogru siralanmis sutunlar :)

  Simdi gercek dunyadan bir uygulama yapalim ve bir sorunun cozumune nasil yaklastigimizi gosterelim:

  Problem : Web sitemizin butun kulllanicilarini bir sekilde loglamak(kayit etmek) istiyoruz.Bunu yapmanin en kolay ve belkide en ilkel yolu bir tablo yaratip her kullaniciyi bu tablonun icerisine kayit etmektir.Kullanici bilgileri ve girdigi sayafaya ait butun bilgileri bir tek tabloda acacagimiz alanlarin icine yerlestirmek hic te zor bir sey degildir.

  Bu durumda olusturacagimiz tablo asagidaki gibi 5 alandan olusan bir tablo olsun.Hemen hemen istedigimiz butun ihtiyaclara cevap veriyor.Boylece her kullanicinin web sitesinde gezerken shangi sayfalara,hangi tarihte ugradiklarini gormus olacagiz.

  Kullanci Adi Gercek Adi Kullanici Ulkesi Sayfa Son Erisim

  serkan Serkan Ceylani USA /index.php 2000-01-23
  oktay Oktay Altunergil USA /hakkinda/index.php 2000-06-20
  tayfun Tayfun Ulu Turkiye /php/index.php 2000-02-05
  hikmet Hikmet Gumus Turkiye /aoe/index.php 2000-04-21
  Ozgur Ozgur Yildiz USA /ornek/index.php 2000-06-21

  Bu sekilde olusturdugum 5 sutunlu(alanli) tabloya,ornek olmasi acisinda 5 tanede kayit (satir) girdim.

  Normallestirme ve Iliskisel Veritabanlari

  Yukarida olusturdugum veritabani tablosuna yakindan bakmanizi istiyorum.Tablonun yapisindan dolayi her kullanici icin bir kayit acilmasi ve her seferinde bir satiri kullanmak zorunlulugu vardir.Bu sekilde ayni kisiye ait kayitlar bile tekraralanarak yazilacak ve veritabani gittikce daha verimsiz bir sekilde zor duruma girecektir.Herkes icin boyle bir islem yapmak gereksizdir...

  Bu sekilde yapilandirilan bir tablo ayni zamanda ileride cok daha fazla sorun yaratabilir."Serkan" isimli kullanicinin USA yerine Turkiyede yasamaya karar vermesi durumunda veya kullanici adini degistirmesi halinde ne yapilacak?

  Bu durumda tabloda yer alan ve bu kullaniciya ait her satir teker teker degistirilmek zorunda kalacaktir.Tablonun guncellenmesi bu durumda gunler veya haftalar surebilir.(amazon.com gibi bir sitede yonetici oldugunuzu dusunun.)

  Iste konu basligimiz olan "Normallestirme" islemi burada devreye girmektedir.Burada anlatilmak istenen,bu islemlerle veritabani icindeki tekrarlanan kayit sayisini azaltmak ve performansi bu sekilde arttirmaktir.

  "Normallestirme" islemi,verinin birkac tabloya bolunmesi islemidir.Bu sekilde ayni verinin tekrarlananmasi en aza indirilir...

  Ornek vermek gerekirse yukaridaki tabloyu,kullanici ve erisim bilgilerinin saklandigi iki farkli tabloya bolebiliriz...

  Kullanicilar Tablosu

  Kullanici Adi Gercek Adi Kullanici Ulkesi
  serkan Serkan Ceylani USA
  oktay Oktay Altunergil USA
  tayfun Tayfun Ulu Turkiye
  hikmet Hikmet Gumus Turkiye
  ozgur Ozgur Yildiz USA

  Erisim Tablosu

  Kullanici Adi Sayfa Son Erisim
  serkan /aoe/index.php 2000-01-23
  oktay /hakkinda/index.php 2000-06-20
  tayfun /php/index.php 2000-02-05
  hikmet /quake/index.php 2000-04-21
  Ozgur /ornek/tanisin.php 2000-06-21

  Bu sekilde ayri,bagimsiz tablolara bolmek "normalizasyon" isleminin en onemli kisimidir.Simdi bu islemin ikinci ve en onemli adimini inceleyelim.Boyle parcalara ayridigimiz tablolar icin en az bir tane unique alani secilmesi zorunludur.Bu alanin secilmesiyle tablo icerisinde ayni verinin tekrarlanmasi ve gereksiz alan kaybina son verilmis olacaktir.Tablo icerisindeki her kayidin farkli oldugunu garanti etmek icin primary key olusturulur.Bu alanda genelde her kayiti birbirinden ayirabilmek ve tanimlayabilmek icin tabloda ID'ler tutulur...

  ONEMLI : Her tablo icin yanliz ve yanliz bir tane primary key alani tanimlayabilirsiniz.

  Ornek vermek ve konuyu kafanizda netlestirmek icin tablomuz uzerinde yukarida anlatilanlari tablomuz uzerinde uygulayalim.

  Kullanicilar tablosu icin "Kullanici Adi" alanini primary key olarak belirleyelim.Bunun sebebi bu alanda yer alacak verilerin unique olmasi.Burada akliniza su soru gelebilir : "Gercek Adi" alani da unique veriler iceriyor onu neden primary key olarak secmedik?

  Hemen cevap verelim.Burada veritabani tasarimi yapilirken bazi kriterler gozonune alinmalidir.Bunlar ne olabilir?

  Mesela,"Gercek Adi" bolumndeki veri her zamnan degisebilir.Kisi evlenirse buyuk ihtimal soyadi degisecektir.Veya kisi bazi gereksinimlerden dolayi "Gercek Adi" alanini gizli tutmak isteyebilir vb.Bu durumda bu alana veri girilmeyecegi icin ilerde buyuk bir sorunla karsilasilabilir...

  Bu ornek icin gordugunuz gibi "kullanici adi" cok fazla degisecek gibi gorunmuyor.Bizim icin bu alani "primary key" olarak secip bununla tablodaki verileri istedigimizde bulacak gibi indekslemek ve biricik olmalarini saglamak mumkun...

  Yaptigimiz bu kadar zahmet bize ne kazandirdi?

  Simdi bu yatiklarimizin bize kazandirdiklarina kisaca deginelim.Cunku bir tabloyu iki farkli tablo haline getirdik ve bazi belirlemeleri yaptik (en azindan beynimizde karar verdik.)....

  Bu iki tabloyu ayirip onlarin bir alanini ("kullanici adi" alani gordugunuz gibi her iki tabloda da mevcut) ayni yapmakla veritabanini "iliskili" hale getirmis olduk.Bu su demek : Iliskili tablolardan alacagimiz verileri,kompleks sorgulari gerceklestirebilmek icin kullanabiliriz.Yanlizca kendi basina hazirlanmis bir tablodan,(iliskisiz tablodan) baska tablolarin verilerini kombine bir sekilde kullanmamiz imkansizdir...

  Ornek vermek istersek: "Micorosoft Age of Empires fanatigi kullanicimiz hangi ulkeden?" diye soruldugu zaman biz biliyoruzki bu kisi serkan ve bu kisi USA'de yasiyor.Gordugunuz gibi farkli iki tablodan istedigimiz sonuca ulasabildik...Iste tablolari iliskilendirmek bu amacla kullaniliyor.Veya ayni sekilde quake oyunu fanatigi hangi ulkeden dedigimiz zaman sonucumuz Turkiye olacak...

  aoe: Microsoft Age of Empires oyunu icin kullanilan kisaltmadir ve bendeniz o oyunun fanatigiyimdir...Isteyenler kapismak icin mail atabilir hehe :) serkan@turk-php.com

  http://www.turk-php.com/ornekler/doc/tablo_iliskileri.xls

  Kucuk bir excel tablosu hazirladim iliskileri gormek isterseniz diye.Bilgisayariniza indirip bakanilirsiniz...

  Kisaca,

  Normalizasyon isleminin 3 temel kurali vardir:

  1.Gereksiz veriyi tablolari ayirarak elimine ediniz.

  2.Her veri seti icin ayri tablolar olusturun.

  3.Her tablo icin unique bir alan belirleyip o alaninin primary key olarak kullanilmasini saglayin.

  Her turlu gorus ve onerinizi serkan@turk-php.com eposta adresine gonderebilirsiniz...

  Saglicakla Kalin,

  Serkan Hadi Ceylani
  serkan@turk-php.com

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>