Ana içeriğe geç
Kesit SQL
İleri · Bitirme Projeleri

Bitirme projesi (Backend): sepet özelliği için şema ve sorgular

Kısıtlı tablo tasarımı, idempotent ekleme, anahtar tabanlı sayfalama, işlemle sipariş oluşturma.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Senaryo

Anadolu Market mobil uygulamasına kalıcı sepet özelliği eklenecek. Kullanıcı sepete ürün ekler, adet değiştirir, siparişe çevirir. API ekibi senden şemayı ve uç noktaların çalıştıracağı sorguları istiyor.

Gereksinimler

Kısıt veritabanındaUygulama kodundaki doğrulamalar değişebilir; veritabanı kısıtları her zaman çalışır.

Adımlar ve beklenen çıktı

AdımNe yapacaksın?Ders
1. ŞemaSepet ve sepet satırı tabloları; tekillik, yabancı anahtar ve CHECK kısıtlarıKısıtlar ayrıntılı
2. Sepete ekleÜrün sepette varsa adedi artıran, yoksa ekleyen tek ifade (upsert)UPSERT ve MERGE
3. Ürün listesiOFFSET yerine son görülen anahtardan devam eden sayfalamaUygulamalarda sayfalama
4. Sepet özetiSatır tutarları ve genel toplamJOIN ile özetleme
5–6. Tasarım sorularıİşlem bütünlüğü ve tekrar eden isteklerTransaction, Uygulama veritabanı desenleri

Tasarım notları

Siparişe çevirme işleminin iskeleti

BEGIN;
-- 1) Sipariş başlığı
INSERT INTO orders (order_id, customer_id, order_date, status, channel)
VALUES (:yeni_id, :musteri, :bugun, 'shipped', 'mobile');
-- 2) Sepet satırlarını sipariş satırına kopyala (fiyat o anki fiyattır)
INSERT INTO order_items (order_id, product_id, quantity, unit_price, discount)
SELECT :yeni_id, ci.product_id, ci.quantity, p.price, 0
FROM cart_item ci JOIN products p ON p.product_id = ci.product_id
WHERE ci.cart_id = :sepet;
-- 3) Stok düş; stok yetmezse işlemi geri al
UPDATE products SET stock = stock - (SELECT ci.quantity FROM cart_item ci
                                     WHERE ci.cart_id = :sepet AND ci.product_id = products.product_id)
WHERE product_id IN (SELECT product_id FROM cart_item WHERE cart_id = :sepet);
-- 4) Sepeti boşalt
DELETE FROM cart_item WHERE cart_id = :sepet;
COMMIT;

Adımlardan biri hata verirse uygulama ROLLBACK çalıştırır ve hiçbir tablo değişmez. Stok kontrolü için 3. adımdan önce yetersiz stoklu satır olup olmadığı sorgulanabilir ya da CHECK (stock >= 0) kısıtı ihlali hatası yakalanabilir.

Karar

Uç noktaları yayına almadan önce sepet okuma ve ürün listesi sorgularının planını al, indeks kararını ve yazma bedelini kısa bir notla ekibe yaz. Sorgu ne sıklıkla çalışıyor, tablo ne sıklıkla yazılıyor? Bu proje sonunda şema, sorgular ve indeks birlikte teslim edilir.

Alıştırmalara geç (7)