İçeriğe geç

Normalizasyon — Aynı Bilgi Neden Tek Yerde Durmalı?

Başlangıç 8 dk Çok sık karşılaşılır

Ö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.

  1. Bayt: Havaleler tablosuna müşterinin adını ve telefonunu da ekledim. Her şey tek tabloda, çok pratik.

  2. Sen: Müşteri 7 telefonunu değiştirirse?

  3. Bayt: Bir satırı güncelledim... öteki iki havalede eski numara duruyor!

  4. 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.

Hızlı kontrolBaşlangıç

Havaleler tablosunda her satıra müşterinin adı ve telefonu da yazılıyor. Bunun temel sorunu nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Güncelleme anomalisi nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Üç 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.

Numara her davetiyede değil, adres defterinde tek yerde.
Adım adım oku
  1. Numara her davetiyeye ayrı yazılmış.
  2. Birini düzelttin, öteki ikisi eski kaldı.
  3. Adres defteri: numara yalnızca bir yerde.
  4. 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.

Hızlı kontrolOrta

Tek tabloda müşteri 9'un tek havalesi silindi. Neden bu bir silme anomalisidir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tek tablolu tasarımda henüz havalesi olmayan bir müşteriyi kaydetmek neden zordur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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.

Hızlı kontrolOrta

Normalize edilmiş şemada havaleleri müşteri adıyla listelemek neyi gerektirir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Aynı bilgi kaç yerde?

Tohum 104074

Oynat ya da adımla.

Hız
Adım 0

Ş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.

  1. Varsayılanla oynat. Tek tabloda telefonu güncelledin, iki satır eski kaldı.
  2. İşi “tek havalesini sil” yap. Müşteri 9 havaleyle birlikte kayboldu.
  3. “Yeni müşteriyi kaydet” seç. Tek tabloda havalesiz müşteriye yer yok.
  4. Tasarımı iki tabloya çevir. Üç sorun da kayboldu; rapor için bir JOIN geldi.
Hızlı kontrolOrta

Foreign key ne işe yarar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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.

Hızlı kontrolOrta

Müşteri adresini değiştirdi. Eski havale dekontlarında da yeni adres mi görünmeli?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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
Proje dosyaları

src/main/resources/db/migration/ V20__customers_and_transfers.sql Şema: müşteri ve havale ayrı tablolarda, foreign key ile bağlı.

src/main/resources/db/migration/V20__customers_and_transfers.sql
create table customers (
id bigint primary key,
name varchar(120) not null,
phone varchar(20) not null
);
create table transfers (
id bigint primary key,
customer_id bigint not null references customers (id),
amount numeric(19, 2) not null,
created_at timestamp not null,
-- Deliberate copy: the receipt shows the payee as it was at that moment.
payee_name varchar(120) not null
);
create index transfers_customer_idx on transfers (customer_id);

queries/ transfers-with-customer.sql Havale anındaki alıcı adı bilinçli kopya: dekont, müşteri adını değiştirse bile değişmez.

queries/transfers-with-customer.sql
-- One join over an indexed key: the price of storing each fact once.
select t.id, c.name, t.amount, t.created_at
from transfers t
join customers c on c.id = t.customer_id
where t.created_at >= :from
order by t.created_at desc;

queries/ update-phone.sql Sorgu: havaleleri müşteri adıyla listelemek için tek bir JOIN, indeksli anahtar üzerinden.

queries/update-phone.sql
-- One row, and every transfer sees the new number.
update customers set phone = :phone where id = :customerId;

Kendini sına

Şimşek turu1/4

Aynı bilgi birden çok satırda tekrar ederse, güncellerken bazı kopyalar eski kalabilir.

Soru 1/3İleri

Bir rapor her gün milyonlarca havaleyi müşteri adıyla okuyor ve ad nadiren değişiyor. Hangi yaklaşım makul?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 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. 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. 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.
Sonraki kapı İlk sayfa bir anda geliyor, 500. sayfa saniyeler sürüyor. Aynı 20 satır değil mi? Sayfalama — OFFSET mi, Keyset mi? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı