tablo yapısı ve sql sorgusuna dair

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

tablo yapısı ve sql sorgusuna dair

Mesaj gönderen ikutluay »

merhaba

Mevcut bir program için sağlam raporlar yazmam ve ya yazılımı yeniden yapmam gerek.

lütfen sorulardan bildiğiniz varsa cevabı paylaşın

1. öğrencilerin değişik türlerden oluşan toplam tutarı ar. yemek servis eğitim gibi. ancak bunlar ücretler diye ayrı bir dosyada satırlar halinde öğrenci dosyasında kolon olsalar sorun yok ama ben bunları nasıl bir öğrencinin yanına sütün olarak çekerim. içiçe select geliyor aklıma ama çok yavaş olmazmı. kodla tek tek işlemeyide pek tercih etmiyorum. sizin öneriniz nedir

2.taksitli bir ödeme sistemi var. ödemeler çek senet kredi kartı mail order ve nakit yaılabiliyor. ayrıca bir çok indrim tipi de. nasıl bir ödeme planı ve data yapısı uygun olur.

3. hızlı bir içiçe select nasıl yazılmalı. bir çok örnek denedm baya yavaş geliyor sorgu sonuçları

Herkese iyi çalışmalar
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen mkysoft »

1. ve 2. sorunuzun cevabı indexlerdir, indexlerden yararlanın. Yine yavaşsa triggerlardan yararlanarak bu verileri kayıt girlme esnasında hesaplayarak başka bir tabloya yazılı halde bulundurun.
Ödemeleri ve indirimleri tek bir tabloda tutun, bu tablo üzerinde ayrıca işlemin tipi (nakit, kredi kardı, v.s. ) ve indirim tipini tutun (taksit vs.)
işlem tipi ve indirim tipi ayrıntılı bilgilerini farklı tablolarda tutun. böylece esneklik kazanmış olur.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen comfort »

Kendi tablolarınızı oluşturup dosyaları devamlı dinleyen ve güncellemeleri veritabanına yazan (istediğiniz yapıda) bir servis yazsanız olmuyormu. Bu devirde dosya mı kaldı yahuuu :shock: zahar ben yanlış anladım soruyu.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen ikutluay »

comfort yazdı:Kendi tablolarınızı oluşturup dosyaları devamlı dinleyen ve güncellemeleri veritabanına yazan (istediğiniz yapıda) bir servis yazsanız olmuyormu. Bu devirde dosya mı kaldı yahuuu :shock: zahar ben yanlış anladım soruyu.
ramı.

program bir arkadaşın yazdığı php mysql programı. vt yapısı sakat olunca raporlamada böyle sıkıntılar oluyor.
öğrenci tablosu
1k. ali veli

ücretler
1ucretno. öğrenci no (1k) ücret tipi (yemek) tutar (500)

burada sorgu çekerken iki tabloyu 1k keyi ile bağlamak mümkün. ama her öğrencinin 3-4 ayı ücrti olunca sorgu birden fazla satır döndürüyor. benim istediğimse detay tablo satır verilerini sorguda koln olarak nasıl bağlarım
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen comfort »

iç içe yazacağın her bir select için birer view oluşturup bunları joinle bağlarsan daha hızlı çalışır. Ama ben hayatımda böle bişey denemedim onu da söyliyim. Şuan aklıma geldi.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen conari »

ilk olarak kaç satır döndüğüne ve ücret tiplerine bak.sorgu1

daha sonra sorgu2 hazırlığı
sql ='select 1ucretno. öğrenci no '
for i=0 to sorgu1.recordcount //dönen satır kadar case blogunda sqle eklet.
sql= sql + 'case when ücret tipi= + sorgu1filed....value+ then tutar end' as +sorgu1filed....value
next
sql=sql + where öğrenci no = (1k)

gibi bir yapı ile sütunlara dönüştürebilirsiniz. Anladığım kadarı ile..
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen ikutluay »

conari yazdı:ilk olarak kaç satır döndüğüne ve ücret tiplerine bak.sorgu1

daha sonra sorgu2 hazırlığı
sql ='select 1ucretno. öğrenci no '
for i=0 to sorgu1.recordcount //dönen satır kadar case blogunda sqle eklet.
sql= sql + 'case when ücret tipi= + sorgu1filed....value+ then tutar end' as +sorgu1filed....value
next
sql=sql + where öğrenci no = (1k)

gibi bir yapı ile sütunlara dönüştürebilirsiniz. Anladığım kadarı ile..
merhaba

conari bu yontemi biliyorum. ama fahrettin bi bir ara öyle bir sql yazmıştıki beyin durduracak cinsten. belki direckt hiç pascala girmeden sql bacağında olur diye açtım threadi.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen emin_as »

Aşagıdaki sql benzeri birşeyle yapılabilir.
Mysql i fazla bilmiyorum, ama aşagıdaki kod firebirdde çalışır.
Eğer null lar sorun olursa, mysql e ait bir fonksiyonla null bilgileri 0 a eşitlemen gerekebilir.
Performans açısından çok sorun olacağını sanmıyorum, ne yaparsan yap, sonuçta sum ile toplam almak zorundasın.

Kod: Tümünü seç

select o.ogrencino, o.ogrenciadi, 
  (select sum (ucret) from harcama h where h.ogrencino = o.ogrencino and h.tur ='yemek') as yemek_ucreti,
   (select sum (ucret) from harcama h where h.ogrencino = o.ogrencino and h.tur ='egitim') as egitim_ucreti 
           from ogrenci o 
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen ikutluay »

emin_as yazdı:Aşagıdaki sql benzeri birşeyle yapılabilir.
Mysql i fazla bilmiyorum, ama aşagıdaki kod firebirdde çalışır.
Eğer null lar sorun olursa, mysql e ait bir fonksiyonla null bilgileri 0 a eşitlemen gerekebilir.
Performans açısından çok sorun olacağını sanmıyorum, ne yaparsan yap, sonuçta sum ile toplam almak zorundasın.

Kod: Tümünü seç

select o.ogrencino, o.ogrenciadi, 
  (select sum (ucret) from harcama h where h.ogrencino = o.ogrencino and h.tur ='yemek') as yemek_ucreti,
   (select sum (ucret) from harcama h where h.ogrencino = o.ogrencino and h.tur ='egitim') as egitim_ucreti 
           from ogrenci o 
evet bu yapıda bir sorgu işi görür. web tabanlı bir uygulama da hız sorunu olabilir ama sonuçta bundan iyisi şamda kayısı.

yalnız:

vt benim özel merakımdır. söz böyle bir veri yapısı tsarlaydınız nasıl bir yapı kullanırdınız.

ben gömebileceğim kadar veriyi öğrenci verisinde tutardım kendi fikrimce. malum verileri depolamak kadar raporlamada önemli ve raporlama o şekilde daha basit olurdu.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen aLonE CoDeR »

Selamlar.

1. MySQL'de sanırım 5 ve üzeri versiyonlarında SP desteği var, SP yazarak bunu çözebilirsin. Şöyle bir sonuç döndürmek çözüm olacaktır;

Öğrenci Adı-Soyadı
ikutluay
Ödemeler
Eğitim 500
Yemek 220
Toplam Ödeme : 720

Ahmet Sancaklı
.....

2. Taksitler, ödemeler ve indirimler farklı tabloda tutulmalı elbette doğru bir yapı kurulmuş. Sadece taksitlerde ödenip ödenmediğine dair bir işaret bulundurulabilir/bulundurulmalıdır.

3. İç içe hızlı sorgu nasıl yazılır şeklinde bir çıkış noktası hata olur. İç içe sorgu yazıyorsanız performanstan taviz vermeyi kabul ediyorsunuz demektir. Kayıt sayısı, tabloların yoğunluğu ve alan sayısına göre mutlaka performanstan taviz verilecektir ama hangi ölçüde olacağı söz konusu kriterlere göre değişkenlik arzeder.

Kolay gele.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen emin_as »

Olayı tam olarak anlamadım, sanırım ögrencilerin ödemelerini takip eden bir sistem. O nedenle şu tür tablolar yaratılabilir.

Okul - Tek kayıtlık tasarlanır, okulla ilgili temel bilgiler, telefon numalararı, adres vs.
Raporların altında okulun adı, yetkili müdür vs yazılması gerekbileceği için kullanıcılar bu tabloyu kullanarak gerekli bilgileri düzenleneyebilirler.

Sınıf - sinif_no - 4-C, sinif-ogretmeni-ahmet vs, sabahci - true gibi sinifla ilgili bilgler

Ogrenci - Ogrencino - 1511, sinif-no - 4-C, adi-soyadi - MEHMET VESAIRE, gerekli diğer bilgiler

Ödeme - ode_id - autoinc, ogrencino - 1511, odeme tarihi: 11-01-2010, odeme-turu: 1- yemek, 2 servis, 3-egitim, ödeme-periodu- 1- ocak, 2-şubat, 3-mart vs gibi

Bu şekilde ayrı tablolar yaratmak her zaman en iyisidir. Gereksiz tekrarlamalar olmaz. Bilgilerin eklenmesi ve düzenlenmesi son derece kolay olur.
Ödemeler mutlaka ayrı dosyada olmalıdır. Örneğin mart ayı için gerekli yemek ödemesi yapmayan ögrenciler aşagıdaki gibi sorgulanabilir.

select ogrencino, ogrenciadi from ogrenci where ogrencino not exists (select ogrencino from odeme where odemeturu=1 and odemeperiod = 3 )

Tabii veritabanı tasarlarken en önemli konu, ne tür raporların istendiği ve isteneceğidir. Genellikle müşteriler "bize sadece şu gerekli, başka birşeye gerek yok" derler. Ama program ortaya çıkınca "şu da olsa, bu da olsa" derler. O nedenle gereklilikleri tesbit edip, buna göre sorgulamaya cevap verecek tablo yapıları oluşturulmalıdır.

Herşeyi tek tabloda oluşturmak, ilk başta kolay görünse de programda ciddi hatalara neden olabilir. Ödemeler aylık girildiğini varsayıyoruz ve tüm ödemeler ögrenci dosyasında, ocaktan sonra şubat ayı ödemesini nasıl gireceksin, nasıl değiştireceksin.

Bu arada ben her ögrencinin aylık, farklı ödemeler yapabileceğini düşünerek yukarıdaki yapıyı oluşturdum. Eğer ödemeler sabitse, sadece ödemelerin aylık tutulduğu bir tablo oluşturulup, ögrencilerde içinde aylık ödedi, ödemedi alanları yaratılabilir.

Odeme-sabitleri : ay- 1,2,3..12 , yemek-tutari: 15,000, servis-tutari: 25,000, vs
Ogrenci-odeme : ogrencino -1411, ay- 3, yemek-odedi: true, servis-odedi: false vs (ogrencino ve aya göre primary key oluşturulmalıdır)

Benzer şekilde martta yemek parasini ödemeyen ögrenciler:

select o.ogrencino, o.ogrenciadi from ogrenci o, odeme h where h.ogrencino=o.ogrencino and h.ay = 3 and yemekodedi = false


İhtiyaçlara göre sistem kurulmalıdır. En önemli konu, veriyapısının raporlara cevap verebilmesidir. Örneğin ay bilgisi konulmazsa, aya göre hiçbir rapor alınamaz.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: tablo yapısı ve sql sorgusuna dair

Mesaj gönderen ikutluay »

evet değişik tablolar iyidir ama ben mesela kan gruplarını parametrik yapmak için bir tabloa yazar looktable ile seçtirip direkt stringi yazdırırım. kan grubunun en babası 10 harf tutsun. vatandaş 16 bylık guid kodu yazıyor. nerde bunun alan taarrufu diyorsun yani. işin yoksa birde join yap
Cevapla