Ana içeriğe geç

Yan yana

SQLvsNoSQL

SQL ile NoSQL veritabanları arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

SQL veritabanları veriyi sabit şemalı, ilişkili tablolarda saklar; NoSQL ise belge ya da anahtar-değer gibi, sunuculara yayılabilen esnek modeller kullanır.

SQL

Yapılandırılmış Sorgulama Dili

SQL, ilişkisel veritabanlarıyla çalışmanın standart dilidir; tablo oluşturmak ve içindeki veriyi eklemek, sorgulamak, güncellemek ve silmek için kullanılır.

SQL sayfasını oku

NoSQL

Not Only SQL (Yalnızca SQL Değil)

NoSQL, veriyi ilişkisel tablolar yerine doküman, anahtar-değer çifti, geniş sütun ya da çizge gibi başka modellerde saklayan veritabanı ailesidir.

NoSQL sayfasını oku

SQL ve NoSQL karşılaştırması

ÖzellikSQLNoSQL
Veri modeliAnahtarlarla bağlanmış satır ve sütunlardan oluşan tablolarBelgeler, anahtar-değer çiftleri, geniş sütunlar ya da çizgeler
ŞemaVeri yazılmadan önce tanımlanan sabit şemaEsnek şema; kayıtların biçimi farklı olabilir
Sorgu diliJoin, gruplama ve alt sorgular içeren standart SQLVeritabanına özgü API'ler ya da SQL benzeri diller
İlişkilerTablolar arası join'ler temel bir özelliktirİlişkili veri genellikle gömülür ya da çoğaltılır
TutarlılıkVarsayılan olarak güçlü ACID işlemleriÇoğunlukla nihai tutarlılık; işlem desteği değişir
ÖlçeklemeGenellikle dikey ölçeklenir; yatay ölçekleme replikalar ya da sharding gerektirirBirçok sunucuya yatay ölçeklenecek biçimde tasarlanmıştır
En uygun olduğu yerSiparişler ve ödemeler gibi net ilişkileri olan yapılandırılmış veriDevasa hacimler, değişen yapılar ya da ölçekte basit sorgular

Fark, açıklamalı

SQL veritabanları, ilişkisel veritabanları olarak da anılır; veriyi satır ve sütunlardan oluşan tablolarda saklar ve SQL (Yapılandırılmış Sorgu Dili) ile sorgulanır. NoSQL ise belgeler, anahtar-değer çiftleri, geniş sütunlar ya da çizgeler gibi başka veri modelleri kullanan veritabanları için bir şemsiye terimdir ve genellikle kendi sorgu API'leriyle gelir.

Temel fark, yapının nasıl zorunlu kılındığıdır. İlişkisel bir veritabanı her satırı baştan tanımlanmış bir şemaya göre denetler ve tabloları yabancı anahtarlar ile join'lerle bağlar; bu, veriyi tutarlı tutar. Birçok NoSQL veritabanı ise her kaydın kendi biçimine sahip olmasına izin verir ve ilişkili veriyi bir arada saklar; bu, şema değişikliklerini ve yatay ölçeklemeyi (veriyi birçok makineye yaymayı) kolaylaştırır, karşılığında kayıtlar arasında daha az yerleşik garanti sunar.

İkisi çoğu zaman birlikte kullanılır. Tipik bir sistem siparişleri ve ödemeleri ilişkisel bir veritabanında, önbellek ve oturumlar için bir anahtar-değer deposunda, hızlı değişen içerik için de bir belge veritabanında tutar. Çizgiler de bulanıklaştı: birçok ilişkisel veritabanı artık JSON saklayıp dizinleyebiliyor, birkaç NoSQL veritabanı da çok belgeli işlemleri (transaction) destekliyor.

Sık yapılan bir yanlış, NoSQL'in 'hiç SQL yok' anlamına geldiği ya da her zaman daha hızlı olduğu düşüncesidir. Ad genellikle 'yalnızca SQL değil' (not only SQL) diye okunur, bazı NoSQL sistemleri SQL benzeri sorgu dilleri sunar ve hız erişim desenine bağlıdır: iyi dizinlenmiş bir ilişkisel veritabanı iş yüklerinin çoğu için çok hızlıdır.

Hangisini kullanmalısınız?

SQL şu durumlarda doğru seçim:

  • Verilerinizin net ilişkileri var ve tutarlı kalmaları gerekiyor.
  • Karmaşık sorgulara, raporlara ya da anlık join'lere ihtiyacınız var.
  • Ödemeler ya da stok güncellemeleri gibi işlemler ya hep ya hiç olmalı.
  • Şemanız oldukça kararlı ve iyi anlaşılmış.

NoSQL şu durumlarda doğru seçim:

  • Veri yapınız sık değişiyor ya da kayıtlar arasında farklılık gösteriyor.
  • Çok büyük hacimli okuma ve yazma yükünü birçok sunucuya yaymanız gerekiyor.
  • Erişim deseniniz, bir kaydı anahtarıyla getirmek gibi basit.
  • Ürün katalogları ya da kullanıcı profilleri gibi doğal olarak iç içe geçmiş veri saklıyorsunuz.

Kullanıcıları ve sipariş toplamlarını okumak

SQLjavascript
// SQL: data lives in separate tables; a join combines them
const result = await db.query(
  "SELECT u.name, o.total FROM users u " +
  "JOIN orders o ON o.user_id = u.id " +
  "WHERE u.active = true"
);
NoSQLjavascript
// Document database: orders are embedded inside each user
const users = await db
  .collection("users")
  .find({ active: true }, { projection: { name: 1, "orders.total": 1 } })
  .toArray();

Sık sorulan sorular

NoSQL, SQL'den daha mı hızlı?

Genel olarak değil. NoSQL veritabanları çok büyük ölçekte basit anahtar tabanlı sorgularda daha hızlı olabilir; ama iyi dizinlenmiş bir ilişkisel veritabanı çoğu uygulama için hızlıdır ve karmaşık sorgular çoğu zaman SQL'de daha kolay ve daha çabuktur.

SQL ve NoSQL birlikte kullanılabilir mi?

Evet. Birçok sistem temel iş verisini ilişkisel bir veritabanında tutar ve önbellek, oturum, arama ya da yüksek hacimli olay verisi için NoSQL depoları ekler. Bu karışıma çoğu zaman çok dilli kalıcılık (polyglot persistence) denir.

Yeni başlayan biri önce SQL'i mi NoSQL'i mi öğrenmeli?

Genellikle ilk adım olarak SQL daha iyidir. Tablolar, anahtarlar ve join'ler hemen her yerde karşınıza çıkar ve onları bilmek, NoSQL veritabanlarının nelerden vazgeçtiğini anlamayı kolaylaştırır.

Daha fazla

Ayarlar