Aşağıdaki sistem için veri modeli ve ER diyagram hazırla:
SİSTEM:
- Ad: [SİSTEM]
- Amaç: [NE YAPAR]
- Kullanıcılar: [KİMLER]
- İşlem hacmi: [YAKLAŞıK KAÇ KAYIT]
ANA VARLıKLAR (high-level):
[LİSTELE - ÖRN: MÜŞTERI, ÜRÜN, SIPARIŞ, FATURA]
VERİ MODELLEME 7 ADIMDA:
ADIM 1 — VARLIK (ENTITY) TESPİTİ
1.1 NESNE / KAVRAM TANIMLAMA
VARLIK NEDİR:
- Hakkında bilgi saklanan "şey"
- Ad, fiil değil (ör: "Müşteri" evet, "Satış" tartışmalı)
- Birden fazla örneği olabilir
- Benzersiz tanımlanabilir
VARLıK ÖRNEKLERI:
- İnsan: Müşteri, Çalışan, Kullanıcı
- Yer: Şube, Depo, Mağaza
- Nesne: Ürün, Araç, Bina
- Olay: Sipariş, Rezervasyon, Şikayet
- Kavram: Kategori, Rol, Durum
1.2 VARLIK ADLANDIRMA
KURAL:
- Tekil form ("Müşteri" değil "Müşteriler")
- Büyük harf başlangıç
- Tek kelime tercih
- Anlaşılır
İYI ÖRNEKLER:
- Ürün, Sipariş, Fatura
- Kullanıcı, Rol, Yetki
- Şube, Departman, Pozisyon
KÖTÜ ÖRNEKLER:
- "Müşteri Bilgileri" (→ Müşteri)
- "Satışlar" (→ Satış)
- "Temp_Data" (tanımsız)
1.3 ZAYIF VS GÜÇLÜ VARLIKLAR
GÜÇLÜ VARLIK:
- Kendi başına var olabilir
- Birincil anahtarı var
- Örnek: Müşteri
ZAYıF VARLıK:
- Başka varlığa bağımlı
- Kendi başına anlamı yok
- Bağlı olduğu varlıkla birlikte tanımlı
- Örnek: Sipariş Satırı (Siparişe bağımlı)
- Çift kenarlı dikdörtgen ile gösterilir
ADIM 2 — ÖZNİTELİK (ATTRIBUTE) TESPİTİ
2.1 ÖZNİTELİK TİPLERİ
BASİT (atomic):
- Tek değer
- Bölünemez
- Örnek: Yaş, Cinsiyet
BİRLEŞİK (composite):
- Alt özniteliklere ayrılabilir
- Örnek: Adres → Sokak, Şehir, Posta Kodu
TEKLİ VS ÇOKLU DEĞER:
- Tekli: Telefon (1 adet)
- Çoklu: Telefonlar (birden fazla) — 3NF'e göre ayrı tablo
TÜRETİLMİŞ (derived):
- Başka özniteliklerden hesaplanır
- Örnek: Yaş (Doğum Tarihi'nden)
- Saklamaya gerek yok (cache hariç)
NULL YAPABILEN:
- Zorunlu değil
- Boş olabilir
- İş kuralları ile belirlenir
2.2 VERİ TİPLERİ
METİN:
- VARCHAR(N): Değişken uzunluk (adres, ad)
- CHAR(N): Sabit uzunluk (TC kimlik 11)
- TEXT: Uzun metin (açıklama)
SAYI:
- INT: Tam sayı (yaş)
- DECIMAL(10,2): Ondalık (para)
- FLOAT: Kayan nokta (ağırlık)
TARIH / ZAMAN:
- DATE: Sadece tarih
- TIME: Sadece saat
- DATETIME: İkisi
- TIMESTAMP: Unix zaman
BOOLEAN:
- TRUE / FALSE
- Bit alan
ENUM:
- Sınırlı seçenek
- Örnek: ('aktif', 'pasif', 'beklemede')
JSON:
- Yarı yapılandırılmış veri
BLOB:
- Dosya, görsel
- Gerçek sistemde dosyayı ayrı tut, referans sakla
2.3 KISITLAMALAR
NOT NULL:
- Zorunlu alan
UNIQUE:
- Benzersiz
- E-posta, TC kimlik
DEFAULT:
- Varsayılan değer
- Örnek: DEFAULT CURRENT_TIMESTAMP
CHECK:
- Değer kontrolü
- Örnek: CHECK (yaş > 0 AND yaş < 150)
ADIM 3 — BİRİNCİL ANAHTAR (PRIMARY KEY)
3.1 NATURAL KEY
- Gerçek dünyada benzersiz bir öznitelik
- Örnek: TC kimlik, ISBN, e-posta
- Pro: Anlamlı
- Con: Değişebilir (e-posta), hassas (TC), büyük (VARCHAR)
3.2 SURROGATE KEY
- Sistem tarafından üretilen
- Anlamsız (çoğunlukla sayı)
- Örnek: customer_id INT AUTO_INCREMENT
- Pro: Basit, hızlı, değişmez
- Con: İş anlamı yok
BEST PRACTICE:
- Surrogate key ana
- Natural key UNIQUE constraint
- Performans için surrogate
- Veri bütünlüğü için natural
3.3 COMPOSITE KEY
- Birden fazla sütun birleşimi
- Örnek: (ders_kodu, dönem_id) → kurs benzersiz
- Genelde zayıf varlıklarda
ADIM 4 — İLİŞKİLER (RELATIONSHIPS)
4.1 KARDINALITE (Cardinality)
BIR'E BİR (1:1):
- Her A için en fazla 1 B, her B için en fazla 1 A
- Örnek: Kişi ↔ Pasaport
- Nadir (genellikle aynı tabloya birleştirilebilir)
BIR'E ÇOKA (1:N):
- Her A için birden fazla B, her B için sadece 1 A
- Örnek: Müşteri → Sipariş
- Yabancı anahtar (FK) "çok" tarafında
ÇOKTAN ÇOKA (M:N):
- Her A için birden fazla B, her B için birden fazla A
- Örnek: Öğrenci ↔ Ders
- Junction table gerekli (öğrenci_ders)
4.2 KATILIM (Participation)
TOTAL (zorunlu):
- Her A, bir B ile ilişkili olmalı
- Örnek: Her sipariş bir müşteriye aittir (NOT NULL FK)
PARTIAL (opsiyonel):
- Her A, B ile ilişkili olabilir ama gerek yok
- Örnek: Her müşterinin siparişi olmayabilir (yeni kayıtlı)
4.3 İLİŞKİ ADLANDIRMA
- Fiil ifade
- Çift yönlü okunmalı
- Örnek: "Müşteri SİPARİŞ VERİR"; "Sipariş MÜŞTERİYE AİTTİR"
4.4 YABANCI ANAHTAR (FOREIGN KEY)
REFERANS BÜTÜNLÜĞÜ:
- CASCADE: Silinirse bağlı kayıtlar da silinir
- SET NULL: Silinirse FK null olur
- RESTRICT: Bağlı kayıt varsa silme
- NO ACTION: Hata fırlat
ADIM 5 — NORMALIZASYON
5.1 NEDEN
- Tekrar azaltma
- Tutarlılık artırma
- Güncelleme anomalilerini önleme
5.2 NORMAL FORMLAR
1NF (Birinci Normal Form):
- Atomic (bölünemez) değerler
- Çoklu değer yok (virgüllü liste yok)
- Her hücrede tek değer
ÖRNEK KÖTÜ: Telefonlar = "0532...,0533..."
ÖRNEK İYİ: Ayrı Telefon tablosu
2NF:
- 1NF
- Parttial dependency yok
- Composite key varsa tüm non-key'ler tam key'e bağımlı
3NF:
- 2NF
- Transitive dependency yok
- Non-key, non-key'e bağımlı değil
ÖRNEK KÖTÜ: (öğrenci_id, bölüm_adı, bölüm_dekan)
- bölüm_dekan, bölüm_adı'na bağımlı (transitive)
ÖRNEK İYİ: Ayrı Bölüm tablosu
BCNF (Boyce-Codd):
- 3NF
- Daha sıkı
5.3 DENORMALIZASYON (yüksek performans için)
- Bazı durumlarda normalleştirmeme
- Read-heavy sistemler
- Raporlama
- Cache değerler
- Trade-off: disk kullanımı ↑, query hızı ↑, consistency kontrol lazım
ADIM 6 — ER DIYAGRAM NOTASYONU
6.1 CHEN NOTASYONU
- Varlık: Dikdörtgen
- İlişki: Elmas
- Öznitelik: Oval (dikdörtgenden çıkan)
- Birincil anahtar: Altı çizili öznitelik
- Zayıf varlık: Çift kenarlı dikdörtgen
6.2 CROW'S FOOT NOTASYONU (modern, yaygın)
- Varlık: Dikdörtgen
- İlişki: Çizgi (ucunda kardinalite sembolleri)
SEMBOLLER:
- Tek çizgi: 1 (zorunlu)
- O: 0 (opsiyonel)
- Crow's foot: çok (N)
- Zorunlu çok: Crow's foot + tek çizgi
- Opsiyonel çok: Crow's foot + daire
6.3 UML SINIF DIYAGRAM
- Varlık: Sınıf (dikdörtgen)
- 3 bölüm: Ad, Öznitelikler, Metotlar
- İlişki: Çizgi + kardinalite yazılı (1..*, 0..1)
ADIM 7 — ARAÇLAR
ÜCRETSİZ:
- draw.io / diagrams.net
- Lucidchart (ücretsiz plan)
- dbdiagram.io (kod ile)
- MySQL Workbench (otomatik)
- ER/Studio
ÜCRETLI:
- Enterprise Architect
- Visual Paradigm
- Erwin
- PowerDesigner
CODE-FIRST:
- Liquibase
- Flyway
- Django ORM
- Hibernate
ÖRNEK MODEL — E-TICARET:
VARLıKLAR:
- Kullanıcı (user_id PK, ad, email, şifre_hash, kayıt_tarihi)
- Ürün (urun_id PK, ad, fiyat, stok, aciklama, kategori_id FK)
- Kategori (kategori_id PK, ad, üst_kategori_id FK)
- Sipariş (siparis_id PK, user_id FK, tarih, toplam, durum)
- Sipariş_Satırı (zayıf varlık, siparis_id+urun_id composite PK, adet, birim_fiyat)
- Adres (adres_id PK, user_id FK, sokak, şehir, posta_kodu, tip)
- Ödeme (odeme_id PK, siparis_id FK, tutar, yöntem, durum, tarih)
İLİŞKİLER:
- Kullanıcı 1 — N Sipariş
- Sipariş 1 — N Sipariş_Satırı
- Ürün 1 — N Sipariş_Satırı
- Kategori 1 — N Ürün (self-referencing: alt kategoriler)
- Kullanıcı 1 — N Adres
- Sipariş 1 — 1 Ödeme (veya 1 — N taksit için)
KISITLAMALAR:
- email UNIQUE
- stok CHECK (stok >= 0)
- toplam CHECK (toplam > 0)
- durum ENUM ('beklemede','kargoda','teslim','iptal')
DOKÜMANTASYON:
- ER Diyagram (PDF)
- Veri Sözlüğü (Excel)
* Her tablo için: ad, açıklama
* Her sütun için: ad, tip, null, default, kısıtlamalar, açıklama
- Örnek veri (10-20 satır her tablo için)
Türkçe. IEEE ve endüstri best practice'lerine uygun.