Eveeet, geçen gün bir şeyler sormuştum. sağolsun arkadaşlar çok güzel cevaplar attı. ama neticede 2 gündür falan kafa yordugum için ve fazla da mesai ayıramadığım için tekrar tekrar yeni sorular sormam gerekecek bir süre :)

şimdi size 4 adet tablomdan bahsedeyim:

1. kitaplar tablosu.
buna ana tablo diyelim, çünkü tüm sorgular bunun üstünden yapılacak.

kitap-yazar-yayinevi-fiyat-sayfa-aciklama vs. diye giden bir tablo, 14-15 sütun vardı galiba.

2. yazarlar tablosu. basit bir tablo. id ve yazar var.

3. yayinevleri tablosu. yazarlar tablosuyla aynı mantıkta.

4. kitap_id tablosu. bu da basit bir tablo. id ve kitap isimleri yer alıyor.


1. tabloya dönelim. eskiden kitap sütununa kitapların adını, yazar sütununa yazarların adını falan girerdim. sonra duyurudan bir arkadaş, normalizasyon yapmamı ve kayıtları buna göre almamı tavsiye etti.

o yüzden 1. tablodaki kayıtlar şöyle:

kitap-yazar-yayinevi-fiyat-sayfa-aciklama
47 - 56 - 217 - 17.50 - 348 - helölölö

buradaki 47 değeri: kitap_id tablomdaki id'si 47 olan kitap ismini
56 değeri yazarlar tablosunda id'si 56 olan yazar ismini vs. temsil ediyor.

bunları doğru yaptım sanırım artık değil mi?

şimdi, bunları indexlemem gerekiyor.
en doğru şekilde nasıl indexleyebilirim? arama sadece kitap adı, yazar ve yayınevine göre yapılacak.

sonuçlar ekrana basıldığında:

kitap adı - yazar adı - yayınevi adı ve açıklama yer alacak ve fiyat.

hah, böyle bir durumda. indexleme nasıl yapılır? daha hızlı çalışmak için napılır ne edilir?

bir diğer merak ettiğim husus da. ben mevcut verilerime, yeni veriler eklediğimde, ki eklenecek, bu indexlere de otomatik olarak yansıyor değil mi? benim ek bir şey yapmama gerek kalmıyor?

 

oncelikle kitap_id tablosunun ne ise yaradigini anlamadim. zaten kitaplar tablosunda her kitabi id ile birlikte tutuyorsun. "kitap ismi" sutununu kitaplar tablosuna alip, kitap_id tablosunu da silmen gerekiyor. bir yayin evi birden fazla kitap yayinlayabilecegi icin veya bir yazar birden fazla kitap yazabilecegi icin bu tablolarda sikinti yok.

ilerde yapacagin sorgulara gore tablolarina index koyman mantikli bir davranis olur. eger indexledigin sutunlari kullanacak bir sorgun olmayacaksa gereksiz yere index koymak write performansini gereksiz yere dusurur cunku sen her veri insert edisinde o veriler indexlenir.

kitap adi, yazar adi, yayinev adi, aciklama sutunlarini bastirabilmen icin bu 3 tabloyu birbirine join etmen gerekir. eger join sorgusu yapacaksan ve tablonun kullandigi engine InnoDB ise, join edecegin child tabloda foreign key yaratirsan zaten otomatik olarak hizli erisim icin o sutunda bir index de yaratilmis olur. yani ornek sorgun soyle bir sey ise:

SELECT K.ID, Y.ISIM, YE.ISIM, K.ACIKLAMA FROM KITAPLAR AS K
INNER JOIN YAZARLAR AS Y ON Y.ID=K.YAZAR_ID
INNER JOIN YAYINEVLERI AS YE ON YE.ID=K.YAYINEVI_ID

K.ID, Y.ID, YE.ID sutunlari zaten primary key olduklari icin indexli durumdalar. bunlara ek olarak senin K.YAZAR_ID ve K.YAYINEVI_ID sutunlarinda foreign key yaratman gerekiyor. foreign key' in index yaratmak disinda asil kullanim amaci tablolar arasindaki veri butunlugunu saglamaktir. Ayrica eger tablonun kullandigi engine InnoDB degilse yarattigin foreign key bir ise yaramaz. Bu yuzden tablonun InnoDB kullandigina emin ol.

edit: foreign key yaratman sart degil tabii ki. join edecegin tablolarda indexleri manual olarak yaratip ondan sonra join edebilirsin ama dedigim gibi foreign key kullanmanin avantaji tablolar arasindaki veri butunlugunu saglamaktir. mesela yazarlar tablosunda 56 id' ye sahip bir yazar yok ama kitaplar tablosunda yazar_id 56 olan bir kitap var. bu istenmeyen bir durumdur ve foreign_key kulanirsan boyle bir durumun olusmasini onleyebilirsin.

sterimar
1

mobil görünümden çık