Normalizasyon — Aynı Bilgi Neden Tek Yerde Durmalı?
Önce şunu oku: SQL mi, NoSQL mi? — Önce Erişim Desenini Yaz
30 saniyede özet
Müşterinin telefonu her havale satırında ayrı yazılıysa, birini değiştirince öbürleri eski kalır; son havaleyi silince müşteri de kaybolur. Normalizasyon her bilgiyi tek yere koyar. Bedeli okurken yapılan bir JOIN'dir.
Bir arkadaşının telefon numarasını, ona gönderdiğin her davetiyenin köşesine yazdığını düşün. Numara değişince bütün davetiyeleri tek tek bulup düzeltmen gerekir. Birini unutursan, iki farklı numara elinde kalır.
-
Bayt: Havaleler tablosuna müşterinin adını ve telefonunu da ekledim. Her şey tek tabloda, çok pratik.
-
Sen: Müşteri 7 telefonunu değiştirirse?
-
Bayt: Bir satırı güncelledim... öteki iki havalede eski numara duruyor!
-
Bayt: Aynı bilgi üç yerde yaşıyordu. Onu tek bir yere taşıyalım.
Aynı bilgi, üç yerde
Havale satırına müşterinin adını ve telefonunu da yazarsan, aynı müşteri her havalesinde bir kez daha kaydedilir. Bilgi tekrar ettikçe, onu her yerde aynı tutma işi de sana kalır.
Bu tekrarın yol açtığı üç klasik soruna anomali denir. Hepsinin kökü aynıdır: iki ayrı şey, müşteri ve havale, tek bir satırda yaşıyor.
Kafam karıştı, daha basit anlat
Bir bilgiyi birden çok yere yazarsan, onu her yerde aynı tutmak senin işin olur. Unutulan her kopya bir çelişkidir.
Havaleler tablosunda her satıra müşterinin adı ve telefonu da yazılıyor. Bunun temel sorunu nedir?
Güncelleme anomalisi nedir?
Üç anomali
Tek tabloda müşteri 9'un adı ve telefonu yalnızca tek havalesinin satırında yazılı. O havaleyi sildin. Müşteri 9'a ne olur? Cevabı göster
Banka onu tamamen unutur. Adı ve telefonu yalnızca o satırda duruyordu; havaleyle birlikte müşterinin bilgisi de silindi.
Adım adım oku
- Numara her davetiyeye ayrı yazılmış.
- Birini düzelttin, öteki ikisi eski kaldı.
- Adres defteri: numara yalnızca bir yerde.
- Davetiyeler kişinin sayfasına işaret ediyor.
Güncelleme anomalisi: bir kopyayı değiştirip ötekileri unutursun. Silme anomalisi: bir havaleyi silerken müşteriyi kaybedersin. Ekleme anomalisi: havalesi olmayan bir müşteriyi kaydedemezsin.
normalizasyonAynı bilginin veritabanında tek bir yerde durması için veriyi tablolara bölmek. Müşterinin adı her siparişte değil, müşteri tablosunda bir kez yazılır.Sözlükte gör → bu üçünü birden çözer: müşteriler kendi tablosunda, havaleler kendi tablosunda durur. Havale, müşteriye bir foreign keyBir tablodaki kolonun başka bir tablonun anahtarına işaret etmesi. Veritabanı, işaret edilen satırın gerçekten var olduğunu garanti eder.Sözlükte gör → ile işaret eder.
Kafam karıştı, daha basit anlat
Müşteriyi ve havaleyi ayrı tablolara koy, havale müşteriye numarasıyla bağlansın. Üç sorun birden gider.
Tek tabloda müşteri 9'un tek havalesi silindi. Neden bu bir silme anomalisidir?
Tek tablolu tasarımda henüz havalesi olmayan bir müşteriyi kaydetmek neden zordur?
Bedeli bir JOIN
Normalize edilmiş tasarımda havaleleri müşteri adıyla listelemek için iki tabloyu birleştirirsin. Anahtar kolonları indeksliyse bu JOIN çoğu zaman ucuzdur.
Okuma çok ağırsa ve bir alan nadiren değişiyorsa, onu bilerek kopyalamak, yani denormalizationOkumayı hızlandırmak ya da o anın gerçeğini saklamak için bir bilgiyi bilerek kopyalamak. Asıl kaynak tek yerde kalır, kopya oradan güncellenir.Sözlükte gör →, mantıklı olabilir. Ama doğru kaynak yine tek yerde kalır ve kopya oradan güncellenir.
Kafam karıştı, daha basit anlat
Normalizasyonun bedeli okurken bir JOIN. Gerekirse kopyala, ama tek doğru kaynağı koru.
Normalize edilmiş şemada havaleleri müşteri adıyla listelemek neyi gerektirir?
Kendin gör
Aynı bilgi kaç yerde?
Tohum 104074Oynat ya da adımla.
Şu an ne oldu?
Müşteri 7'nin telefonunu değiştir
Tek tablo (müşteri bilgisi her satırda)
Görevler0/3
Aynı müşteriye iki farklı telefon numarası veraçık
İpucu
Varsayılan ayarlar yeter.
Bir havaleyi silerken müşteriyi de kaybetaçık
İpucu
Tek havalesi olan müşteri.
Henüz havalesi olmayan bir müşteriyi kaydetaçık
İpucu
Müşterinin kendi tablosu olmalı.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Tek tabloda telefonu güncelledin, iki satır eski kaldı.
- İşi “tek havalesini sil” yap. Müşteri 9 havaleyle birlikte kayboldu.
- “Yeni müşteriyi kaydet” seç. Tek tabloda havalesiz müşteriye yer yok.
- Tasarımı iki tabloya çevir. Üç sorun da kayboldu; rapor için bir JOIN geldi.
Foreign key ne işe yarar?
Tuzaklar
Geçmişi normalize etmek. Havale anındaki adres ya da fiyat, o anın gerçeğidir. Müşterinin bugünkü adresine bağlarsan eski dekontlar değişir; bu bilgi havaleye kopyalanmalıdır.
Kopyanın sahibini unutmak. Denormalize ettiğin bir alanı iki yerde güncellersen iki doğru kaynak yaratırsın. Kopya yalnızca asıl kaynaktan güncellenir.
Gereğinden fazla bölmek. Her küçük alanı ayrı tabloya koymak, her okumayı beş JOIN’e çevirir. Birlikte değişen ve birlikte okunan bilgiler aynı tabloda kalabilir.
Kafam karıştı, daha basit anlat
O anın gerçeğini kopyala, kopyanın tek sahibi olsun, gereğinden fazla bölme.
Müşteri adresini değiştirdi. Eski havale dekontlarında da yeni adres mi görünmeli?
Aşağıdaki örnek bir bankanın havale şemasından: müşteri tek yerde, havale ona bağlı, havale anındaki alıcı adı bilinçli olarak kopyalanmış.
Derinleş · Havale şeması: müşteri tek yerde, o anın gerçeği havalede 3 dosya · ~24 satır · ilk okumada atlayabilirsin
Kendini sına
Aynı bilgi birden çok satırda tekrar ederse, güncellerken bazı kopyalar eski kalabilir.
Bir rapor her gün milyonlarca havaleyi müşteri adıyla okuyor ve ad nadiren değişiyor. Hangi yaklaşım makul?
Aklında kalacak üç şey
- 1 Aynı bilgi birden çok satırda tekrar ederse, birini değiştirip ötekileri unutmak çelişkili veri üretir. Buna güncelleme anomalisi denir.
- 2 Ayrı varlıklar tek satırda yaşarsa, birini silmek ötekini de götürür ve biri ötekisi olmadan kaydedilemez. Silme ve ekleme anomalileri buradan doğar.
- 3 Normalizasyon her bilgiyi tek tabloya koyar ve tabloları anahtarlarla bağlar. Bedeli okurken yapılan JOIN'dir; okuma çok ağırsa bilinçli denormalizasyon yapılır.
4 kart sonraki derste seni bekliyor