Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.
Aktivasyon mailiniz gelmediyse buraya tıklayın.
06, 2008, 11:05:23 am
42719 Mesaj 8080 Konu Gönderen: 17913 Üye
Son üye: Teknikal
Turk-Php.Com Forum  |  Yardım Forumları  |  Veritabanı Yardım Forumu  |  Benim uygulama seklim ilkel mi acaba? « önceki sonraki »
Sayfa: [1] Yazdır
Yazan Konu: Benim uygulama seklim ilkel mi acaba?  (Okunma Sayısı 359 defa)
mrtblt
Yeni Kullanıcılar
*
Offline Offline

Mesaj Sayısı: 21


Üyelik Bilgileri
Benim uygulama seklim ilkel mi acaba?
« : 19, 2008, 12:12:36 pm »

Sitede millet foreign key, join falan gibi seylerden bahsediyor. Bunlari hic duymamis degilim tabiiki hatta join bir kac kez kullandim  laugh

Sonra acaba ben veritabanindan kayit cekerken sonuc elde ediyor olsam bile cok ilkel ve uzun yollarimi deniyorum dedim kendi kendime. Sanki veriyi cekmek icin cok fazla sorgu yapiyorum gibime geldi. Size benim yaklasimimi gosteren bir kod ornegi veriyorum asagida

Bu excele veri atan scriptin bir parcasi ve burada tabloda kullanmak uzere veri cekmem gereken dort tablonun herbiri icin ayri ayri sorgu yapiyorum

Incelerseniz sevinirim

Kod:
case'11': //Musteri bazinda toplam siparis adetleri(renk dagilimsiz)
echo"SIP NO\tTARIH\tMUSTERI\tKOD\tRENK\tSET ADEDI\tTOPLAM ADET\tBRIM FIYAT\tTUTAR\tVAT\tBRUT TOPLAM\t\n";
$sql = mysql_query("SELECT * FROM sip_header where id='$sid'");
$row = mysql_fetch_object($sql);

        $sql3 = mysql_query("SELECT *  FROM sip_lines where sipno_id='$row->id'");
while($row3 = mysql_fetch_object($sql3))
{
$sql2 = mysql_query("SELECT * from clients where id='$row->client_id'");
$row2 = mysql_fetch_object($sql2);
$sql4 = mysql_query("SELECT * from produse where id='$row3->code_id'");
$row4 = mysql_fetch_object($sql4);

echo"".$row->sip_no."\t".$row->sip_date."\t".$row2->cl_name."\t".$row4->cod."\t".$row3->color."\t".$row3->amount."\t".$row3->set_amount*$row3->amount."\t".str_replace(".",",",$row3->unit_price)."\t".str_replace(".",",",$row3->line_net)."\t".str_replace(".",",",$row3->line_vat)."\t".str_replace(".",",",$row3->line_grand)."\t\n";
}
break;
Logged
phparmy
phparmy
PHP Stajyeri
**
Offline Offline

Mesaj Sayısı: 371


Elektronik imzam.


Üyelik Bilgileri
Ynt: Benim uygulama seklim ilkel mi acaba?
« Yanıtla #1 : 20, 2008, 03:19:02 am »

Kod:
$sql3 = mysql_query("SELECT *  FROM sip_lines where sipno_id='$row->id'");
while($row3 = mysql_fetch_object($sql3))
{
$sql2 = mysql_query("SELECT * from clients where id='$row->client_id'");
$row2 = mysql_fetch_object($sql2);
$sql4 = mysql_query("SELECT * from produse where id='$row3->code_id'");
$row4 = mysql_fetch_object($sql4);

echo"".$row->sip_no."\t".$row->sip_date."\t".$row2->cl_name."\t".$row4->cod."\t".$row3->color."\t".$row3->amount."\t".$row3->set_amount*$row3->amount."\t".str_replace(".",",",$row3->unit_price)."\t".str_replace(".",",",$row3->line_net)."\t".str_replace(".",",",$row3->line_vat)."\t".str_replace(".",",",$row3->line_grand)."\t\n";
}


Örnek olarak verdiğin kodun burasına baktığımızda while döngüsü içinde sorgu kullanmışsın. Eğer veritabanında 100 kayıt varsa yaptığın yanlışı fark etmeyebillirsin. Ama veriler arttıkça sayfan yavaşlamak değil açılmayacak hatta sunucun kilitlenecekdir. 10000 Kayıtlı bir tablo için bu işlemi yaptığında Sunucunda çok fazla kaynak tüketmiş olacaksın. Ama işin bir de farklı yanı var bazen tablolarımız öyle oluyor ki gerçekten tablo birleştirme, JOIN yapamıyoruz illa yukarıdaki gibi bir durum ortaya çıkıyor. Bunun içinde veri tabanını yaparken doğru tasarlamak gerekiyor. Veri tabanı tasarımı aslında çok ciddi bir iştir. Tablolardaki alanları tablolar arasında ilişkileri kafamız göre değil de hesap kitap yaparak oluşturmak gerekiyor. Maalesef bizde çoğu proje baştan değil de proje yaparken planlandığı için veritabanımız da allak bullak oluyor. Tam programı yada siteyi yazıp bitirecekken adamın aklına yeni bir fikir geliyor illa bu versiyonda onu da isterim diye tutturuyor. Sonuç olarak biz programcılar al o zaman istediğin gibi olsun diyerek yukarıdaki örneğe benzer bir sorgu yapıp bırakıyoruz.
Logged
mrtblt
Yeni Kullanıcılar
*
Offline Offline

Mesaj Sayısı: 21


Üyelik Bilgileri
Ynt: Benim uygulama seklim ilkel mi acaba?
« Yanıtla #2 : 20, 2008, 03:30:43 pm »

Peki boyle bir sorguyu siz nasil yapardiniz?

Ote yandan where ile condition olusturdugumuz vakit gene mi veri tarafigi sanki tum verileri cekmis gibi yuksek mi oluyor

mesela
Kod:
$sql2 = mysql_query("SELECT * from clients where id='$row->client_id'");
$row2 = mysql_fetch_object($sql2)

Burada bir dongu yok. bu sorgulama gene tum kayitlari cekmis gibi serveri yorarmi

soyle soylieyim yukaridaki gibi yapmakla asagidaki  sekilde yapmanin ne farki var

Kod:
sorgu
while dongusu
{
if (deger) {sonuc}

}

cigudusel olarak baktigimda servere binen yuk bakimindan diyebilirimki ikinci cok daha agir

ama sizin yazdiklarinizdan sanki birinci sorgu ile ikinci sorgu arasinda pek bir fark yok gibi geldi!
Logged
phparmy
phparmy
PHP Stajyeri
**
Offline Offline

Mesaj Sayısı: 371


Elektronik imzam.


Üyelik Bilgileri
Ynt: Benim uygulama seklim ilkel mi acaba?
« Yanıtla #3 : 21, 2008, 01:51:34 am »

Anlatmak istediğim o değilidi. Tabi ki 100.000 kayıt da olsa siz
select * from haberler
deseniz bu sorgu normaldir. Bunda bir problem yok. Benim anlattığım while döngüsü içine sorgu koyduğunuz zaman yavaşlama olacağıydı. Yani mysql_query fonksiyonunu binlerce kez çalıştırarak sorgu yapmak çok fazla kaynak tüketir.
Logged
mrtblt
Yeni Kullanıcılar
*
Offline Offline

Mesaj Sayısı: 21


Üyelik Bilgileri
Ynt: Benim uygulama seklim ilkel mi acaba?
« Yanıtla #4 : 21, 2008, 04:51:02 am »

O zaman soyle bisey daha soracagim

Farzedelimki icinde 1 milyon kayit bulunan bir tablomuz olsun ve bu tabloda id alani primary key yani unique

Ve soyle bir sorgu yapalim

Kod:
$sql=mysql_query("Select * from tablo where id='2957' ");
$row=mysql_fetch_object($sql);
$id=$row->id;

Ayni sonucu almak icin su sekildede yapabiliriz

Kod:
$sql=mysql_query("Select * from tablo");
while($row=mysql_fetch_object($sql))
{
if ($row->id=2957)
    {
      $id=$row->id
    }
}

Ikis arasinda performans farki var gibi gorunuyor ama nedir bu fark ve bu farki ortaya koyan etken nedir?
Aslinda bazi seyleri ezbere yapiyoruz gibi ve 300-500 kayit icin bir sorun olmuyor ama bu 100 bin kayida ulastiginda yatali yaklasim eminim cok bas agritacak
Logged
GaziMarşı
PHP Stajyeri
**
Offline Offline

Mesaj Sayısı: 447


Üyelik Bilgileri
Ynt: Benim uygulama seklim ilkel mi acaba?
« Yanıtla #5 : 21, 2008, 05:45:20 am »

Birinci örneğinde 1 sorgu çalıştırılıyor. Ve 1 sonuç geri geliyor. İstediğin veriyi mysql sana veriyor.
İkinci örneğinde de 1 sorgu çalıştırılıyor geriye tablodaki tüm veriler geliyor. 1 kayıt yerine 1milyon kayıtı belleğe alıyorsun. Ve sen bu verilerin içinde tekrar arama yapıyorsun. Bu şekilde kullanınırsan dosyadan veri okumak gibi oluyor...
Logged

phparmy
phparmy
PHP Stajyeri
**
Offline Offline

Mesaj Sayısı: 371


Elektronik imzam.


Üyelik Bilgileri
Ynt: Benim uygulama seklim ilkel mi acaba?
« Yanıtla #6 : 21, 2008, 08:34:18 am »

Veritabanı sırf verileri tutmak için yapılmamıştır. İstendiğinde bu verilerin hızlı bir şekilde bulunmasıda düşünülmüştür. Bir çok veritabanı var bunlar arasındaki farklar genelde veriboyutu , hız , fonksiyonellik, güvenlik, taşınabilirlik gibi farklı kıstaslar ile ayrılırlar.

Ayrıca bir çok arama alqoritması var QuickSearc,BubleSearch gibi. MySQL için kendine özel bir arama algoritması yapmışlardır ve araken ona göre arıyordur.
Logged
Sayfa: [1] Yazdır 
« önceki sonraki »
Gitmek istediğiniz yer:  


Turk-Php.Com Forum | SMF Forum Software © 2005, Simple Machines LLC. All Rights Reserved.