PDA

Tam Sürümünü Görmek İçin : Veritabani tasarımı...


sinankaya
21/10/2002, 22:59
Selam arkadaşlar, bu soruyu php.org.tr de sordum 2 haftadır tık yok belki burada en azından bi yanıt alabilirim...

MYSQL 'de bir personel veritanı oluşturmak istiyorum. Bu veritabanında personel hakkında
genel bilgilerinin dışında maaş bilgileri olsun istiyorum.
Fakat maaş bilgilerinin aylık ve yıllık bazda veritabanında olması gerekiyor.(nedense)şöyleki:
Sadece personele ait maaşların tutulduğu tabloda olması gereken bilgiler şöyle:
PersonelID ARALIK-2001 OCAK 2002 MAAŞI ŞUBAT.. diye devam eder
------------- ----------- ------------------ ------------------
1 10000000 200000000 20000000000 gibi
2 100000000 100000000 100000000000

(Bu tabi veritabanının en basit hali düzenlenmemiş hali)
Burada sorun: her maaş donemi icin yeni bir sutun acılması.
Örneğin:1 nolu personelin ocak-2003 icin yeni bir sutun gerekiyor,sanırım buda kotu bir yontem.
Şu bilinen normalizasyon adımlarını uygulayarak sadece maaş tablosu oluşturmaya çalıştım.
Şoyle 3 tablo ortaya çıktı. Bunlar : Maaş(MaaşID,MAAŞ), MaaşDonemi(MaaşDonemID,MaaşDonemi)
ve son olarak da personel,maaş ve MaaşDonemi tabloları arasındaki ilişkileri duzenleyen
ilişki tablosu : iliski(iliskiID, PersID, DonemID, mID)
Buradaki sorun ise işin daha da karmaşık hale gelerek querylerin zorlaşması ve
hataya açık olması ve 10 yıl icinde oluşabilecek kayıt miktarlarından toplam olarak yaklaşık
28000 hucreyi dolduracak.
Başka bir yontemde ise
MAAŞ(PersNo,Yıl,Ocak,Şubat,Mart,Nisan,Mayıs,Hazira n,Temmuz,Ağustos,Eylül,Ekim,Kasım,Aralık)
kullanıyorum (tabi bu uydurmaca...) ancak 500 satırda 7000 hucrede olay bitiyor.(ornek DB için)
Başka başka bir yontemde ise (ki bu yukarıdaki nin satır-sutun yerdeğişmesi :
MAAŞ(PersNo,Donem,maaş) ile 6000 satır da toplam 18000 hucrede olay biter.
(Cok uzun yazdım galiba umarım anlarsınız arkadaşlar...)

Şimdi sorular...
1. Bir veritabanında hucre sayısı ne kadar onemlidir.
2. Satırlara girilecek bilgilerin sabit sutunlara yayılması ile elde
edilen hucre sayısındaki azalma degerli midir? (2. ve 3 yontem de oldugu gibi)
3. Yukarısı cok uzun ve biraz da karmaşık oldu siz bu veritabanı nı nasıl duzenlerdiniz ?

Yardımlarınız için teşekkurler.
:confused:


norda_krepusko
22/10/2002, 00:26
direk cevap veriyorum,
3- ben olsam,
tablo : personel
ID : Auto_Increment INT 10 PK
Isim : Varchar 10
Soyad :VarChar 10

tablo : ucret
ID : Auto_increment INT 10 PK
Maas : Int 10

tablo : Odemeler
ID : Auto_increment INT 10 PK
Pers_ID : Int(10)
Maas_ID : Int(10)
Zaman : TimeStamp

Boylece cok basit select cumleleri ile, kim hangi zamanda ne kadar maas almis gayet rahat gorebilirsin,

Mesela gecen sene ocak ayinda, tum kullanicilarin maasini gormek icin,

Select
Od.Maas_ID, Od.Pers_ID
From Odemeler Od
Where Zaman > '20010100000000' And Zaman < '20010200000000'

diyebilirsin. Tabii personel ismini falanda listelemek ve maaslari da gormek istersen, joinleri hemen ekleyerek

Select
Od.Maas_ID, Od.Pers_ID , P.Isim, P.Soyad, Uc.Maas
From Odemeler Od, Ucret Uc, Personel P
Where
( Zaman > '20010100000000' And Zaman < '20010200000000' ) And
Od.Maas_ID = Uc.ID
And
Od.Pers_ID = P.ID

falan gibi

Hataya cok da acik oldugunu zannetmiyorum. Zaten oldukca basit. asil karisik hal senin dedigin gibi, her ay icin bi kolon acinca ortaya cikacak, bu sefer oyle bi select query yazmaya calisacaksin ki bi suresonra, :) ben yazamam mesela, cok usenirim...

ee++
22/10/2002, 01:25
Selamlar,

Koyu renklilerin her birisi birer cizelge (tablo), alti cizililer ile anahtarlar. Referansları ve veri turlerini cikarabilirsiniz heralde:

PERSONEL(PerNo, PerAdi, PerSoyAdi);
AYLAR(AyNo, AyAdi);
PERSONELMAAS(PerNo, AyNo, Yıl, MaasMiktari);

Kolay gelsin.

fatihhood
22/10/2002, 15:18
Alelacele bir cevap...

Relation Tables!!!

;)