VeriTabanı model önerisi lazım

Başlatan mcan, 03 Ağustos 2012, 20:20:45

mcan

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?

The Gariban

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.

muhittin_kaplan

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.

vsalma

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

The Gariban

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.

evreno

#5
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