Merhaba arkadaşlar,
bir sitede kullanılmak üzere veritabanı yapmam gerekiyor, karşılaştığım zorluk şu şekilde ;
Sitede bilgisi tutulmak istenen şeyler çok değişik gruplardan.Örnek vermek gerekirse sitenin motor bölümüne üye olacaklardan ana adı baba adı 1.motor modeli,varsa 2.motor modeli ve yaktıkları yakıt tipi ve aylık yaktıkları yakıt ve kat ettikleri km.
Sitenin aile bölümüne aile fertleri , ana adı , baba adı, kardeş 1 ,kardeş2, kardeş n.... ve aile fertleriyle görüşme sıklıkları .Mesela kolon olarak aile fertlerinin adı ünvanı her satırdada 1 veya 0 olrak o gün görüşülmüş ise 1 değilse 0.
Bilgisayar kısımı ; kullanıcı adı,soyadı , pc 1 ,pc 2 günlük çalıştırma miktarı online olma gezinme süreleri...
Şimdi günün sonunda benim istediğim adı ahmet olan 2 motoru olup 3 kardeşi olan 3. kardeşiyle haftada en az 3 kez görüşen ve günde 4 saat pc başında oturan ahmeti bulmak istiyorum..
Sorum şu bunu her kullanıcıya tek tek db ayırarak yapsam örneğini verdiğim sorguyu sql ile yaparken çok zorluk çkerim gibi geliyor. Her kullanıcıyı db ye eklesem her kullanıcının kendine özgü özelliğini bir kolona koysam çok sayıda kolon olacağı gibi üstüne üstlük bide hiç motoru yada motor ile alakalı verisi olmayan bir pc kullanıcısına bir sürü boş kutucuk ayırmış olucam .....
Bu gibi bir sistemi nasıl kurarım?
Merhaba
Hepsini tek bir db de tutun ancak farklı bir field daha ekleyin eklediğiniz field da ,aramanızda size gerekli olan fieldlardan örneğin 3 er karakterlik alarak bu fieldı oluşturun sonra da adı soyadı ve bu yeni oluşturduğunuz fieldıda sıralattırarak yeni bir table yapın.
Bu şekilde çok karmşık olmayan sorgulamadada çok kafa karıştırmayan bir tablonuz olur.
tekbir veritabanında ilişkili tablolar kullanılarak yapılır. ilişkisel veritabanı veri tekrarından yada boş kayıttan kurtulmak için hazırlanır. Bir örnek üzerinden gidecek olursak
Baba adı ve çok isimlerinin tutulacağı bir veritabanını iki şekilde yapabiliriz.
1. yöntem
tabloda "Baba Adı","Çocuk 1","Çocuk 2","Çocuk 3","Çocuk 4","Çocuk 5", şeklinde alanlar (Kolon yada sütün) oluşturmak. bu yöntemle veritabanı nı boş kayıt tan kurtaramazsınız. (1 çocuğu olan çin 4 alan boş kalacaktır). Ayrıca 6 çocuğum olduğunu düşünürsen veritabanı iş görmeyecektir.
2.ilişkisel tablolar kullanmak
"Baba" adında bir tablo, içerisinde "Index" adında benzersiz (tüm kayıtlarda farklı- Tc kimlik no gibi)bir alan ve "Baba adı" adında bir alan
"Çocuk" adında bir tablo ve içerinde "Baba Index" ve "çocuk ismi" adında iki alan.
örneğe kayıt yaparsak daha iyi anlaşılmış olur.
Baba tablosu
Index Baba Adı
1 Muhittin
2 Bunyamin
3 İlyas
Çocuk tablosu
Baba Index çocuk ismi
1 Umut
1 Ecem
2 Berkant
3 Ugur
3 Ufuk
3 Alpay
3 Sultan
3 KAdir
örnektede anlaşılacağı üzere çocuk tablosunda baba index ile baba tablosundaki index Bir e Çok ilişki türündedir. Farklı ilişki türleride mevcuttur.
Ben olsam Tek bir database içerisinde bir çok table da tutardım.
Table ları foreign keylerle birbirine bağlardım
Örneğin Kişi table ı şu şekilde olabilir
Key Ad - Soyad
Aile bilgileri
Key -- Anne - Baba - Kardeş 1- Kardeş 2 - Kardeş 3 -- Görüşme sıklığı
PC bilgileri
Key - Ram - İşlemci - Vs. Vs.
Bilgisayar
Ad- Soyad (Kişi table ından Key ile çekilcek ) -- PC bilgileri (PC bilgileri tableından Key ile çekilecek)
Daha sonra sql incelikleri ile istediğiniz sorguyu yapabilirsiniz.
Tam olarak bu konu database kitaplarında Entity Relationship ve tablo normalizasyonu konularında geçiyor. Yanlış hatırlamıyosam. Böyle problemler için doğru tablelar hazırlamak için iyi tanımlanmış kurallar var.
Kolay gelsin
Tek bir tabloda rahatlıkla tutulur.Bu tür bir uygulama için ayrı tablolarda tutulması pek gerekli değildir.Birden fazla table da tutulmasını gerektiren konu eğer bir kayıta ait mesea en az 20 hareket oluyorsa bunu ayrı bir tablo da tutarsınız.
Ayrıca Muhittin hocanın verdiği örnekteki gibi bir relation yaparsınız.
Yani
Baba tablosu
Index Baba Adı
1 Muhittin
2 Bunyamin
3 İlyas
Çocuk tablosu
Baba Index çocuk ismi
1 Umut
1 Ecem
2 Berkant
3 Ugur
3 Ufuk
3 Alpay
3 Sultan
3 KAdir
Bu tabloadan mesela Muhittin Hocanın çocuklarının isminin Umut ve Ecem olduğu anlaşılıyor.
Vsalma nın verdiği örnek genel olarak doğru olmasına rağmen Adı soyadına göre Key Relation(Bağıntı) kurulması yeterli olmaz .Muhittin Hocanın yazdığı gibi table ID gibi otomatik artan bir sayıdan relation ın yapılması gerekir.
Biraz uzunca bir cevap olacak :)
Tablolar aşağıdaki gibi olabilir
tbInsan
InsanID uniqueidentifier default değer NEWID() olarak verilecek
Adi varchar(20)
Soyadi varchar(20)
tbAileBagi
AileBagi tinyint
Aciklama varchar(30)
tbAile
KayitID uniqueidentifier default değer NEWID() olarak verilecek
InsanID uniqueidentifier
AileFerdiID uniqueidentifier
AileBagi tinyint
InsanID tbInsan -> InsanID ile bağlanacak
AileFerdiID tbInsan -> InsanID ile bağlanacak
AileBagi tbAileBagi -> AileBagi ile bağlanacak
tbAileGorusmeleri
KayitID uniqueidentifier default değer NEWID() olarak verilecek
Tarih smalldatetime
InsanID uniqueidentifier
AileFerdiID uniqueidentifier
InsanID tbInsan -> InsanID ile bağlanacak
AileFerdiID tbInsan -> InsanID ile bağlanacak
tbYakitTipi
YakitTipi tinyint
Aciklama varchar(30)
tbMotor
Motor uniqueidentifier default değer NEWID() olarak verilecek
Aciklama varchar(30)
YakitTipi tinyint
YakitTipi tbYakitTipi -> YakitTipi ile bağlanacak
tbMotorlar
KayitID uniqueidentifier default değer NEWID() olarak verilecek
InsanID uniqueidentifier
Motor uniqueidentifier
InsanID tbInsan -> InsanID ile bağlanacak
Motor tbMotor -> Motor ile bağlanacak
tbMotorKullanimi
KayitID uniqueidentifier default değer NEWID() olarak verilecek
MotorlarID uniqueidentifier
Yil tinyint
Ay tinyint
YakitLitre int
Km int
MotorlarID tbMotorlar -> KayitID ile bağlanacak
tbBilgisayar
Bilgisayar uniqueidentifier default değer NEWID() olarak verilecek
Aciklama varchar(30)
tbBilgisayarlar
KayitID uniqueidentifier default değer NEWID() olarak verilecek
InsanID uniqueidentifier
Bilgisayar uniqueidentifier
InsanID tbInsan -> InsanID ile bağlanacak
Bilgisayar tbBilgisayar -> Bilgisayar ile bağlanacak
tbBilgisayarKullanimi
KayitID uniqueidentifier default değer NEWID() olarak verilecek
BilgisayarlarID uniqueidentifier
Tarih smalldatetime
CalismaSaat tinyint
OnlineSaat tinyint
Tablo değerlerine gelince
tbAileBagi tablosuna
1,Baba
2,Anne
3,Kardeş
olarak girelim
tbYakitTipi tablosuna
1,Benzin
2,Dizel
3,LPG
olarak girelim
sonrasında diğer tablo kayıtları için
tbInsan tablosuna her kişi ayrı ayrı kaydedilecek
Ahmet
Mehmet
Can
Gül
Ali
Murat
Sevgi
Musa
Gülay
Necmi
tbAileBagi tablosuna atılacak kayıtlar
Ahmet,Mehmet,1 (Mehmet Ahmetin Babası olmuş oluyor)
Ahmet,Gül,2 (Gül Ahmetin Annesi Oluyor)
Ahmet,Can,3 (Can Ahmetin Kardeşi Olmuş Oluyor)
Ahmet,Ali,3 (Ali Ahmetin Kardeşi olmuş oluyor)
Can,Mehmet,1
Can,Gül,2
Can,Ahmet,3
Can,Ali,3
Murat,Musa,1 (Musa Muratın babası)
Murat,Sevgi,2 (Sevgi Muratın annesi)
Murat,Gülay,3 (Gülay Muratın Kardeşi)
Gülay,Musa,1
Gülay,Sevgi,2
Gülay,Murat,3
tbAlileGoruslemeri tablosu için
01.01.2012,Ahmet,Mehmet
02.01.2012,Ahmet,Gül
...
tbMotor tablosu
Yamaha,1
Honda,1
Mobilet,2
...
tbMotorlar tablosu
Ahmet,Yamaha
Ahmet,Honda
Can,Mobilet
Murat,Honda
tbMotorKullanimi
MolarlarID,2012,1,300,1000
MotorlarID,2012,2,100,500
...
tbBilgisayar tablosu
HP
DELL
ASUS
...
tbBilgisayarlar
Ahmet,HP
Ahmet,ASUS
Can,DELL
...
tbBilgisayarKullanimi
BilgisayarlarID,01.01.2012,5,2
BilgisayarlarID,02.01.2012,7,3
...
baya bir uzun oldu umarım anlamışsındır...
sorgu işi için datayı hazırlayıp kontrol ederek yazmak lazım
akıldan yazarsam hatalı olabilir
ama bu yapı ile istediğin sorguyu çekebilirsin