Arama butonu
Bu konudaki kullanıcılar: 1 misafir
4
Cevap
471
Tıklama
0
Öne Çıkarma
SQL hakkında kolay bir soru
G
6 yıl
Teğmen
Konu Sahibi

merhaba, sql sorgu dilini yeni öğreniyorum, aklımda sizin için kolay benim için temel yapıyı kavrayabileceğim bir soru var,
primary ve foreign key'ler hakkında bazı şeyleri kafamda oturtamadım, size şöyle bir soru sorarak anlamaya çalışacağım :

3 tablom var : ogrenci,veli,ikametgah

ogrenci : ogr_id(PK,identity),ogr_isim

veli : veli_id(PK,identity),veli_isim,ogr_id(FK)

ikametgah : id(PK,identity),veli_id(FK),ogr_id(FK),adres

burada anlamaya çalıştığım, ogrenci eklediğimizde primary otomatik atanırken aynı anda veliye foreign key nasıl atılınacak ve ikametgahtan veri çekerken ogrenci isim ve veli isime nasıl ulaşılınacak ve adresi yanda yazdıracak,
ve tabii tabloların oluşturulurkenki sql kodu , eğer bunların cevabını verirseniz aklımdaki tüm soru işaretleri kalacak ve çok minnettar olacağım. çok teşekkür ederim...





< Bu mesaj bu kişi tarafından değiştirildi game8181 -- 19 Kasım 2017; 18:20:14 >

S
6 yıl
Yarbay

İlişkili Tablolar her zaman tutarlı verileri sahip olmalıdır. Öğrenci olmadan tek başına Veli bir ifade etmez. O yüzden önce sisteme öğrenciler tanımlanmalı, daha sonra onların Veli'leri girilmelidir. Veri bütünlüğü ve tutarlılığı ancak bu yolla sağlanabilir. Elinde öğrenci ve veli bilgileri olduktan sonra da en son ikametgah bilgileri girilmelidir.

İlişkili tablolardan SELECT ile veri gösterimi yaparken de ya alt sorgular (SUBQUERY) kullanılır ya da JOIN dediğimiz tablo birleştirme yöntemi kullanılır.

quote:


SELECT ogrenci.ogr_isim, veli.veli_isim
FROM `ogrenci`
LEFT JOIN veli ON ogrenci.ogr_id = veli.ogr_id;


http://sqlfiddle.com/#!9/4dcd30/1



H
6 yıl
Yüzbaşı

Öncelikle burada normalizasyon sorunu var. Dolayısıyla yanlış oluşturulmuş tablolarda sql ile çalışma yaparken yanlış gidecek olan ve çözemeyeceğiniz bir çok sorun oluşabilir.

ilk olarak öğrenci ve veli arasındaki ilişkiyi incelersek:
1 öğrencinin 1 velisi olur.
1 velinin ise n tane öğrencisi olabilir.
Sonuç olarak öğrenci-veli arasındaki ilişki n-1 olacaktır. Dolayısıyla yabancı anahtarı öğrenci tablosuna koymalısınız. Yani öğrenci tablosunda veli_id olmalı.

İkinci olarak ikametgah'tan kasıt tam olarak kimin içindir anlayamadım. Öğrencinin ikametgahı olarak düşünüldü ise şöyle olmalı.
1 öğrenci 1 yerde ikamet eder.
1 ikamet yerinde n tane öğrenci ikamet edebilir.
Sonuç olarak öğrenci-ikamet arasındaki ilişki n-1 olacaktır. Dolayısıyla yabancı anahtar öğrenci tablosunda olmalı. Yani öğrenci tablosunda ikamet_id olmalı. Ama şunu da belirteyim. Adres gibi doğrudan kişiye bağlı ve tekrar etmeyen alanlar doğrudan bağlı olduğu tabloda bırakılır. Bu sebeple öğrenci tablosuna adres diye bir alan eklenir. İkametgah diye bir tabloya da ihtiyaç kalmaz. Eğer ben ikametgahlardaki öğrencileri takip etmek istiyorum derseniz o zaman ikametgah tablosu yaparsınız. O zaman da öğrenci tablosuna ikamet_id eklersiniz.

Velhasılı kelam ben olsam aşağıdaki tablolarla bu işi bitirirdim.
ogrenci(*ogrId, adi, soyadi, veliId, adres)
veli(*veliId, adi, soyadi)

Bazı ilave açıklamalar:
-Nomalizasyon adımlarını araştırıp inceleyiniz. Başlangıç olarak 1NF, 2NF ve 3NF yeterli olacaktır.
-Normalizasyon kurallarına göre bir alanda bir veri olabilir. Adı, soyadı ayrı alanlarda olmalı.
-Birincil anahtarları identity yani otomatik artan yapabilirsiniz. Ancak yabancı anahtarlar otomatik artan olmaz. Oraya elle değer girilmelidir. Mantık olarak yabancı anahtarlar veri tekrarını önlemek için kullanılırken aynı zamanda oraya girilecek değerleri sınırlandırmak için de kullanılır. Şöyleki; yabancı anahtara girdiğiniz değer bağlı olduğu tabloda varmı diye bakılır ve varsa izin verilir. Örneğin öğrenci tablosuna veli id olarak 15 girdiğinizde sistem, veli tablosuna gider ve 15 nolu veli varmı diye bakar. Varsa girişe izin verir. Düşünsenize veli id otomatik olarak atansa ne olurdu? :) Herkesin velisi rastgele atanmış olurdu ve karmakarışık saçma bir iş ortaya çıkardı. Dolayısıyla yabancı anahtarlara değerleri kullanıcı girer. Şunu da unutmayın: Veritabanları, uygulamaların kullanması için hazırlanır. Sürekli veritabanını biz gidip kayıt girmeyiz. Özel durumlar hariç. Buradan sonuçla öğrenci kaydı için bir program veya sayfa yapılmış olsun. Bu sayfada öğrencinin adı, soyadı için metin kutusu konulmuşken velisi için, içene velilerin doldurulduğu bir açılır liste eklenmiş olsun. Bu arayüzden yabancı anahtar olan veli id kısmına açılır listeden değer seçtirmiş oluruz ve varolan kayıtlar arasından seçim yapmaya zorlamış oluruz. Tam istediğimiz gibi.



G
6 yıl
Teğmen
Konu Sahibi

@snoppy : çok çok teşekkür ederim, kodlar oldukça açıklayıcı oldu.

@hyrgul : hatalarımı söylemeniz çok faydalı oldu çok teşekkürler... yalan olmasın tabloyu bu hale getirmeye çalışmamın amacında fazlaca pk ve fk oluşturma ve bunları kullanarak birlikçe çağırmayı görmek içindi, sondaki dedikleriniz için de çok teşekürler faydalı oldu, vaktiniz varsa bir şey soracaktım öğrenci tablosuna veli_id girdik diyelim ama veli_id , veli tablosunda yoks bu yüzden hata verir , yazınızda bundan bahsettiniz bu nasıl sağlanıyor?




Bu mesajda bahsedilenler: @snoppy , @hyrgul
H
6 yıl
Yüzbaşı

ogrenci tablosunu oluşturuken veliId alanını yabancı anahtar olarak belirtip referansını gösterirseniz duğrulamayı otomatik yapacaktır.
Üst tablolar önce oluşturulmalı. Yani veli olmadan öğrenci kaydı yapılamayacağından önce veli tablosu, sonra öğrenci tablosu oluşturulmalı.
Başka bir ipucu: İçinde yabancı anahtar olan tablolar sonra oluşturulmalı.
Not: MSSQL serverda yazılmıştır.


CREATE DATABASE okulDB
GO
USE okulDB
GO
CREATE TABLE veli (
veliId INT PRIMARY KEY IDENTITY(1,1),
adi NVARCHAR(20) NOT NULL,
soyadi NVARCHAR(20) NOT NULL
)
GO
CREATE TABLE ogrenci (
ogrId INT PRIMARY KEY IDENTITY(1,1),
adi NVARCHAR(20) NOT NULL,
soyadi NVARCHAR(20) NOT NULL,
veliId INT NOT NULL FOREIGN KEY REFERENCES veli(veliId),
adres NVARCHAR(300)
)





< Bu mesaj bu kişi tarafından değiştirildi hyrgul -- 19 Kasım 2017; 20:25:23 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.