İçeriğe geç

SQL mi, NoSQL mi? — Önce Erişim Desenini Yaz

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

30 saniyede özet

NoSQL tek bir şey değil, dört farklı dolap tipi: her biri başka bir soruyu hızlı cevaplar. İlişkisel veritabanı ise çok tabloya birden dokunan işlerde ve önceden bilinmeyen sorularda güçlüdür. Seçimi, veriye nasıl soru soracağın belirler.

Ekip sipariş sistemini “şema esnek olsun” diye bir doküman veritabanında kurdu. Altı ay sonra finans, siparişleri müşteri ve ürünle birleştiren raporlar istedi. Şimdi her gece veriyi bir SQL veritabanına kopyalayan bir iş çalışıyor.

Her dolap bir soruya hızlı cevap verir.
Adım adım oku
  1. Siparişi müşteri ve ürünle birleştiren rapor, tablolar ve anahtarlarla çalışan ilişkisel veritabanının işidir.
  2. Bir siparişi bütün kalemleriyle tek parça getirmek, doküman veritabanının güçlü olduğu yerdir.
  3. Bir oturumu anahtarıyla anında bulmak anahtar-değer deposunun, arkadaşın arkadaşını bulmak graf veritabanının işidir.
  4. NoSQL tek bir şey değil, dört ayrı dolap. Önce en çok soracağın soruyu bil, dolabı ona göre seç.
  1. Bayt: Şema esnek olsun diye sipariş sistemini doküman veritabanında kurduk.

  2. Sen: Altı ay sonra ne oldu?

  3. Bayt: Finans siparişi müşteri ve ürünle birleştiren raporlar istedi. Şimdi her gece veriyi SQL'e kopyalıyoruz!

  4. Bayt: Veritabanı seçmek, en çok hangi soruyu soracağını bilmektir.

İlişkisel model neyi garanti eder?

İlişkisel veritabanı veriyi tablolara böler ve tabloları anahtarlarla birbirine bağlar. Aynı bilginin tek yerde durmasına 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 → denir.

İki güçlü yanı var. Birincisi ACIDTransaction'ın dört garantisi: ya hepsi ya hiçbiri (atomicity), kurallar korunur (consistency), eşzamanlı işler birbirini bozmaz (isolation), onaylanan kalır (durability).Sözlükte gör → transaction: sipariş ve stok birlikte değişir ya da hiçbiri değişmez. İkincisi SQL: yarın sorulacak ve bugün bilinmeyen bir soruyu da cevaplar.

Atomicity
Bölünmezlik: ya hepsi olur ya hiçbiri.
Consistency
Tutarlılık: tablonun kuralları her zaman korunur.
Isolation
Yalıtım: aynı anda çalışan işler birbirini bozmaz.
Durability
Kalıcılık: onaylanan veri, elektrik kesilse de kaybolmaz.

PostgreSQL, SQL Server ve Oracle bu modelin üç motorudur. Farkları gerçektir ve sonraki derslerin konusu; ama modelleri aynıdır.

Kafam karıştı, daha basit anlat

İlişkisel veritabanı, her bilgiyi tek bir yerde tutan düzenli bir dolap gibidir. Müşterinin adresi bir kez yazılır, siparişler ona yalnızca işaret eder.

Hızlı kontrolBaşlangıç

İlişkisel bir veritabanını, NoSQL modellerinin çoğundan ayıran iki güçlü yan hangisi?

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

NoSQL tek bir şey değil

“NoSQL” dört farklı modelin ortak adıdır. Ortak noktaları, belirli bir erişim desenini ucuz yapmak için ilişkisel modelin bir kısmından vazgeçmeleridir.

ModelÖrnekUcuz yaptığı şey
DokümanMongoDBBirlikte okunan veriyi tek dokümanda getirmek
Key-valueRedisAnahtarla çok hızlı okuma ve yazma
Wide-columnCassandraÇok yüksek yazma hızı, yatay büyüme
GraphNeo4jİlişkiler üzerinde çok adımlı gezinme
Kafam karıştı, daha basit anlat

NoSQL tek bir veritabanı değil, dört farklı dolap türünün ortak adıdır. Her biri belli bir işi hızlandırmak için başka bir kolaylıktan vazgeçer.

Hızlı kontrolBaşlangıç

Her ihtiyacı, onu en doğal karşılayan veri modeline yerleştir.

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

Sınıflandırılmamış

İlişkisel

Çok tablolu transaction, öngörülmemiş sorgular.

    Doküman

    Birlikte okunan veri tek parça.

      Key-value

      Anahtarla hızlı okuma-yazma, süre dolumu.

        Wide-column

        Çok yüksek yazma, bilinen sorgular.

          Graph

          İlişkiler üzerinde çok adımlı gezinme.

            Cassandra'da `orders_by_customer` tablosu var. Ürün ekibi şimdi "bir ürünü alan tüm müşteriler" sorusunu soruyor. Wide-column modelinde tipik cevap ne?

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

            Kendin gör

            İş yükü mü, veritabanı mı — hangisi önce seçilir?

            Tohum 164447
            1. Siparişi oluştur ve stoğu düş — ikisi birlikte ya da hiçbiri
            2. Finans ekibinin ad-hoc raporları: JOIN, GROUP BY, önceden bilinmeyen sorgular
            3. Siparişi id ile getir
            Hız
            Adım 0

            Şu an ne oldu?

            Sipariş ve stok için Doküman (MongoDB)

            İş yükünün erişim desenleri tek tek bu veri modeline karşı denenecek.

            Görevler0/3

            • En az iki ihtiyacın modelle kavga ettiği bir seçim yapaçık

              İpucu

              Sipariş raporlarını anahtar-değer deposunda düşün.

            • Değişken özellikli kataloğu ilişkisel modelde doğal çalıştıraçık

              İpucu

              Esnek şema tek başına NoSQL gerektirir mi?

            • Üç adımlık arkadaş önerisini doğal çalıştıran modeli bulaçık

              İpucu

              İlişkinin kendisinin veri olduğu model.

            Olay günlüğü (0)

            Henüz olay yok. Oynat veya adımla.

            1. Varsayılanla oynat. Siparişler dokümanda: raporlar ve çok tablolu işlem bedelli.
            2. Veri modelini key-value yap. İki ihtiyaç modelle kavga ediyor.
            3. Ürün kataloğu ve ilişkisel model seç. Değişken özellikler de doğal.
            4. Arkadaş önerisini dene. Yalnızca graph üç adımı doğal yapıyor.
            5. IoT ölçümlerinde wide-column ile ilişkiseli karşılaştır.
            Hızlı kontrolBaşlangıç

            Simülatörde sipariş iş yükü key-value deposuyla iki ihtiyaçta 'modelle kavga' verdi. Hangi ikisi ve neden?

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

            Hangi soruyu soracaksın?

            Katalogda her kategorinin farklı özellikleri var: ekran boyutu, kumaş, ISBN. Bu, doküman veritabanı gerektirir mi? Cevabı göster

            Gerektirmez. Ortak alanlar kolonda, değişen alanlar bir JSON kolonunda durabilir. PostgreSQL’in JSONB tipi indekslenebilir; SQL Server ve Oracle da JSON’u destekler.

            “Şemasız” veri yoktur. Şema veritabanında değilse uygulama kodunda yaşar; buna schema-on-readVerinin biçimini veritabanının değil, veriyi okuyan uygulamanın bilmesi. Şema ortadan kalkmaz; koda taşınır ve eski biçimler yenileriyle yan yana birikir.Sözlükte gör → denir. Kontrol eden kimse olmadığı için eski ve yeni biçimler yan yana birikir.

            Karar için önce soruları yaz: hangi veri birlikte okunuyor, neyin atomik değişmesi gerekiyor, hangi sorgular önceden bilinmiyor? Veritabanı, bu listeye en az kavga eden modeldir.

            Bir bankanın ödeme ekibi bu listeyi yazsa nasıl görünürdü, merak ettin mi? Aşağıda önce sorular, sonra her soruya uyan dolap var.

            Derinleş · Ödeme ekibi: önce sorular, sonra dolaplar 4 dosya · ~63 satır · ilk okumada atlayabilirsin
            Proje dosyaları

            docs/ access-patterns.txt Ekibin veriye soracağı dört soru ve her birine uyan model.

            docs/access-patterns.txt
            Questions the payments team will ask the data, written before choosing a database.
            1. Move money between two accounts: debit, credit and ledger lines change
            together or not at all. -> relational, ACID transaction
            2. How many payments did this card make in the last few minutes?
            Asked on every card authorization; the answer may expire. -> key-value
            3. KYC documents: ID card, passport, residence permit. Each type has its own
            fields, but compliance also reports across customers. -> relational + JSONB
            4. Questions nobody has asked yet (finance, the regulator). -> relational, SQL

            src/main/resources/db/migration/ V1__payments.sql Havale ve KYC belgeleri PostgreSQL'de: para NUMERIC, belgeye göre değişen alanlar JSONB kolonunda.

            src/main/resources/db/migration/V1__payments.sql
            CREATE TABLE account (
            iban varchar(34) PRIMARY KEY,
            customer_id bigint NOT NULL REFERENCES customer (id),
            currency char(3) NOT NULL,
            balance numeric(19,4) NOT NULL CHECK (balance >= 0)
            );
            CREATE TABLE ledger_entry (
            id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
            transfer_id uuid NOT NULL,
            iban varchar(34) NOT NULL REFERENCES account (iban),
            amount numeric(19,4) NOT NULL, -- negative = debit, positive = credit
            currency char(3) NOT NULL
            );
            -- Common fields as columns; fields that differ per document type in JSONB.
            CREATE TABLE kyc_document (
            id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
            customer_id bigint NOT NULL REFERENCES customer (id),
            doc_type text NOT NULL, -- ID_CARD, PASSPORT, RESIDENCE_PERMIT
            expires_on date NOT NULL,
            details jsonb NOT NULL
            );
            CREATE INDEX idx_kyc_details ON kyc_document USING gin (details);
            -- Question 4, answered without planning for it: passports issued abroad
            -- that expire this month.
            -- SELECT customer_id FROM kyc_document
            -- WHERE doc_type = 'PASSPORT' AND details @> '{"issuingCountry": "DE"}'
            -- AND expires_on < date_trunc('month', now()) + interval '1 month';

            redis/ card-velocity.txt Kart başına hız sayacı Redis'te: anahtarla okunur, süresi dolunca kendiliğinden silinir.

            redis/card-velocity.txt
            # Question 2. One counter per card per 5-minute window, bumped on every authorization.
            INCR velocity:card:7f3c9a:202609251010
            EXPIRE velocity:card:7f3c9a:202609251010 300
            # The authorization service compares the returned count with the card's limit.
            # Losing this counter in a restart is acceptable; losing a ledger line is not,
            # which is why the money itself stays in PostgreSQL.

            counter-example/ card_tx_by_card.cql Şöyle de yazılabilirdi: kart işlemleri yalnızca Cassandra'da; bak, yeni bir soru gelince ne oluyor.

            counter-example/card_tx_by_card.cql
            -- Cassandra. Designed for exactly one question: a card's transactions, newest first.
            CREATE TABLE card_tx_by_card (
            card_token text,
            month text,
            tx_time timestamp,
            tx_id uuid,
            merchant_id text,
            amount decimal,
            currency text,
            PRIMARY KEY ((card_token, month), tx_time, tx_id)
            ) WITH CLUSTERING ORDER BY (tx_time DESC, tx_id ASC);
            -- Six months later, fraud asks: every transaction at this merchant yesterday.
            SELECT * FROM card_tx_by_card WHERE merchant_id = 'M-1042';
            -- Rejected: merchant_id is not part of the key. ALLOW FILTERING would run it by
            -- reading every partition. The usual answer is a second table, card_tx_by_merchant,
            -- written alongside the first.
            Kafam karıştı, daha basit anlat

            Şemasız veri diye bir şey yoktur. Kuralı veritabanı tutmuyorsa, kodun tutmak zorundadır, ve kod bunu unutabilir.

            Hızlı kontrolOrta

            "MongoDB şemasız, o yüzden şema değişikliği derdimiz olmayacak." Bu cümledeki eksik ne?

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

            Tuzaklar

            “NoSQL ölçeklenir, SQL ölçeklenmez.” İlişkisel veritabanları çok büyük yükleri taşır; yatay büyümenin bedeli ise transaction ve sorgu esnekliğinden verilen tavizdir.

            Doküman içinde kopya veri. Müşteri adı yüz siparişe gömülüyse, ad değiştiğinde yüz dokümanı güncellemek gerekir.

            Cassandra’da “sonra sorgularız”. Tablolar sorguya göre tasarlanır; yeni bir soru çoğu zaman yeni bir tablo demektir.

            İki veritabanı, iki kat işletme. Her yeni motor yedekleme, izleme ve nöbet ister.

            Hızlı kontrolOrta

            Siparişler doküman veritabanında, müşteri adı her siparişin içine gömülü. Müşteri adını değiştirdi. Ne olur?

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

            Kendini sına

            Şimşek turu1/5

            NoSQL tek bir veritabanı türünün adıdır.

            Soru 1/3Orta

            Bu durumda hangi veri katmanıyla başlarsın?

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

            SenaryoYeni bir e-ticaret sitesi: siparişler ve stok, kategoriye göre özellikleri değişen bir ürün kataloğu, kullanıcı oturumları. Ekip beş kişi, hepsi SQL biliyor. Trafik henüz küçük ama büyümesi bekleniyor.

            Aklında kalacak üç şey

            1. 1 NoSQL dört ayrı modelin ortak adıdır: doküman, anahtar-değer, geniş sütun ve graf. Her biri farklı bir soruyu ucuz yapar.
            2. 2 İlişkisel model, birden çok tabloya dokunan işlerde ve önceden bilinmeyen sorgularda güçlüdür. PostgreSQL, SQL Server ve Oracle bu modelin üç motorudur.
            3. 3 Esnek şema tek başına NoSQL sebebi değildir: şema bu kez uygulama kodunda yaşar, ilişkisel veritabanları da JSON sütunlarını destekler.
            Sonraki kapı İki kişi aynı anda aynı hesaptan para çekti. Transaction kullandın, ama yine de bir çekiş kayboldu. Neden? İzolasyon Seviyeleri — Aynı İsim, Üç Farklı Davranış · 9 dk

            5 kart sonraki derste seni bekliyor

            0/5 kart bu dersten toplandı

            Bu dersin üstüne kurulanlar

            Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.