Veritabanı tasarımı, verilerin etkin bir şekilde depolanması, yönetilmesi ve erişilmesi için kritik bir rol oynar. İyi bir veritabanı tasarımı, veri bütünlüğünü korur, performansı artırır ve bakım maliyetlerini azaltır. Bu bölümde, SQL tasarım kuralları ve normalizasyon kavramlarını detaylı bir şekilde ele alacağız.
Veritabanı tasarımında dikkate alınması gereken temel kurallar şunlardır:
Veri bütünlüğü, verilerin doğruluğunu ve tutarlılığını korumak için uygulanan kısıtlamaları ifade eder. Veri bütünlüğünü sağlamak için aşağıdaki unsurlar kullanılır:
Birincil Anahtarlar (Primary Keys):
KullanıcıID
birincil anahtar olarak kullanılır.AraçID
birincil anahtar olarak kullanılır.Yabancı Anahtarlar (Foreign Keys):
KullanıcıID
, Kullanıcı tablosundaki KullanıcıID
ye referans veren bir yabancı anahtardır.SürücüID
ve YolcuID
, Kullanıcı tablosundaki KullanıcıID
ye referans verir.Benzersizlik ve Doğruluk Kısıtlamaları:
TelefonNumarası
sütunu için UNIQUE kısıtlaması uygulanarak, her kullanıcının benzersiz bir telefon numarasına sahip olması sağlanır.BaşlamaZamanı
sütunu NOT NULL olarak tanımlanır, böylece her seyahatin bir başlangıç zamanı olması zorunlu kılınır.Tutar
sütunu için CHECK (Tutar > 0)
kısıtlaması uygulanarak, ödeme tutarının sıfırdan büyük olması sağlanır.Şema tasarımı, veritabanındaki tabloların ve ilişkilerin nasıl yapılandırılacağını belirler. İyi bir şema tasarımı için aşağıdaki unsurlara dikkat edilmelidir:
Tablo ve Alan İsimlendirme Standartları:
Kullanıcı
, Araç
, Seyahat
, Ödeme
.KullanıcıID
, İsim
, Soyisim
, TelefonNumarası
.Veri Tiplerinin Doğru Seçimi:
TelefonNumarası
için VARCHAR(15)
kullanarak hem ulusal hem de uluslararası numaraları kapsayabilirsiniz.Tutar
için DECIMAL(10,2)
kullanarak hassas para değerlerini saklayabilirsiniz.BaşlamaZamanı
ve BitişZamanı
için TIMESTAMP
veya DATETIME
veri tiplerini kullanın.İlişkilerin Doğru Tanımlanması:
Normalizasyon, veritabanı tasarımında verilerin organize edilmesi için kullanılan bir süreçtir. Amaç, veri tekrarlanmasını azaltmak, veri bütünlüğünü sağlamak ve anormallikleri önlemektir.
Normalizasyon süreci, veritabanının belirli normal formlara uygun olarak yapılandırılmasını içerir. Başlıca normal formlar şunlardır:
Tanım:
Amaç:
Örnek (C2C Taksi Uygulaması):
Hatalı Tasarım:
Kullanıcı Tablosu:
KullanıcıID | İsim | Telefon1 | Telefon2 |
---|---|---|---|
1 | Ahmet | 12345678 | 87654321 |
2 | Ayşe | 23456789 |
Sorun:
Kullanıcı tablosu:
KullanıcıID | İsim |
---|---|
1 | Ahmet |
2 | Ayşe |
KullanıcıTelefon tablosu:
KullanıcıID | Telefon |
---|---|
1 | 12345678 |
1 | 87654321 |
2 | 23456789 |
Tanım:
Amaç:
Örnek (C2C Taksi Uygulaması):
Hatalı Tasarım:
SeyahatDetay tablosu:
SürücüID | YolcuID | AraçPlaka | BaşlangıçKonumu | … |
---|---|---|---|---|
5 | 10 | 34ABC123 | … | |
6 | 11 | 34XYZ789 | … |
Sorun:
AraçPlaka
, sadece SürücüID
‘ye bağımlıdır, ancak YolcuID
ile ilgisi yoktur.Seyahat tablosu:
SeyahatID | SürücüID | YolcuID | … |
---|---|---|---|
1001 | 5 | 10 | … |
1002 | 6 | 11 | … |
Araç Tablosu:
AraçID | KullanıcıID (SürücüID) | PlakaNo | … |
---|---|---|---|
1 | 5 | 34ABC123 | |
2 | 6 | 34XYZ789 |
AraçPlaka
bilgisi, Araç tablosunda tutulur ve Seyahat tablosunda tekrarlanmaz.KullanıcıID | İsim | İlID | İlAdı |
---|---|---|---|
1 | Ahmet | 34 | İstanbul |
2 | Ayşe | 6 | Ankara |
Sorun:
İlAdı
, İlID
‘ye bağımlıdır, ancak İlID
de KullanıcıID
‘ye bağımlıdır.Doğru Tasarım: Kullanıcı tablosu:
KullanıcıID | İsim | İlID |
---|---|---|
1 | Ahmet | 34 |
2 | Ayşe | 6 |
İl tablosu:
İlID | İlAdı |
---|---|
34 | İstanbul |
6 | Ankara |
Açıklama:
İlAdı
, İlID
‘ye tam bağımlı hale gelir ve ayrı bir tabloda tutulur.Bazı durumlarda, veritabanını daha da optimize etmek için ileri düzey normalizasyon formları kullanılır.
Tanım:
Örnek (C2C Taksi Uygulaması):
Hatalı Tasarım:
SürücüTakvim tablosu:
SürücüID | Gün | ÇalışmaSaatleri |
---|---|---|
5 | Pazartesi | 08:00 - 18:00 |
5 | Salı | 08:00 - 18:00 |
Sorun:
ÇalışmaSaatleri
, SürücüID
ve Gün
bileşik anahtarına bağımlı, ancak eğer Gün
için belirli bir ÇalışmaSaatleri
standardı varsa, bu durum BCNF ihlaline yol açar.Doğru Tasarım:
SürücüID | GünID |
---|---|
5 | 1 |
5 | 2 |
Gün Tablosu:
GünID | GünAdı | Saat |
---|---|---|
1 | Pazartesi | … |
2 | Salı | … |
KullanıcıID | Hobiler | Diller |
---|---|---|
1 | Futbol | İngilizce |
1 | Müzik | Fransızca |
Sorun:
Hobiler
ve Diller
arasında bağımsız çok-değerli bağımlılıklar vardır.Doğru Tasarım:
KullanıcıID | Hobi |
---|---|
1 | Futbol |
1 | Müzik |
KullanıcıDil tablosu:
KullanıcıID | Dil |
---|---|
1 | İngilizce |
1 | Fransızca |
Açıklama:
Performans Etkisi:
İhtiyaçlara Uygunluk:
Unutulmaması Gerekenler: