İçeriğe geç
academia.sh

Ders 10 / 10

Modelden Şemaya

Yedi tablo ve yirmi beş alan için 100 alan kararı ve 14 tablo kararı veriliyor: toplam 114, kavramsal modelin söylediği 26 olgunun 4,4 katı. Modelin söylemediği her karar birinin verdiği ve modelde görünmeyen bir karardır.

İçindekiler

Önceki ders mantıksal düzeyde on üç alanın modelde adı hiç geçmeden ortaya çıktığını saydı ve düşen bir kısıtı kurtarmanın yolunun yine modelde bulunmayan bir alan eklemekten geçtiğini gösterdi. Bu ders son düzeye iner.

Fiziksel şema, mantıksal modeli saklanabilir hâle getirir. Sorusu şudur: bu dönüşüm kaç karar ister, bu kararların kaçını kavramsal model belirler, ve belirlemediklerini kim belirler. Yanıt, kursun en büyük oranını üretir ve kursun kuralını son kez ödetir: bir gösterimin ölçüsü taşıdığı simge değil, söylemediği için başkasına bıraktığıdır.

Fiziksel Düzeyin Sorduğu Sorular

Bir alanı saklanabilir yapmak için dört sorunun yanıtlanması gerekir: hangi tip, ne uzunluk, boş geçilebilir mi, varsayılan değeri ne. Bir tabloyu saklanabilir yapmak için iki soru daha vardır: birincil anahtar için bir dizin ve bir karakter kümesi. Bu altı sorunun hiçbiri isteğe bağlı değildir; yanıt verilmezse yerine bir öntanım geçer, ve öntanım da bir yanıttır.

  • VM14 — Fiziksel düzeyde her alan dört karar, her tablo iki karar ister. Liste ortak tanımındır ve bu derste genişletilmez.
  • VM15 — Bir kararın uydurulmuş olması, kavramsal modelin hiçbir olgusunun o kararı belirlememesi demektir. Uydurulmuş karar yanlış karar değildir; kaynağı modelde olmayan karardır.
"""M01/K06 ortak tanim (kesit): fiziksel duzeyin uydurdugu karar sayisi."""
ALAN_KARARI = ["tip", "uzunluk", "bos gecilebilirlik", "varsayilan deger"]
TABLO_KARARI = ["birincil anahtar dizini", "karakter kumesi"]

MANTIKSAL = {
    "IsEmri": ["anahtar", "no", "acilis", "durum", "Usta_anahtar"],
    "Usta": ["anahtar", "ad", "uzmanlik"],
    "Parca": ["anahtar", "kod", "ad", "birim"],
    "Tezgah": ["anahtar", "kod", "tur"],
    "Belge": ["anahtar", "tur", "tarih", "IsEmri_anahtar"],
    "IsEmri_Parca": ["anahtar", "IsEmri_anahtar", "Parca_anahtar"],
    "Usta_Tezgah": ["anahtar", "Usta_anahtar", "Tezgah_anahtar"],
}
KAVRAMSAL_OLGU = 26        # 5 varlik + 12 oznitelik + 4 iliski + 5 kisit


def fiziksel(tablolar):
    alan = sum(len(v) for v in tablolar.values())
    tablo = len(tablolar)
    return {"tablo": tablo, "alan": alan,
            "alan_karari": alan * len(ALAN_KARARI),
            "tablo_karari": tablo * len(TABLO_KARARI),
            "uydurulan_karar": alan * len(ALAN_KARARI) + tablo * len(TABLO_KARARI)}


F = fiziksel(MANTIKSAL)
print("tablo         alan  alan karari  tablo karari  toplam")
for ad, alanlar in MANTIKSAL.items():
    ak = len(alanlar) * len(ALAN_KARARI)
    tk = len(TABLO_KARARI)
    print(f"{ad:13s} {len(alanlar):4d}  {ak:11d}  {tk:12d}  {ak + tk:6d}")
print(f"{'toplam':13s} {F['alan']:4d}  {F['alan_karari']:11d}"
      f"  {F['tablo_karari']:12d}  {F['uydurulan_karar']:6d}")
print()
print("kavramsal modelin soyledigi olgu:", KAVRAMSAL_OLGU)
print("fiziksel semanin uydurdugu karar:", F["uydurulan_karar"])
print("oran:", round(F["uydurulan_karar"] / KAVRAMSAL_OLGU, 4))
print()
print("her karar yalniz iki secenekli olsa bile , ayni mantiksal modele karsilik gelen")
print("fiziksel sema sayisi:", 2 ** F["uydurulan_karar"])
print("basamak sayisi:", len(str(2 ** F["uydurulan_karar"])))
tablo         alan  alan karari  tablo karari  toplam
IsEmri           5           20             2      22
Usta             3           12             2      14
Parca            4           16             2      18
Tezgah           3           12             2      14
Belge            4           16             2      18
IsEmri_Parca     3           12             2      14
Usta_Tezgah      3           12             2      14
toplam          25          100            14     114

kavramsal modelin soyledigi olgu: 26
fiziksel semanin uydurdugu karar: 114
oran: 4.3846

her karar yalniz iki secenekli olsa bile , ayni mantiksal modele karsilik gelen
fiziksel sema sayisi: 20769187434139310514121985316880384
basamak sayisi: 35

Sistem: kavramsal model 26 olgu söylüyor. Gösterim: fiziksel şema 7 tablo ve 25 alan taşıyor. Bedel: bu şemayı yazmak için 114 karar verilmesi gerekiyor ve bunların hiçbiri kavramsal modelde yazmıyor. Oran 4,3846, yani modelin söylediğinin yaklaşık 4,4 katı kadar karar, modelin dışında verilir.

Son satır bu sayının gösterim diliyle karşılığıdır. Bir karar en az iki seçenek sunuyorsa — boş geçilebilir mi, evet ya da hayır — aynı mantıksal modele karşılık gelen fiziksel şema sayısı iki üzeri yüz on dörttür, otuz beş basamaklı bir sayı. Gerçek seçenek sayısı bundan büyüktür, çünkü tip ve uzunluk ikiden çok değer alır. Mantıksal model, bu şema kümesinin hepsine aynı anda uyar ve hiçbirini ötekine tercih etmez.

  • VM16 — Alt sınır sayımında her kararın yalnız iki seçeneği olduğu varsayılır; gerçek seçenek sayısı saklama ürününe göre değişir ve bu yüzden yazılmaz.

Kararın Sahibi Kim

Yüz on dört karar ortadan kalkmaz; yalnız sahibi değişir. Bir kararın üç olası sahibi vardır. Model onu bir olgu olarak söylemiş olabilir. Karar başka bir olgudan türetilebilir olabilir. Ya da bir kişi, kod yazarken ya da şema kurarken, kendi bildiğine göre yanıtlar.

Bu üçünün ayrımı ölçülebilir, ve ölçüm iki ayrı davranış gösterir.

  • VM17 — Bir kararın sahibi üçten biridir: modelde yazılı olgu, başka bir olgudan türetilmiş sonuç, ya da kişi. Model olgusu sayıldığında kavramsal modelin olgu sayısı büyür; türetilmiş karar sayıldığında büyümez.
"""114 kararin sahibi kim: modele tasimak ile bir kuraldan turetmek ayri islerdir."""
ALAN_KARARI = ["tip", "uzunluk", "bos gecilebilirlik", "varsayilan deger"]
TABLO_KARARI = ["birincil anahtar dizini", "karakter kumesi"]
MANTIKSAL = {
    "IsEmri": ["anahtar", "no", "acilis", "durum", "Usta_anahtar"],
    "Usta": ["anahtar", "ad", "uzmanlik"],
    "Parca": ["anahtar", "kod", "ad", "birim"],
    "Tezgah": ["anahtar", "kod", "tur"],
    "Belge": ["anahtar", "tur", "tarih", "IsEmri_anahtar"],
    "IsEmri_Parca": ["anahtar", "IsEmri_anahtar", "Parca_anahtar"],
    "Usta_Tezgah": ["anahtar", "Usta_anahtar", "Tezgah_anahtar"],
}
OZNITELIK = {"IsEmri": ["no", "acilis", "durum"], "Usta": ["ad", "uzmanlik"],
             "Parca": ["kod", "ad", "birim"], "Tezgah": ["kod", "tur"],
             "Belge": ["tur", "tarih"]}

KARARLAR = [(t, a, k) for t, alanlar in MANTIKSAL.items() for a in alanlar
            for k in ALAN_KARARI]
KARARLAR += [(t, None, k) for t in MANTIKSAL for k in TABLO_KARARI]


def sahibi(karar, ayar):
    t, a, k = karar
    kavramsal = a in OZNITELIK.get(t, [])
    if ayar["alan"] and kavramsal and k in ("tip", "uzunluk"):
        return "model"
    if ayar["zorunluluk"] and kavramsal and k == "bos gecilebilirlik":
        return "model"
    if ayar["yabanci"] and a is not None and a.endswith("_anahtar") \
            and k in ("tip", "uzunluk"):
        return "turetilmis"
    if ayar["butunluk"] and a == "anahtar" and k == "bos gecilebilirlik":
        return "turetilmis"
    return "kisi"


AYARLAR = [
    ("kavramsal model oldugu gibi", dict(alan=0, zorunluluk=0, yabanci=0, butunluk=0)),
    ("+ 12 oznitelige alan", dict(alan=1, zorunluluk=0, yabanci=0, butunluk=0)),
    ("+ 12 oznitelige zorunluluk", dict(alan=1, zorunluluk=1, yabanci=0, butunluk=0)),
    ("+ yabanci anahtar turetimi", dict(alan=1, zorunluluk=1, yabanci=1, butunluk=0)),
    ("+ varlik butunlugu", dict(alan=1, zorunluluk=1, yabanci=1, butunluk=1)),
]
print("toplam karar:", len(KARARLAR))
print()
print("yapilandirma                  modelde  turetilmis  kisi  model olgusu  toplam")
for ad, ayar in AYARLAR:
    pay = {"model": 0, "turetilmis": 0, "kisi": 0}
    for kr in KARARLAR:
        pay[sahibi(kr, ayar)] += 1
    olgu = 26 + pay["model"]
    print(f"{ad:28s}  {pay['model']:7d}  {pay['turetilmis']:10d}  {pay['kisi']:4d}"
          f"  {olgu:12d}  {olgu + pay['kisi']:6d}")
toplam karar: 114

yapilandirma                  modelde  turetilmis  kisi  model olgusu  toplam
kavramsal model oldugu gibi         0           0   114            26     140
+ 12 oznitelige alan               24           0    90            50     140
+ 12 oznitelige zorunluluk         36           0    78            62     140
+ yabanci anahtar turetimi         36          12    66            62     128
+ varlik butunlugu                 36          19    59            62     121

Tablonun son sütunu bu dersin en öğretici sayısıdır. İlk üç satırda toplam 140’ta sabit duruyor: modelin taşıdığı olgu ile kişinin verdiği karar birbirini birebir takas ediyor. Kavramsal modele on iki özniteliğin tip ve uzunluk bilgisini eklemek olgu sayısını 26’dan 50’ye çıkarıyor ve kişiye kalan kararı 114’ten 90’a indiriyor. Zorunluluk bilgisi de eklendiğinde olgu 62, kişiye kalan 78. Modeli zenginleştirmek karar sayısını azaltmıyor, kararın sahibini değiştiriyor — ve bu iyi bir takastır, çünkü modeldeki karar yazılıdır, okunabilir ve tartışılabilir.

Son iki satır ayrı bir şey yapıyor ve toplamı düşürüyor. Yabancı anahtar alanının tipi ve uzunluğu, başvurduğu birincil anahtardan türetilebilir; ayrıca birincil anahtarı oluşturan alan boş geçilemez — bu, İlişkisel Kuram kursunda kurulan varlık bütünlüğünün doğrudan sonucudur. Bu iki türetimle kişiye kalan karar 78’den 59’a iniyor ve toplam 140’tan 121’e düşüyor. Türetim, takastan farklıdır: modeli büyütmeden karar sayısını gerçekten azaltır, çünkü aynı bilgiyi iki kez söylemeyi gereksiz kılar.

Modelin Susması Kararı Görünmez Yapar

Kalan elli dokuz kararın her biri bir kişinin yanıtıdır ve bu yanıtın modelde bir izi yoktur. Bunun sonucu, kararın yanlış olması değildir; yanlışlığın gösterilemez olmasıdır. Tek bir alan üzerinde bakmak yeter.

  • VM18 — Parça kodu havuzu sekiz kodludur ve karar anında yalnız ilk beşi görülmüştür.
"""Tek bir uydurulan karar: Parca.kod alaninin uzunlugu. Model hicbir secenegi elemez."""
KOD = ["MK-01", "MK-002", "TR-08", "PL-7", "GK-1", "RD-1140", "HD-220-A", "SB-33012"]

print("uzunluk  reddedilen kod  hangileri")
for uzunluk in range(4, 11):
    red = [k for k in KOD if len(k) > uzunluk]
    print(f"{uzunluk:7d}  {len(red):14d}  {', '.join(red) if red else '-'}")
print()
print("kavramsal modelin bu karar hakkinda soyledigi olgu sayisi: 0")
print("veriden okunan en kucuk guvenli uzunluk:", max(len(k) for k in KOD))
print()
gorulen = KOD[:5]
secim = max(len(k) for k in gorulen)
sonra = [k for k in KOD if len(k) > secim]
print("karar aninda gorulen kod:", len(gorulen), "| secilen uzunluk:", secim)
print("sonradan gelen kod:", len(KOD) - len(gorulen),
      "| reddedilen:", len(sonra), "->", ", ".join(sonra))
uzunluk  reddedilen kod  hangileri
      4               6  MK-01, MK-002, TR-08, RD-1140, HD-220-A, SB-33012
      5               4  MK-002, RD-1140, HD-220-A, SB-33012
      6               3  RD-1140, HD-220-A, SB-33012
      7               2  HD-220-A, SB-33012
      8               0  -
      9               0  -
     10               0  -

kavramsal modelin bu karar hakkinda soyledigi olgu sayisi: 0
veriden okunan en kucuk guvenli uzunluk: 8

karar aninda gorulen kod: 5 | secilen uzunluk: 6
sonradan gelen kod: 3 | reddedilen: 3 -> RD-1140, HD-220-A, SB-33012

Yüz on dört kararın yalnız biri bu: Parca.kod alanının uzunluğu. Kavramsal model bu karar hakkında sıfır olgu söylüyor; parça kodunun benzersiz olduğunu söylüyor, kaç karakter olduğunu söylemiyor. Bu yüzden 4 ile 10 arasındaki her seçenek modele eşit derecede uygundur ve modele bakarak hiçbiri elenemez.

Kararı eleyen tek şey veridir, ve veri karar anında eksiktir. Karar veren kişi beş kod görmüş, en uzunu altı karakter, uzunluğu 6 seçmiş. Sonradan gelen üç kodun üçü de reddediliyor. Bu bir hata değil, bir tahmindir — ve tahmin olduğu modelde yazmıyor, çünkü modelde bu satır hiç yok. Beş yıl sonra o alana bakan biri, 6 sayısının bir alan kuralı mı yoksa bir günün tahmini mi olduğunu ayırt edemez.

Buradan kursun kuralının veri modellemedeki karşılığı çıkar: modelin sustuğu her yer bir karar yeridir, ve orada verilen karar modelde görünmediği için tartışılamaz. Yüz on dört sayısı bu yüzden bir şema büyüklüğü ölçüsü değil, bir görünmezlik ölçüsüdür.

Özet

  • Fiziksel şema her alan için dört, her tablo için iki karar ister. Yedi tablo ve yirmi beş alan 100 alan kararı ve 14 tablo kararı, toplam 114 karar üretir.
  • Kavramsal model 26 olgu söylüyor; fiziksel şema 114 karar uyduruyor. Oran 4,3846, yani modelin söylediğinin yaklaşık 4,4 katı.
  • Her karar yalnız iki seçenekli olsa bile aynı mantıksal modele karşılık gelen fiziksel şema sayısı 2 üzeri 114, otuz beş basamaklı bir sayıdır; mantıksal model bunların hepsine aynı anda uyar.
  • Kararı modele taşımak bir takastır ve toplamı değiştirmez: 12 özniteliğe alan ve zorunluluk bilgisi eklendiğinde olgu 26’dan 62’ye çıkarken kişiye kalan karar 114’ten 78’e iner, toplam 140’ta sabit kalır.
  • Kararı bir kuraldan türetmek toplamı gerçekten düşürür: yabancı anahtarın tipi başvurduğu anahtardan, anahtarın boş geçilemezliği varlık bütünlüğünden geldiğinde kişiye kalan 59, toplam 121 olur.
  • Modelin sustuğu bir karar görünmez olur: Parca.kod uzunluğu için model sıfır olgu söylüyor, karar anında görülen beş kod 6 uzunluğunu seçtiriyor, ve sonradan gelen üç kodun üçü de reddediliyor.

Kurs Kapanışı

On ders tek bir bakım atölyesini modelledi ve tek bir soruyu sordu: bir gösterim, sistemi kaç başka sistemden ayırt edemiyor. Kursun kuralı buydu — kaç sistemi birbirinden ayıramadığı yazılmayan gösterim ölçülmemiş sayılır. Her derste üç sayı yan yana durdu: sistemin gerçek olgu sayısı, gösterimin yazdığı simge sayısı, ve aradaki bedel.

Ders Sistem Gösterim Bedel
Gösterim Ailesi ve Kayıp 5 bağ, 11 gizli alan 20 simge 2048 sistem aynı diyagrama düşüyor
Sınıf Diyagramları aynı 5 bağ 25 ve 31 simge 25 simgede 64, 31 simgede 1 sistem kalıyor
Bileşen ve Yerleşim Diyagramları 6 sınıf, 203 bölüntü; 540 örten atama 3 kutu + 2 bağlantı en kaba çizim 10 bölüntüyle uyumlu; bağlantı simgeleri 540’ı 20’ye indiriyor, içerik simgeleri 1’e
Kullanım Senaryosu Diyagramları 20 olgu: 2 aktör, 3 senaryo, 5 bağ, 3 sahiplik, 7 iç adım 9 simge 512 sistem aynı diyagrama düşüyor; taban belirsizlik 128
Sıra Diyagramları 24 iz 1 diyagram, 1 iz kapsam 1/24 = 0,0417; dört diyagram 0,1667
Etkinlik Diyagramları 10 iş, 13 önkoşul 23 simge, 1 kısmi sıralama 168 tam sıralama kabul ediliyor, tek sıranın kapsamı 0,006; karar düğümü 492’ye taşıyor
Durum Makinesi Diyagramları 6 gerçek dizi 10 simge (4 durum, 6 geçiş) eksik kabul 2, fazla kabul 2; iki geçiş eklenince 0 ve 26 — on üç kat
Varlık–İlişki Modeli 26 olgu 26 yazılı öge 1.048.576 sistem aynı gösterime düşüyor
Kavramsal, Mantıksal ve Fiziksel Model 26 olgu 7 tablo, 25 alan 2 düşen kısıt, 13 uydurulan alan, 175 fazla kabul
Modelden Şemaya 26 olgu 7 tablo, 25 alan 114 uydurulan karar, modelin söylediğinin 4,4 katı

Tablonun ikinci okuması birincisinden değerlidir: gösterimi düzeltmek onu daha yanlış yapabilir. Durum makinesine iki geçiş eklemek reddedilen diziyi sıfırladı ama fazla kabulü on üç katına çıkardı. Bir olguyu varlıktan özniteliğe indirmek modeli sadeleştirdi ama on bir durumu gösterilemez yaptı. Düşen bir kısıtı kurtarmak, modelde hiç bulunmayan bir alan eklemeyi gerektirdi. Ayrıntı eklemek her zaman kazanç değildir ve kaybı sayılmadan eklenmez.

Üçüncü ve en pahalı sonuç veri modellemeden geldi: soyutlama düzeyi hem unutur hem uydurur, ve ikisi ayrı ayrı sayılır. Kavramsal modelden fiziksel şemaya inerken beş kısıttan ikisi düştü, ama modelde hiç yazmayan 114 karar ortaya çıktı. Unutulan iki kısıt görünürdü, çünkü modelde bir zamanlar yazıyorlardı; uydurulan 114 karar görünmez, çünkü hiç yazmadılar. Bir gösterimin en tehlikeli yanı sildiği şey değil, hiç söylemediği şeydir.

Kurs boyunca hiçbir diyagram çizilmedi. Her gösterim, taşıdığı bilgi ögelerinin listesi olarak kuruldu ve sayıldı; ölçülen şey resmin güzelliği değil, resmin kaç sistemi tek resme düşürdüğüydü. Hangi diyagram türünün hangi soruya uyduğu ve bir diyagram kümesini güncel tutmanın neye mal olduğu bu kursun soruları değildi; ikisi de Yazılım Mimarlığı müfredatının Mimari Karar ve Dokümantasyon kursunda ölçüldü ve buraya taşınmadı.

Bir sonraki kurs, İleri Algoritmalar ve Problem Çözme, aynı disiplini başka bir gösterim üzerinde sürdürür. Orada bir problemi tanınmış bir algoritmik kalıba indirgemek öğretilir — böl ve yönet, açgözlü seçim, dinamik programlama, geri izleme. İndirgeme de bir gösterim seçimidir: problemi bir kalıba oturtmak onun bazı yanlarını görünmez yapar, ve kalıbın koşulları sağlanmıyorsa yanıt sessizce yanlış çıkar. Bu yüzden o kursun merkezinde bir gerekçelendirme durur: optimal alt yapı ve örtüşen alt problem koşullarının sağlandığının gösterilmesi. Buradaki kural orada da geçerlidir — bir indirgemenin neyi düşürdüğü yazılmadıkça, indirgeme ölçülmemiş sayılır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat