İçeriğe geç

Üçüncü Normal Forma Göre Tasarlayın, Sonra Geri Çekilin

28 dilde daha mevcut

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

A park seen from above: paths at right angles, and one diagonal shortcut that people kept walking, now deliberately paved, with the old worn track still faint beside it.
Görsel yapay zekâ ile üretilmiştir

Data Architect kursunun 2. bölümü olan Veriyi Anlam İçin Modellemek bölümündeki 6 modülden 5.‘i. Her modül kendi başına okunabilir. Önceki: Veriyi Ait Olduğu Yere Koyun · Sonraki: Modeli Salesforce’a Dönüştürün

Bu modülün yanıtladığı soru: Temiz, normalleştirilmiş bir modelden ne zaman bilerek uzaklaşmalıyım?

Önceki modülde size Üçüncü Normal Form’a göre tasarlamanızı söyledim.

Şimdi onu bozmanızı söyleyeceğim.

Bazen.

Bu önemli bir ayrım. Kazara dağınık bir veri modeli inşa etmek ile temiz bir modeli bilerek normalleştirmeden çıkarmak arasında büyük fark vardır. Verinin en başta nereye ait olduğunu anlamıyorsanız onu başka bir yere kopyalamak mimari değildir. Yalnızca çoğaltmadır.

Ama temiz mantıksal modeli anladığımda, veriyi onu tüketen insanlar ve sistemler için farklı biçimlendirme konusunda bilinçli bir karar verebilirim.

Mümkün olduğunda üçüncü normal forma göre tasarlayın. Sonra gerektiğinde geri çekilin.

Bu cümlenin ne söylemediğine dikkat edin. Üçüncü normal formun anlaşılmasının daha kolay olduğunu söylemiyor. Bazen daha zordur: tamamen normalleştirilmiş bir model tek bir iş fikrini beş nesneye dağıtabilir ve onu kullanan insanlar fikri kafalarında yeniden birleştirmek zorunda kalır. Normalleştirme bana her olgunun nereye ait olduğunu söyler. Okuması, kullanması ya da raporlaması en kolay biçimin bu olduğunu vaat etmez. Geri çekilmenin bir başarısızlık değil de bir tasarım becerisi olmasının nedeni tam olarak budur.

Gerçeği modelleyerek başlayın. Sonra o gerçeğin nasıl sunulması gerektiğine karar verin.

Köpeklere dönelim; bu kez bazı bilinçli seçimler yapıyoruz.

Irk: bir seçim listesi mi, yoksa kendi tablosu mu? Bu modülün ilerisinde size vereceğim sorulardan geçirin. Birden fazla sütun bilgi var mı? Evet: en azından boyut. Kaç değer var? Köpek kulüpleri birkaç yüz ırkı tanır (yalnızca American Kennel Club 205 ırk listeler); bu, yaklaşık 20’lik pratik kuralımın çok üstünde. Bu yüzden Irk kendi tablosunu hak eder ve her köpek kendi ırkına işaret eder. Bu, 1. modülden beri taşıdığımız soruyu çözer: Irk kendi başına bir kutudur.

Beceri Düzeyi: bir seçim listesi. Öğreniyor, İyi, Uzman. Üç etiket, haklarında söylenecek başka bir şey yok ve değişmeyecekler. Seçim listesi tam da bunun içindir.

Her köpek kaç numara biliyor? Cevap zaten modelde var: köpeğin Köpek Numarası kayıtlarını sayın. Ama eğitmen bu sayıyı her raporda, iki tablo üzerinden rapor kurmadan, sıralamak ve filtrelemek için istiyor. Bu yüzden geri çekilirim ve doğrudan köpeğin üzerinde bir Bilinen Numaralar sayısı tutarım. Bu bir kopyadır. Gerçek hâlâ Köpek Numarası’nda yaşar; sayı onun bir temsilidir ve onunla uyumlu kalmalıdır. Salesforce bize tam olarak bunu yapmanın temiz bir yolunu verir; onu 6. modülde göreceğiz.

Şimdi sürpriz: köpek okulu kedi de kabul etmeye başlıyor. Ne yaparız? Bir seçenek: Köpek tablosunun yanına bir Kedi tablosu, Köpek Numarası’nın yanına bir Kedi Numarası eklemek. Her şey ikiye katlanır: her ekrandan iki tane, her rapordan iki tane ve tavşan kabul ettikleri gün üç tane. Diğer seçenek: bir adım geri çekilip bir kedinin de bir sahibi, belki bir yetiştiricisi, bir ırkı, bir doğum tarihi ve sabırla bir iki numarası olduğunu fark etmek. Bir köpekle aynı olgular ve aynı ilişkiler. Bu yüzden genelleştiririz: köpek ya da kedi olarak bir Tür’ü olan bir Evcil Hayvan. Her ırk da bir türe aittir ve tür gerçekte orada yaşar: bir Labrador bir köpektir. Evcil hayvan bilerek bir kopya taşır, böylece her ekran ve rapor ırka bakmadan “köpek mi kedi mi?” diye başlayabilir. Bir bilinçli kopya daha ve 6. modülde kendine ait bir görev alıyor.

Bu, değişime göre tasarlamaktır ve bir ödünleşimdir. Çok erken genelleştirirseniz her şey, kimsenin anlamadığı bir tür alanı olan belirsiz bir “Şey” haline gelir. İşletme bana gerçekten ikinci türü getirdiğinde ve ikisi, buradaki köpekler ve kediler gibi, neredeyse her şeyi paylaştığında genelleştiririm. Kediler çok farklı olgular gerektirseydi iki kez düşünürdüm.

Ödünleşimlerden sonra evcil hayvan modeli Ayrıntılı veri modeli olarak evcil hayvan modeli. Evcil Hayvan, Köpek'in yerinde duruyor: Evcil Hayvan Kimliği, diğer adıyla mikroçip numarası, Sahip, Yetiştirici ve Irk kimlikleri, Tür (bir seçim listesi: köpek veya kedi), ad, doğum tarihi ve raporlama için tutulan Bilinen Numaralar sayısı. Irk artık bağlı (bir Evcil Hayvan bir Irk'tandır) ve kendi türü, adı ve boyutu var. Evcil Hayvan ile Numara arasındaki Evcil Hayvan Numarası'nda seçim listesi olarak beceri düzeyi ve öğrenme tarihi var; altındaki Numara Değerlendirmesi'nde tarih, beceri düzeyi ve değerlendiren kişi var. Önceden olduğu gibi bir Sahip Evcil Hayvanlara sahiptir ve bir Yetiştirici onları yetiştirir. sahibidir yetiştirir ırkındandır bilir bilinir değerlendirilir Sahip Sahip Kimliği KAYIT KIMLIĞI Ad Telefon ZIP Şehir Yetiştirici Yetiştirici Kimliği KAYIT KIMLIĞI Ad Şehir Evcil Hayvan Evcil Hayvan Kimliği KAYIT KIMLIĞI Mikroçip Numarası DIĞER ADIYLA Sahip Kimliği Yetiştirici Kimliği Irk Kimliği Tür (seçim listesi) Ad Doğum Tarihi Bilinen Numaralar (sayı) Irk Irk Kimliği KAYIT KIMLIĞI Tür (seçim listesi) Ad Boyut Evcil Hayvan Numarası Evcil Hayvan Numarası Kimliği KAYIT KIMLIĞI Evcil Hayvan Kimliği Numara Kimliği Beceri Düzeyi (seçim listesi) Öğrenme Tarihi Numara Numara Kimliği KAYIT KIMLIĞI Ad Zorluk Numara Değerlendirmesi Numara Değerlendirmesi Kimliği KAYIT KIMLIĞI Evcil Hayvan Numarası Kimliği Tarih Beceri Düzeyi (seçim listesi) Değerlendiren tam olarak bir sıfır veya bir bir veya çok sıfır veya çok © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Şimdi aynı türden seçimler, risklerin daha yüksek olduğu Steve Trucking’de.

Bir durakta bir ekibi gözünüzün önüne getirin. Teslimatın kalemleri var. Kurulumun bir kontrol listesi var. Her adım fotoğraf gerektiriyor. Alıcı imza atıyor.

Normalleştirilmiş model çok güzel: Teslimat → Teslimat Kalemi → Kurulum Kontrol Listesi → Fotoğraf; her biri ait olduğu yerde.

Sonra onu gerçekten kullanan insanlarla oturuyorum. Bir ekip günde yaklaşık on durak kapatıyor; garaj yollarında, çoğu zaman sinyal olmadan. Güzel modelim tek bir durağı bitirmek için onları ekranlar ve ilgili listeler labirentinden geçiriyorsa bir mimari sorunum var demektir.

Tasarladığımız tek şey veri modeli değil.

Bir sistem tasarlıyoruz.

Kusursuz biçimde normalleştirilmiş bir modelden bazen geri çekilmemin nedenlerinden biri bu: kullanıcı deneyimi.

Belki bir kavram teknik olarak kendi başına bir varlık olabilir, ama onu ayırmak çok az değer sağlayan bir karmaşıklık ekler. Belki birkaç düzey alt kaydı olan bir üst kayıt akademik olarak temizdir ama girmesi ve bakımı bir işkencedir. Belki kavram küçüktür, sabittir ve çoğunlukla bir seçim olarak kullanılır.

Burada yalnızca “Bu olgu teoride nereye ait?” diye sormayı bırakır ve “Bu sistem gerçekte nasıl kullanılacak?” diye sormaya başlarım.

Bu, fazladan bir tıklama hakkındaki her şikâyetin modeli düzleştirdiği anlamına gelmez. Kullanılabilirliğin meşru bir mimari girdi olduğu anlamına gelir.

Raporlama da yaygın bir nedendir.

Her Perakende Ortağı bir karne istiyor: bölgeye ve aya göre zamanında teslimatlar. Temiz modelde bir teslimat kendi dağıtım merkezini, DC de kendi bölgesini bilir. Teknik olarak bunu takip edebiliriz.

Ama raporlama aracı edebilir mi? Kendi raporlarını oluşturan insanlar edebilir mi? Soruyu, sorunun kendisinden daha karmaşık bir raporlama mimarisi olmadan yanıtlayabilirler mi?

İşte o zaman bölgeyi, tüketildiği yere daha yakın olacak şekilde teslimata kopyalayabilir ya da türetebilirim.

Artık çoğaltma getirdim. Dolayısıyla başka bir soruya ihtiyacım var: gerçeğin sahibi kim?

Kaynak değer değişirse kopyama ne olur? Değişmeli mi? Yoksa teslimat gerçekleştiğinde doğru olanı mı korumalı? Bunlar farklı gereksinimlerdir.

Normalleştirmeyi geri almak karmaşıklığı ortadan kaldırmaz.

Onu yer değiştirtir.

İşte Salesforce yöneticilerinin sürekli karşılaştığı daha küçük bir örnek. Kullanıcının bir değerler kümesinden seçim yapması gerekiyor. Başka bir varlık oluşturup onunla ilişki mi kurarım, yoksa bir seçim listesi mi kullanırım?

Bir teslimatın durumunu alın: planlandı, yüklendi, dağıtımda, yaklaşıyor, teslim edildi, kuruldu, istisna, iade edildi. Kısa, sabit bir etiket listesi. Tam olarak istediğim şey bir seçim listesi.

Şimdi durak türünü alın: yalnızca teslimat, kurulumlu teslimat, eski ürünü götürmeli teslimat. Bunun kendine ait bilgileri var: durağın ne kadar sürdüğü, ekibin hangi becerilere ihtiyaç duyduğu, hangi kurulum kontrol listesinin geçerli olduğu. Bağımsız olarak değişir ve iş birimi onu yönetir. Bu bir etiket değil, bir varlıktır.

Teoride normalleştirilebilecek her kavram için bir nesne oluşturursam, teknik olarak güzel ama kimsenin kullanmaktan hoşlanmadığı bir sistem inşa edebilirim. Kolay olduğu için her kavramı bir seçim listesine dönüştürürsem çok hızlı bir şekilde kendimi köşeye sıkıştırabilirim.

Bu yüzden sorarım: kendine ait bilgisi var mı? İlişkileri? Bağımsız olarak değişiyor mu? Veri olarak yönetilmesi gerekiyor mu? İş birimi sonunda ondan bir etiketten fazlasını isteyebilir mi?

Bir tasarım oturumunda gerçekte sorduğum sorular şunlar.

Birden fazla sütun bilgi var mı? Değerin bir açıklamaya, bir süreye, bir beceri listesine, bir sahibe ihtiyacı varsa artık bir etiket değildir.

Kaç değer? Kabaca kuralım yaklaşık 20. 20 değeri geçince bir seçim listesi zorlanmaya başlar ve bir nesne düşünme zamanı gelir. Elli tanesiyle ABD eyaletleri katlandığımız istisnadır, ülkeler daha da kötüdür; dürüst olalım, ülke seçim listelerini seven var mı? Bence can sıkıcılar.

Değerler zamanla mı oluşturuluyor ve kim tarafından? Bir seçim listesi değeri eklemek bir yapılandırma değişikliğidir; yani bir yönetici gerektirir. İş birimi her hafta değer ekliyorsa ve ekleyenler yönetici değilse, bir seçim listesi her yeni değerin önüne bir talep kaydı koyar.

İnsanların ona göre filtreleme ve raporlama yapması gerekiyor mu? Seçim listeleri bunun için harikadır. Arama ilişkileri o kadar temiz değildir. Her arama ilişkisi bir adım daha ekler: bir rapor türü yalnızca kısa bir ilgili nesneler zincirini izler (özel bir rapor türü en fazla dört nesne ilişkisine izin verir), ekran ilgili listelerin içinde ilgili listelere dönüşür ve kod daha karmaşık hale gelir.

Bir değer listesi çoğu zaman hayata bir seçim listesi olarak başlar ve zamanla kendine ait bir nesneyi hak eder. Bırakın hak etsin.

Etiket mi, varlık mı? Durum ve durak türü İki kart. Teslimat durumu, bir seçim listesi: her biri tek bir sözcük ya da tireli bir sözcük olan sekiz sabit değer (Planlandı, Yüklendi, Dağıtımda, Yaklaşıyor, Teslim-Edildi, Kuruldu, İstisna, İade-Edildi) ve her biri yalnızca bir etiket. Durak türü, bir varlık: yalnızca teslimat, çamaşır makinesi ya da gazlı ocak kurulumlu teslimat, eski ürün alımlı teslimat, yalnızca eski ürün alımı, iade teslim alma ve 18 tane daha gibi yirmi dört ve artan değer; her birinin kendi durak süresi, gereken ekip becerileri ve kurulum kontrol listesi var. Altta bir not: yaklaşık 20 değeri aşıyorsa ya da kendi öznitelikleri varsa, bu bir etiket değil, bir varlıktır. Teslimat durumu bir seçim listesi DEĞERLER: 8 VE SABIT Planlandı Yüklendi Dağıtımda Yaklaşıyor Teslim-Edildi Kuruldu İstisna İade-Edildi HER DEĞER Yalnızca bir etiket Durak türü bir varlık DEĞERLER: 24 VE ARTIYOR Yalnızca teslimat Teslimat + kurulum: çamaşır makinesi Teslimat + kurulum: gazlı ocak Teslimat + eski ürün alımı Yalnızca eski ürün alımı İade teslim alma …ve 18 tane daha HER DEĞERIN KENDINE AIT Durak süresi Gereken ekip becerileri Kurulum kontrol listesi Yaklaşık 20 değeri aşıyorsa ya da kendi öznitelikleri varsa: bu bir etiket değil, bir varlıktır. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Birkaç bin kayıtla harika çalışan bir tasarım milyonlarca kayıtla çok farklı davranabilir.

Bu yüzden yalnızca diyagrama bakmayın. Sayıları bilin.

Steve Trucking yılda yaklaşık bir milyon teslimat yapıyor ve yılda yüzde 30 büyüyor. Her teslimat yaklaşık sekiz durum güncellemesi topluyor. Bu, bu yıl sekiz milyon durum kaydı ve üçüncü yılda yılda yaklaşık 13,5 milyon demek. Buna yılda dört beş milyon fotoğraf ekleyin.

Aynı model. Bambaşka bir mimari.

Architecting at Scale kursunda çok daha derine ineceğiz. Şimdilik hatırlayın: hacim bir veri modelleme kararını değiştirebilir. Mantıksal olarak doğru bir ilişki, her ölçekte otomatik olarak en iyi fiziksel tasarım değildir.

Şimdiye kadar operasyonel sistemi düşünüyorduk. Koordinatörler teslimatları rotalara yerleştirir. Ekipler durakları kapatır. Sistem, iş yürüdükçe değişir.

Ama iş birimi yılların geçmişini de analiz etmek ister. Hangi ortaklar ve bölgeler gecikiyor? Teslimat süresi nasıl değişti? Kurulumlar ne sıklıkla ikinci bir ziyaret gerektiriyor?

Analitik bir sistem aynı bilgiyi farklı düzenlenmiş halde isteyebilir. Veri ambarı, olgu (fact), boyut (dimension) ve yıldız şema gibi terimler duyacaksınız. Bunları burada açmıyoruz; Steve Trucking’de bu Snowflake ambarıdır ve kursun ilerleyen kısmında ona döneceğiz.

Şimdilik: farklı tüketiciler aynı gerçeğin farklı biçimlerine ihtiyaç duyabilir.

Ve şimdi bir tüketici daha var: yapay zekâ.

Bir Alıcı mesaj atıyor: “Teslimatım nerede?” Bir yapay zekâ asistanı şunu bulabilir:

Teslimat 10427, Rota 3312, Durak 7, Kamyon 117, Zaman aralığı 13.00–15.00.

Geleneksel bir uygulama bu ilişkileri izlemekten gayet memnundur. Ama Alıcıya yanıt vermek için asistanın birkaç yerden bir araya getirilmiş bağlama ihtiyacı vardır:

Redrock bulaşık makineniz, Phoenix dağıtım merkezinden çıkan bugünkü rotanın yedinci durağı. Kamyon üç durak uzaklıkta ve hâlâ 13.00–15.00 aralığınızdasınız.

Birkaç ilişkili varlıktan bilgi alıp belirli bir tüketici için daha düz, bağlam açısından zengin bir temsil oluşturduk.

Bu, normalleştirilmiş modelimi yok ettiğim anlamına gelmez. Ve kesinlikle “Yapay zekâ düz veriyi sever, o halde her şeyi dev bir nesneye koyun” anlamına gelmez. Bunu yapmayın.

Gerçeğin kaynağı temiz kalır. Yapay zekâ, yaptığı iş için oluşturulmuş bir temsil alır. Az önce analitikte gördüğümüz fikrin aynısı:

Tek bir gerçek kaynağı, tüketim için birden fazla biçimi destekleyebilir.

Temellendirme ve getirme (retrieval) konularına kursun ilerleyen kısmında çok daha derin gireceğiz.

Burada bir tehlike var.

Raporlama için bölgeyi teslimata kopyalarsam, Snowflake’e düzleştirilmiş bir sürüm gönderirsem ve yapay zekâ asistanı için bağlam açısından zengin bir sürüm oluşturursam, hangisi doğrudur?

Bu sorunun bir yanıta ihtiyacı var. Esas değerin nerede yaşadığını bilmek isterim. Geri kalan her şey, o gerçeğin bir amaç için oluşturulmuş bir temsilidir.

O yer kayıt sistemidir. Normalleştirilmemiş kopyalar iyi olabilir: durak ekranı, karne, Snowflake ve yapay zekâ bağlamı, her biri kendisi için oluşturulmuş bir biçimle işini daha iyi yapar ve onlara başvurmak sorun değildir. Ama bir şey değiştiğinde değişiklik kayıt sisteminde, genellikle ilişkisel modelde başlar ve oradan dışarıya, her kopyaya akar. Kimse bölgeyi Snowflake’te düzeltmez ya da yapay zekânın bağlamını elle düzenlemez. Kaynakta düzeltin ve değişikliğin akmasına izin verin.

Kayıt sistemi: değişiklik dışarı doğru akar Üstte tek bir kutu: değişikliklerin başladığı ilişkisel kayıt sistemi; ondan oluşturulan dört kopyaya aşağı doğru oklar akıyor: tek bir durağın hepsi tek sayfada olduğu ekip durak ekranı; bölgeye göre geciken teslimatları gösteren ortak karnesi; yılların geçmişini tutan Snowflake ambarı; ve “Teslimatım nerede?” sorusu için yapay zekâ teslimat bağlamı. Altta bir not: değişiklik kayıt sisteminde başlar ve her kopyaya dışarı doğru akar; asla bir kopyayı düzeltmeyin. Kayıt sistemi ilişkisel: değişiklikler burada başlar Ekip durak ekranı bir durak, hepsi tek sayfada Ortak karnesi bölgeye göre geciken teslimatlar Snowflake ambarı yılların geçmişi Yapay zekâ teslimat bağlamı “Teslimatım nerede?” Değişiklik kayıt sisteminde başlar ve her kopyaya dışarı doğru akar. Asla bir kopyayı düzeltmeyin. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Ve bu en çok veri değiştiğinde önemlidir. Bir dağıtım merkezi bugün başka bir bölgeye taşınırsa geçen ayın teslimatları yeni bölgeyi mi göstermeli? Belki. Belki de değil. Geçmiş için teslimat gerçekleştiğinde doğru olan bölgeye ihtiyacım olabilir. Bu artık bir eşitleme sorunu değil. Bu bir iş kararıdır.

Normalleştirmeyi geri almanın asla kazara olmaması gerekmesinin nedeni budur. Çoğaltılan her olgu sahiplik, eşitleme, geçmiş ve güven hakkında sorular doğurur. 1. bölümdeki ödünleşim düşüncesi budur: ne satın aldığınızı (daha kolay bir ekran, daha basit bir rapor, yapay zekâ için daha iyi bağlam) ve ne ödediğinizi (yinelenen veri, eşitleme, gerçeğin daha karmaşık sahipliği) bilin. Ve temiz bir mantıksal modelden başladığımız için her kopyayı gösterip şunu söyleyebiliriz: “Bunun oraya ait olduğunu biliyorum. Bu gereksinim yüzünden burada onun bir temsilini tutuyorum.” Bu, gözden geçirebileceğimiz, itiraz edebileceğimiz ve yazıya dökebileceğimiz bir karardır; böylece bir sonraki mimar nedenini bilir.

Normalleştirmeyi geri almayı düşünürken karar verdiğim şeyler:

  • Her iş olgusunun esas kaynağının nerede yaşadığı.
  • Temiz modelin kullanıcılar, raporlama, ölçek ya da performans için gerçek sorunlar yaratıp yaratmadığı.
  • Daha basit bir temsilin çoğaltmaya değip değmediği ve kopyanın nasıl güvenilir kalacağı.
  • Güncel kaynak değiştiğinde geçmiş değerlerin değişmesi gerekip gerekmediği.
  • Analitiğin ya da yapay zekânın verinin operasyonel sistemden farklı bir biçimine ihtiyaç duyup duymadığı.

Başlangıç noktası hiç değişmez: gerçeğin nereye ait olduğunu bilin. Sonra gereksinimler bunu haklı çıkardığında onu sunum için biçimlendirin.

Sırada Salesforce yeniden resme giriyor. Tasarladığımız şeyi bir fiziksel veri modeline dönüştüreceğiz.