NoSQL ve geleneksel bir RDBMS arasındaki farklar nelerdir?


71

NoSQL ve geleneksel bir RDBMS arasındaki farklar nelerdir?

Son birkaç ay boyunca, teknik haberlerde NoSQL sıkça bahsedilmiştir. Geleneksel bir RDBMS'ye göre en önemli özellikleri nelerdir? Farklılıklar hangi seviyede (fiziksel, mantıksal) gerçekleşir?

NoSQL'i kullanmak için en iyi yerler neresidir? Neden?

Yanıtlar:


61

NoSQL "Sadece SQL" anlamına gelmez ve genellikle veritabanının son on yılda çok popüler olan ilişkisel bir veritabanı olmadığı anlamına gelir.

NoSQL'in son birkaç yıldır bu kadar popüler olmasının nedeni, ilişkisel bir veritabanı bir sunucudan büyüdüğü zaman, artık kullanımı o kadar kolay olmama nedenidir. Başka bir deyişle, dağıtık bir sistemde çok iyi ölçeklenemezler. Google, Yahoo, Facebook ve Amazon'dan bahsettiğiniz büyük sitelerin tümü (Digg hakkında pek bir şey bilmiyorum) birçok veriye sahiptir ve verileri çeşitli nedenlerle dağıtılmış sistemlerde depolar . Verilerin bir sunucuya sığmaması veya yüksek kullanılabilirlik için gereksinimler olması olabilir .

CAP Teoremi

Dağıtılmış bir sistemin özellikleri CAP Teoremi ile tanımlanabilir . Üç özellikten yalnızca en fazla ikisine sahip olabilirsiniz:

  • C durumluk
  • Bir kullanılabilirlik
  • Şebeke toleransı P artitioning

Amazon Dynamo, üç özelliğin de hepsine yaklaşmak için Yaklaşan Tutarlılığı kullanıyor . Kağıt Dinamo: Amazon'un Yüksek Kullanılabilir Anahtar-Değer Deposu , NoSQL veritabanları ve dağıtılmış sistemler hakkında bilgi edinmeye değerdir. Amazon Dynamo, A ve P özelliklerine sahiptir.

Google , C ve A özelliklerine sahip olan BigTable ile farklı bir yaklaşım benimsemiştir .

Diğer NoSQL veritabanları

Başlangıçta yazdığım gibi, farklı gereksinimler için tasarlanmış birçok başka NoSQL veritabanı var. Neo4j gibi grafik veritabanları , CouchDB gibi belge veritabanları ve OrientDB gibi multimodel / nesne veritabanları .

Sonunda, ilişkisel veritabanlarının popüler kalacağını söylemek isterim. Çok esnek ve bakımı kolay. Ancak her zaman en iyi seçenek değildirler.


1
Güzel, ayrıntılı cevap.
TML

NoSQL ilişkisel olmayan anlamına gelmez, sadece bir SQL DBMS'den başka bir şey demektir.
nvogel

1
Son O'Reilly Strata Konferansı'nda, Mark Madsen, "NoSQL" in yeni bir yorumunu veri tabanındaki "No Only SQL" 'in yerini almak için kullanmaya davet etti. Şimdi: "Hayır, SQL" ;-)
Lukas Eder

6
“Sadece” bir iyileştirme değildi, ilk NoSQL hareketi ilişkisel veritabanlarına karşı nadiren karşı çıktı. Sonra gerçek dünyaya çarptılar.
Gaius

22

NoSQL çok geniş bir terimdir ve genellikle "Sadece SQL Değil" anlamına gelir. Bu terim RDBMS üyesi olmayan toplulukta iyiliğin dışında kalıyor.

NoSQL veritabanının birkaç ortak özelliği olduğunu göreceksiniz. Kabaca birkaç kategoriye ayrılabilir:

  • anahtar / değer depoları
  • Bigtable ilham veri tabanları (Google Bigtable makalesine dayanarak)
  • Dinamo ilham veritabanları
  • dağıtılmış veritabanları
  • belge veritabanları

Bu büyük bir sorudur, ancak bu Dağıtılmış Veritabanları Anketinde oldukça iyi cevaplanmıştır .

Kısa bir cevap için:

NoSQL veritabanları, başka toleranslar elde etmek için (bölüm toleransı, performans, yükü dağıtmak veya yeni donanımın eklenmesiyle doğrusal olarak ölçeklendirmek için) çeşitli ACID bölümleri ile dağıtılabilir.

Ne zaman kullanılacağı kadarıyla - bu tamamen uygulamanızın ihtiyaçlarına bağlıdır.


12

NoSQL, geleneksel bir RDBMS gibi sabit bir şemaya sahip olmayan bir tür veritabanıdır. NoSQL veritabanları ile şema geliştirici tarafından çalışma zamanında tanımlanır. Veritabanına karşı normal SQL ifadeleri yazmazlar, bunun yerine ihtiyaç duydukları verileri almak için bir API kullanırlar. NoSQL veritabanları genellikle aradığınız verinin hangi sunucuda olduğunu bilmeden farklı fiziksel sunucular arasında kolayca ölçeklenebilir.

Bununla birlikte, tüm bu esneklik için bazı avantajlar vardır: NoSQL veritabanları, SQL Server, Oracle, DB2, MySQL vb. Gibi RDBMS sistemlerine kıyasla oldukça eksiktir.

NoSQL yeni bir şey değil. Aslında 50-60 yıl civarında olmuştur. O zaman buna COBOL adı verildi. Aynı kesin fikir, sadece farklı bir grup ile geldi.


3
Nokta 1, çoğu (tümü?) NoSQL veritabanları için yanlıştır, eğer veritabanına yazmaların başarılı olup olmadığını umursamadığınızı açıkça belirtmediğiniz sürece. Örneğin, herhangi bir Hadoop destekli veritabanı, verileri cehennem veya yüksek su ile gelen üç yere yazacaktır. Varsayılan olarak, Cassandra üç konuma yazacak ve başarılı olduklarında yazının başarılı olduğunu kabul edecektir.
Jeremiah Peschka

3
Bu güncellemeleri yaparken eşzamanlılığı nasıl ele alıyor? Aralarında giden bir dağıtılmış tür işlemi var mı, yoksa elden önce ACKed yazma ve sunucular arka planda kalanı işliyor mu?
mrdenny

Eşzamanlılık tamamen uygulamaya bağlıdır. Riak, eşzamanlılık sağlamak için vektör saatlerini kullanır ve çelişkili yazma durumunda, çözüm için arama başvurusuna geri gönderilebilir. Diğerleri son yazma kazancını kullanır.
Jeremiah Peschka,

Yazma onayı ile ilgili olarak - çoğu durumda, yazma işlemleri OS'nin yazdığı mesajı kabul edene kadar onaylanmaz. Dayanıklı yazmaların onaylanmasını isteyecek kadar ileri gidebilirsiniz, bu da bitlerin işletim sistemi tamponu yerine diske atıldığı anlamına gelir. MongoDB varsayılan olarak belleğe yazıldığını kabul eder, ancak diske yazma onayı gerektirecek şekilde yapılandırılabilir. Çoğaltma, her ürünle farklı şekilde ele alınır. Hadoop ile istemci, C'ye yazan ve B'ye yazan, A sunucusuna yazar.
Jeremiah Peschka

Bu durumda düzeltilmiş duruyorum. Yanlış ifadeyi kaldırdım. Başka bir şey yaptım mı?
mrdenny

6

Temel olarak ilişkisel düzeneğe, birincil ve yabancı anahtarlara ve işlem güvenliğini sağlamadaki ilave ek yüke uyma, genellikle performansta aşırı artışlar sağlar. Bununla birlikte, bu yeni veritabanlarına / veri depolarına özgü değildir, çünkü MySQL katmanları atlayarak "NoSQL seviyelerinde" performans gösterecek şekilde ayarlanmıştır.

Kısacası, muhtemelen veri kaybı riskiyle karşı karşıya olduğunuzda, etkileyici performans elde edebilirsiniz. Çoğu NoSQL sistemi bunu yapar. Örneğin MongoDB uygun olduğunda yazılması gereken veri değişikliklerini yapar. Verilerin kendisi güvenli ve işlemsel olarak güvenlidir ancak geçici depolamada (bellekte) saklanır. Eğer güç kaybederseniz, veri kaybetmediğinizden ya da verilerinizin bozulmadığından% 100 emin olamazsınız.

Güvenlik ve performans arasında bir takas.


5

Başlamak için iyi bir yer Wikipedia girişidir . Temel olarak, verileri bir tabloda diğerine ilişkilendirmek, bir şeyleri anahtar değer çiftleri olarak saklarsınız ve veritabanı şeması yoktur, kod yerine kullanılır.

Birkaç site hem NoSQL hem de tipik RDBMS sunucularını aynı anda kullanır, ancak farklı verileri depolar. Yani birini seçmek zorunda değilsin.


Bu sorunun büyük kısmının WP'ye gidilerek cevaplanabilmesi gerçeği, buradaki cevapları düşündüğümde çenemi ovalamamı sağlıyor. Bence bu biraz fazla "doldurma sorusu" ama şu anda elimizde olan tek şey bu.
jcolebrand

1
Buradaki önemli not, veritabanı / sunucu altyapısındaki eschewing ilişkilerinin (yabancı anahtar) desteğinin, veritabanı / sunucuları, referans bütünlüğünü korumanın yük ve kilit yönetimi ek yükünden kurtardığıdır. Bunun sonucu, takas, referans bütünlüğü, tutarlılık ve diğer ACID endişelerinin daha sonra başvurulara aktarılmasıdır. Birçok uygulama, bununla sınırlı kalmak yerine bundan yararlanır. (Bazı uygulamaların istemci / sunucu modeline sıkıştırılması gerekir).
Jim Dennis,

0

MongoDB NoSQL Veri Tabanı ve Oracle üzerinde yoğun olarak çalıştım.

Şema

SQL veritabanı, yapılandırılmış verileri depolamak için önceden tanımlanmış bir şemaya sahiptir.

NoSQL veritabanında önceden tanımlanmış bir şema yoktur, burada şema veri elemanlarına göre en dinamik elemandır.

Ölçeklenebilirlik

SQL Veritabanları dikey olarak ölçeklenebilir durumdadır; bu, eğer SQL tabanlı veritabanını ölçeklendirmek istiyorsak, DBMS Sisteminin kurulu olduğu donanım artışı sağlamamız gerekir. Bu bazen ölçeklenebilirliğin sınırlandırılması için de geçerli.

NoSQL veritabanları yatay olarak ölçeklenebilirdir, yani ölçeklendirmek istiyorsak, kendi ihtiyacımıza ve gerekli gücümüze göre daha fazla düğüm ekleyip dağıtım ağı oluşturmamız gerekir. Veritabanındaki yükü bu şekilde azaltırlar

Veri Alma

SQL tabanlı veritabanlarında verileri tanımlamak ve değiştirmek için günümüzde çok güçlü olan SQL'i (Structured Query Language) kullanabiliriz.

NoSQL veritabanı açısından, sorgular toplama ve belgelere odaklanır. Bazen UnQL (Yapılandırılmamış Sorgu Dili) olarak adlandırılır. Bu hala evrim aşamasında, bu yüzden satıcıdan NoSQL veri tabanının satıcısına değişiyor.

Önemli farklılıklar hakkında daha fazla bilgi için blogum: SQL ve NoSQL veritabanı arasındaki fark

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.