---
title: 'Varlık–İlişki Modeli'
source: 'https://academia.sh/tr/kurslar/modelleme-ve-gosterim/varlik-iliski-modeli'
course: 'Modelleme ve Gösterim'
language: tr
updated: '2026-08-17T18:08:16+00:00'
license: 'CC BY-SA 4.0'
---

# Varlık–İlişki Modeli

Bakım atölyesinin kavramsal modeli 26 olgu söylüyor: 5 varlık, 12 öznitelik, 4 ilişki, 5 kısıt. Kardinalite yazılıp katılım yazılmadığında aynı gösterime 1.048.576 sistem düşüyor.

Önceki ders bir iş emrinin zaman içindeki davranışını dört durum ve altı geçişle gösterdi.
Ölçü, makinenin kabul ettiği dil ile sistemin gerçek izleri arasındaki farktı: iki dizi
reddediliyordu, sistemde olmayan iki dizi kabul ediliyordu, ve iki geçiş eklenince
reddedilen sıfıra inerken fazla kabul 2'den 26'ya çıkıyordu. O gösterim sistemin **ne
yaptığını** anlatıyordu.

Bu konu sistemin **ne tuttuğunu** anlatan gösterimi ele alır. Sorusu aynı biçimdedir:
alanın veri yapısını varlık, öznitelik ve ilişki cinsinden yazmak kaç olgu söyler, ve kaç
olguyu söylemeden bırakır. İlişkisel model, anahtar çeşitleri, bütünlük kısıtları ve
normalleştirme burada öğretilmez; bunlar Veritabanları müfredatının İlişkisel Kuram
kursunda kuruldu ve tekrarlanmaz. Buradaki tek iş, **düzey değişiminde düşen ve uydurulan
olguyu saymaktır.**

## Varlık, Öznitelik, İlişki

**Varlık** (entity), alanın kendi başına kimliği olan bir kavramıdır: bir iş emri, bir
usta, bir parça. **Öznitelik** (attribute), bir varlığın taşıdığı tek değerlik bir
olgudur: iş emrinin açılış tarihi, ustanın uzmanlığı. **İlişki** (relationship), iki
varlık arasındaki bağdır ve bir **kardinalite** taşır — hangi tarafın bir, hangi tarafın
çok olduğunu söyleyen etiket.

Varlık terimi burada bir kimlik taşıyıcısını adlandırır; Veritabanları müfredatında geçen
**varlık nesnesi** ise alan katmanındaki bir programlama nesnesidir ve ayrı bir kavramdır.

- **VM1** — Modellenen alan bir bakım atölyesidir ve sistem veridir. Hiçbir modelleme
  aracı, çizim ürünü ya da veri saklama ürünü çağrılmaz; ölçülen şey verinin kendisidir.
- **VM2** — Kavramsal modelin **olgu sayısı**, varlık, öznitelik, ilişki ve kısıt
  sayılarının toplamıdır. Her olgu bir kez sayılır.

```python
"""M01/K06 ortak tanim (kesit): kavramsal varlik-iliski modeli ve olgu sayimi."""
KISITLAR = [
    {"metin": "her is emrinin tek ustasi var",      "arac": "yabanci anahtar"},
    {"metin": "parca kodu benzersiz",               "arac": "benzersizlik"},
    {"metin": "belge yalnizca kendi is emrine ait", "arac": "yabanci anahtar"},
    {"metin": "bir is emri en az bir parca ister",  "arac": None},
    {"metin": "bir usta ayni anda tek tezgahta",    "arac": None},
]
KAVRAMSAL = {
    "varliklar": ["IsEmri", "Usta", "Parca", "Tezgah", "Belge"],
    "oznitelikler": {"IsEmri": ["no", "acilis", "durum"], "Usta": ["ad", "uzmanlik"],
                     "Parca": ["kod", "ad", "birim"], "Tezgah": ["kod", "tur"],
                     "Belge": ["tur", "tarih"]},
    "iliskiler": [("IsEmri", "Usta", "N:1"), ("IsEmri", "Parca", "N:M"),
                  ("Usta", "Tezgah", "N:M"), ("IsEmri", "Belge", "1:N")],
    "kisitlar": KISITLAR,
}


def olgular(model):
    v = len(model["varliklar"])
    o = sum(len(a) for a in model["oznitelikler"].values())
    i = len(model["iliskiler"])
    k = len(model["kisitlar"])
    return {"varlik": v, "oznitelik": o, "iliski": i, "kisit": k, "toplam": v + o + i + k}


print("kavramsal model:", olgular(KAVRAMSAL))
print()
print("varlik    oznitelik  girdigi iliskiler")
for ad in KAVRAMSAL["varliklar"]:
    bag = [f"{a}-{b} {c}" for a, b, c in KAVRAMSAL["iliskiler"] if ad in (a, b)]
    print(f"{ad:8s}  {len(KAVRAMSAL['oznitelikler'][ad]):9d}  {', '.join(bag)}")
```

```
kavramsal model: {'varlik': 5, 'oznitelik': 12, 'iliski': 4, 'kisit': 5, 'toplam': 26}

varlik    oznitelik  girdigi iliskiler
IsEmri            3  IsEmri-Usta N:1, IsEmri-Parca N:M, IsEmri-Belge 1:N
Usta              2  IsEmri-Usta N:1, Usta-Tezgah N:M
Parca             3  IsEmri-Parca N:M
Tezgah            2  Usta-Tezgah N:M
Belge             2  IsEmri-Belge 1:N
```

**Sistem:** bakım atölyesinin kavramsal modeli **26 olgu** söylüyor. **Gösterim:** aynı 26
öge diyagrama yazılıyor — beş varlık kutusu, on iki öznitelik, dört ilişki çizgisi ve beş
kısıt notu. Bire bir bir eşleşme gibi görünüyor. **Bedel** ise bu eşleşmenin dışında kalan
şeydir ve bir sonraki bölümde sayılacak.

## Kardinalite Ne Söyler, Çokluk Ne Ekler

Bu kursta iki ayrı terim, iki ayrı bilgiyi taşır ve karıştırılmaları ölçümü bozar.
**Kardinalite** (cardinality) varlık–ilişki gösteriminin etiketidir ve ilişkinin
**bütününe** yazılır: `N:1`, `1:N`, `N:M`. Söylediği şey her iki uçtaki **üst sınırdır** —
hangi tarafta en çok bir tane, hangi tarafta sınırsız sayıda olabileceği. **Çokluk**
(multiplicity) ise yapı gösteriminin etiketidir ve ilişkinin **her ucuna ayrı ayrı**
yazılır; biçimi `alt..üst` aralığıdır.

Aradaki fark tam olarak şudur: kardinalite üst sınırları söyler, çokluk üst sınırların
yanına **alt sınırı** da koyar. Alt sınır o ucun **katılımının** zorunlu mu isteğe bağlı mı
olduğudur. `N:1` etiketi bir iş emrinin en çok bir ustası olduğunu söyler; bir iş emrinin
**ustasız açılıp açılamayacağını** söylemez.

- **VM3** — Her ilişkinin iki ucu vardır ve her uç bağımsız olarak zorunlu ya da isteğe
  bağlı katılır. Kardinalite yalnız üst sınırları taşır.
- **VM4** — Her öznitelik bağımsız olarak zorunlu ya da isteğe bağlıdır. Katılım uzayı ile
  zorunluluk uzayı birbirinden bağımsızdır; toplam sayı ikisinin çarpımıdır.
- **VM5** — Sayım tamdır, örneklem değildir; aradaki bir sistemlik fark bile anlamlıdır.

```python
"""Kardinalite ne yaziyor , cokluk ne ekliyor: ayni gosterime kac sistem dusuyor."""
from itertools import product

ILISKILER = [("IsEmri", "Usta", "N:1"), ("IsEmri", "Parca", "N:M"),
             ("Usta", "Tezgah", "N:M"), ("IsEmri", "Belge", "1:N")]
UST = {"N:1": ("*", "1"), "1:N": ("1", "*"), "N:M": ("*", "*"), "1:1": ("1", "1")}
OZNITELIK = 12          # kavramsal modelin 12 ozniteligi


def er_gosterimi(sistem, cokluk=False):
    """sistem: (kaynak , hedef , kardinalite , alt_kaynak , alt_hedef) listesi."""
    yazi = []
    for kaynak, hedef, kard, alt_k, alt_h in sistem:
        s = {"kaynak": kaynak, "hedef": hedef, "kardinalite": kard}
        if cokluk:
            ust_k, ust_h = UST[kard]
            s["cokluk_kaynak"] = f"{alt_k}..{ust_k}"
            s["cokluk_hedef"] = f"{alt_h}..{ust_h}"
        yazi.append(s)
    return yazi


def ayni_gosterime_dusen(sistem, cokluk=False):
    """Tam sayim: kac ayri katilim secimi ayni gosterimi uretiyor."""
    hedef = er_gosterimi(sistem, cokluk)
    sayi = 0
    for secim in product((0, 1), repeat=2 * len(sistem)):
        aday = [(k, h, kd, secim[2 * i], secim[2 * i + 1])
                for i, (k, h, kd, _, _) in enumerate(sistem)]
        if er_gosterimi(aday, cokluk) == hedef:
            sayi += 1
    return sayi


SISTEM = [(k, h, kd, 1, 1) for k, h, kd in ILISKILER]
print("iliski ucu:", 2 * len(SISTEM), "| yazilmayan katilim biti:", 2 * len(SISTEM))
print("kardinalite yazili , cokluk yazili degil ->",
      ayni_gosterime_dusen(SISTEM, cokluk=False), "sistem")
print("cokluk yazili                            ->",
      ayni_gosterime_dusen(SISTEM, cokluk=True), "sistem")
print()
oznitelik_uzayi = sum(1 for _ in product((0, 1), repeat=OZNITELIK))
print("oznitelik zorunlulugu yazili degil ->", oznitelik_uzayi, "sistem")
print("iki uzay bagimsiz , carpim          ->",
      ayni_gosterime_dusen(SISTEM) * oznitelik_uzayi, "sistem")
print()
print("yazili oge  ne eklendi                      ayni gosterime dusen")
print(f"        26  varlik+oznitelik+iliski+kisit  "
      f"{ayni_gosterime_dusen(SISTEM) * oznitelik_uzayi:20d}")
print(f"        34  + 8 katilim isareti            "
      f"{ayni_gosterime_dusen(SISTEM, True) * oznitelik_uzayi:20d}")
print(f"        46  + 12 zorunluluk isareti        {1:20d}")
```

```
iliski ucu: 8 | yazilmayan katilim biti: 8
kardinalite yazili , cokluk yazili degil -> 256 sistem
cokluk yazili                            -> 1 sistem

oznitelik zorunlulugu yazili degil -> 4096 sistem
iki uzay bagimsiz , carpim          -> 1048576 sistem

yazili oge  ne eklendi                      ayni gosterime dusen
        26  varlik+oznitelik+iliski+kisit               1048576
        34  + 8 katilim isareti                            4096
        46  + 12 zorunluluk isareti                           1
```

**Bedel budur.** Yirmi altı olguyla yazılmış kavramsal model, kendisine benzeyen
**1.048.576 ayrı sistemden ayırt edilemiyor**. Bu sayı iki bağımsız kaynaktan geliyor:
dört ilişkinin sekiz ucundaki katılım bilgisi (256) ve on iki özniteliğin zorunluluk
bilgisi (4096). İkisi de gösterimde yazılı değil, ama ikisi de sistemde belirli.

Yapısal Diyagramlar konusunda ölçülen "her simge bir bit" ilişkisi burada da işliyor;
tekrarlanmaz. Bu dersin eklediği şey **hangi bitlerin** düştüğüdür, ve bu seçim rastgele
değildir: varlık–ilişki gösterimi tarihsel olarak kardinaliteyi taşımak için tasarlandı,
katılımı taşımak için değil. Düşen yirmi bit yok olmuyor — birazdan görüleceği gibi
mantıksal ve fiziksel düzeylerde **başka birinin vereceği karara** dönüşüyor. Özniteliğin
zorunlu olup olmadığı, fiziksel şemada "boş geçilebilirlik" adıyla yeniden karşımıza
çıkacak ve o düzeyde bir yanıt vermek **zorunlu** olacak.

## Varlık mı, Öznitelik mi

Modelin en sık verilen kararı, bir olgunun kendi varlığı mı yoksa başka bir varlığın
özniteliği mi olacağıdır. Bu karar bir üslup tercihi değildir; **modelin söyleyebildiği
olgu sayısını ve gösterebildiği durum sayısını birlikte değiştirir.**

- **VM6** — Bir iş emrine bağlanabilecek belge havuzu dört adaydır. Varlık biçimi bu
  havuzun herhangi bir alt kümesini gösterebilir; öznitelik biçimi tek değer taşır, yani
  en çok bir öge.
- **VM7** — `birim` özniteliği kendi varlığına yükseltildiğinde değer kümesi kapanır ve
  "birim yalnızca tanımlı kümeden" kısıtı söylenebilir hâle gelir.

```python
"""Ayni alan , iki ayri varlik-oznitelik karari: kac olgu degisiyor , kac durum kayboluyor."""
from itertools import combinations

KAVRAMSAL = {
    "varliklar": ["IsEmri", "Usta", "Parca", "Tezgah", "Belge"],
    "oznitelikler": {"IsEmri": ["no", "acilis", "durum"], "Usta": ["ad", "uzmanlik"],
                     "Parca": ["kod", "ad", "birim"], "Tezgah": ["kod", "tur"],
                     "Belge": ["tur", "tarih"]},
    "iliskiler": [("IsEmri", "Usta", "N:1"), ("IsEmri", "Parca", "N:M"),
                  ("Usta", "Tezgah", "N:M"), ("IsEmri", "Belge", "1:N")],
    "kisit": 5,
}
INDIRGENMIS = {                      # Belge varlik olmaktan cikip oznitelige iniyor
    "varliklar": ["IsEmri", "Usta", "Parca", "Tezgah"],
    "oznitelikler": {"IsEmri": ["no", "acilis", "durum", "belge"], "Usta": ["ad", "uzmanlik"],
                     "Parca": ["kod", "ad", "birim"], "Tezgah": ["kod", "tur"]},
    "iliskiler": [("IsEmri", "Usta", "N:1"), ("IsEmri", "Parca", "N:M"),
                  ("Usta", "Tezgah", "N:M")],
    "kisit": 4,                      # "belge yalnizca kendi is emrine ait" soylenemiyor
}
YUKSELTILMIS = {                     # birim oznitelik olmaktan cikip varliga yukseliyor
    "varliklar": ["IsEmri", "Usta", "Parca", "Tezgah", "Belge", "Birim"],
    "oznitelikler": {"IsEmri": ["no", "acilis", "durum"], "Usta": ["ad", "uzmanlik"],
                     "Parca": ["kod", "ad"], "Tezgah": ["kod", "tur"],
                     "Belge": ["tur", "tarih"], "Birim": ["ad"]},
    "iliskiler": [("IsEmri", "Usta", "N:1"), ("IsEmri", "Parca", "N:M"),
                  ("Usta", "Tezgah", "N:M"), ("IsEmri", "Belge", "1:N"),
                  ("Parca", "Birim", "N:1")],
    "kisit": 6,                      # "birim yalnizca tanimli kumeden" soylenebiliyor
}


def olgu(model):
    return (len(model["varliklar"]) + sum(len(a) for a in model["oznitelikler"].values())
            + len(model["iliskiler"]) + model["kisit"])


print("karar               varlik  oznitelik  iliski  kisit  olgu")
for ad, m in (("ortak tanim", KAVRAMSAL), ("Belge oznitelige", INDIRGENMIS),
              ("birim varliga", YUKSELTILMIS)):
    print(f"{ad:18s}  {len(m['varliklar']):6d}  "
          f"{sum(len(a) for a in m['oznitelikler'].values()):9d}  "
          f"{len(m['iliskiler']):6d}  {m['kisit']:5d}  {olgu(m):4d}")
print()
ADAY = ("kabul formu", "ariza raporu", "test kaydi", "teslim tutanagi")
tum_durum = [k for n in range(len(ADAY) + 1) for k in combinations(ADAY, n)]
tek_degerli = [d for d in tum_durum if len(d) <= 1]
print("bir is emrinin belge durumu -> toplam", len(tum_durum),
      "| varlik bicimi gosteriyor:", len(tum_durum),
      "| oznitelik bicimi:", len(tek_degerli))
print("gosterilemez hale gelen durum:", len(tum_durum) - len(tek_degerli))
```

```
karar               varlik  oznitelik  iliski  kisit  olgu
ortak tanim              5         12       4      5    26
Belge oznitelige         4         11       3      4    22
birim varliga            6         12       5      6    29

bir is emrinin belge durumu -> toplam 16 | varlik bicimi gosteriyor: 16 | oznitelik bicimi: 5
gosterilemez hale gelen durum: 11
```

Belgeyi özniteliğe indirmek modeli **26 olgudan 22 olguya** düşürüyor: bir varlık, bir
öznitelik, bir ilişki ve bir kısıt kayboluyor. Kaybolan kısıt "belge yalnızca kendi iş
emrine ait" kısıtıdır ve bunun sebebi yapısaldır — belge artık ayrı bir şey olmadığı için
kime ait olduğu sorusu sorulamaz hâle gelmiştir. Daha ağır olan sonuç ikinci satırdadır:
bir iş emrinin belge durumu için **16 olası durumun 11'i** artık gösterilemiyor, çünkü tek
değerlik bir öznitelik ancak boş kalabilir ya da tek bir belge taşıyabilir.

Ters yön de ücretsiz değildir. `birim` özniteliğini kendi varlığına yükseltmek olgu
sayısını **26'dan 29'a** çıkarıyor: bir varlık, bir ilişki ve bir kısıt ekleniyor. Karşılığı
somuttur — birim değerlerinin kümesi kapanır, yani modelde tanımlı olmayan bir birim
yazılamaz. Yükseltmenin bedeli üç olguluk ek bakım yüküdür; indirgemenin bedeli dört
olguluk kayıp ve on bir gösterilemez durumdur. **İkisi de bedelsiz değildir ve ikisi de
sayılabilir.**

Buradan bir karar ölçütü çıkar ve ölçüt bir zevk meselesi değil, üç soruya verilen
yanıttır. Bir olgunun kendi varlığı olmayı hak edip etmediği şuradan bakılarak anlaşılır:
kendi öznitelikleri var mı, kendi başına başvurulması gerekiyor mu, ve bir üst varlığa
**birden çok** kez bağlanabiliyor mu. Belge üçünde de olumlu yanıt veriyor — türü ve
tarihi var, ait olduğu iş emri sorulabiliyor, ve bir iş emri birden çok belge taşıyor.
`birim` ise yalnız üçüncüde olumsuz: bir parçanın tek birimi vardır. Bu yüzden birimi
yükseltmek gösterilebilen durum sayısını hiç değiştirmiyor, yalnız bir kısıt kazandırıyor
ve üç olgu ekliyor. **Karar, kazanılan kısıt ile eklenen olgunun karşılaştırılmasıdır.**

## Kısıtlar da Birer Olgudur

Yirmi altı olgunun beşi kısıttır ve bunlar diyagramın çizgilerinde değil, yanına yazılan
notlarda durur. Bu ayrım gösterimin en zayıf yeridir: kutu ile ok bir biçim dilinin
parçasıdır ve mekanik olarak işlenir, not ise serbest metindir. Beş kısıtın üçü ilişkisel
yapının araçlarıyla yazılabilir, ikisi yazılamaz — hangisinin hangisi olduğu ve
yazılamamanın **yapısal sebebi** sonraki dersin konusudur.

İki kısıtın biçimine şimdiden bakmak, farkın nereden geldiğini sezdirir. "Parça kodu
benzersiz" tek bir sütuna bakar ve iki satırı karşılaştırır. "Bir iş emri en az bir parça
ister" ise tek bir satıra bakarak yanıtlanamaz; bir iş emrine bağlı **satırların
sayısını** sorar. Üçüncüsü daha da uzaktır: "bir usta aynı anda tek tezgahta" iki satırın
zaman aralıklarının **kesişip kesişmediğini** sorar, ve kavramsal modelde zaman diye bir
öznitelik yoktur. Üç kısıt üç ayrı türden yüklemdir; birinin yazılabilmesi ötekinin de
yazılabileceği anlamına gelmez.

Şimdilik kaydedilmesi gereken şudur: bir kısıt, gösterimde bir not olduğu sürece
**modelin bir olgusudur**; ama gösterimden şemaya inerken not taşınabilir bir yapıya
çevrilemezse, kimse onu silmeden ortadan kalkar.

## Özet

- Kavramsal model bakım atölyesi için 26 olgu söylüyor: 5 varlık, 12 öznitelik, 4 ilişki,
  5 kısıt. Olgu sayımı bu konunun ölçü birimidir.
- Kardinalite ilişkinin bütününe yazılır ve yalnız üst sınırları söyler; çokluk her uca
  ayrı yazılır ve alt sınırı, yani katılımı da taşır. Aradaki fark ilişki başına iki bittir.
- Kardinalite yazılıp katılım ve öznitelik zorunluluğu yazılmadığında aynı gösterime
  1.048.576 sistem düşüyor: 256 katılım seçiminin 4096 zorunluluk seçimiyle çarpımı.
  Sekiz katılım işareti eklendiğinde 4096, on iki zorunluluk işareti de eklendiğinde 1 kalıyor.
- Bir olguyu varlık yerine öznitelik kurmak modeli 26 olgudan 22'ye indiriyor ve bir iş
  emrinin 16 belge durumundan 11'ini gösterilemez yapıyor; ters yönde yükseltmek olguyu
  29'a çıkarıp bir kısıtı söylenebilir hâle getiriyor.
- Kısıtlar da modelin olgusudur, ama diyagramda not olarak durdukları için taşınmaları
  biçim diline değil, sonraki düzeyin araçlarına bağlıdır.

## Sonraki Adım

Bu ders modeli tek bir düzeyde tuttu ve o düzeyin neyi söylemediğini saydı. Sıradaki ders
düzeyi değiştirir: aynı 26 olgu ilişkisel bir yapıya çevrilirken iki N:M ilişkisi ara
tabloya açılır, tablo sayısı 5'ten 7'ye çıkar, ve beş kısıttan ikisi düşer. Düşen iki
kısıtın neden düştüğü tahmin edilmez; hangi yüklemi hangi aracın yazamadığı tam sayımla
gösterilir.
