Belge tabanlı ve Anahtar / Değer tabanlı veritabanları arasındaki fark nedir?


98

Sql olmayan veritabanlarının üç farklı, popüler türü olduğunu biliyorum.

  • Anahtar / Değer: Redis, Tokyo Cabinet, Memcached
  • Sütun Ailesi: Cassandra, HBase
  • Belge: MongoDB, CouchDB

Bu konuda çok fazla anlamadan uzun bloglar okudum.

İlişkisel veri tabanlarını biliyorum ve MongoDB / CouchDB gibi belge tabanlı veri tabanlarına alışıyorum.

Biri bana bunlar ve listedeki ilk 2 arasındaki en büyük farkların ne olduğunu söyleyebilir mi?


4
beş vardır: (1) Anahtar-Değer Depoları: Oracle Coherence, Redis, Kyoto Cabinet (2) BigTable-style Veritabanları: Apache HBase, Apache Cassandra (3) Doküman Veritabanları: MongoDB, CouchDB (4) Tam Metin Arama Motorları: Apache Lucene, Apache Solr (5) Grafik Veritabanları: neo4j, FlockDB, nosql-data-modeling-tekniklerine bakın
Gary Gauh

Yanıtlar:


75

Temel farklılıklar veri modeli ve sorgulama yetenekleridir.

Anahtar-değer mağazaları

İlk tür çok basittir ve muhtemelen daha fazla açıklamaya gerek yoktur.

Veri modeli: anahtar-değer depolarından daha fazlası

Cassandra gibi veritabanları için doğru isim konusunda bazı tartışmalar olsa da, onlara sütun ailesi mağazaları olarak adlandırmak istiyorum . Anahtar / değer çiftleri Cassandra'nın önemli bir parçası olsa da, bununla sınırlı değil. Anahtar / değer çiftlerini iç içe yerleştirmenize olanak tanır, böylece bir anahtar birden çok alt anahtar / değer çiftine başvurabilir.

Yine de anahtar / değer çiftlerini süresiz olarak iç içe yerleştiremezsiniz. Üç düzey (sütun aileleri) veya dört yuvalama düzeyi (süper sütun aileleri) ile sınırlandırılırsınız. Sütun ailesi terimi bir zil çalmazsa , bkz. WTF bir SuperColumn makalesidir, Cassandra'nın veri modelinin iyi bir açıklamasıdır.

CouchDB ve MongoDB gibi belge veritabanları , tüm belgeleri JSON nesneleri biçiminde depolar . Bu nesneleri yuvalanmış anahtar / değer çiftleri olarak düşünebilirsiniz. Cassandra'nın aksine, anahtar / değer çiftlerini istediğiniz kadar iç içe yerleştirebilirsiniz. JSON ayrıca dizileri destekler ve dizeler, sayılar ve boole değerleri gibi farklı veri türlerini anlar.

Sorgulama

Sütun ailesi mağazalarının yalnızca anahtarla veya harita azaltma işlevleri yazarak sorgulanabileceğine inanıyorum. Değerleri bir SQL veritabanında olduğu gibi sorgulayamazsınız. Uygulamanızın daha karmaşık sorgulara ihtiyacı varsa, uygulamanızın istenen verilere erişmek için dizinler oluşturması ve sürdürmesi gerekecektir.

Belge veritabanları anahtar ve harita azaltma işlevlerine göre sorguları destekler, ancak aynı zamanda "Bana 10'dan fazla gönderi olan tüm kullanıcıları ver" gibi değere göre temel sorgular yapmanıza da olanak tanır. Belge veritabanları bu şekilde daha esnektir.


2
Dolayısıyla, redit gibi anahtar / değer depoları, iç içe geçmiş anahtar: değerleri depolamanıza izin vermez? Ve açıklamanıza göre, bütün bir veritabanını (RDBMS'den) Cassandra'da depolamak kulağa pek akıllıca gelmiyor çünkü esnek sorgulamaya izin vermiyor ve sınırlı iç içe geçme derinliği var, değil mi?
never_had_a_name

7
@ajsie: Doğru, anahtar / değer depoları iç içe geçmiş anahtar / değer çiftlerini desteklemiyor. Birçoğu, listeler gibi özel değerleri destekler. Cassandra, her ikisi de çok farklı sorunları çözmek için tasarlandığından, RDBMS'den çok farklıdır. RDBMS sistemleri, karmaşık sorgulama gerektiren ilişkisel verileri hedeflerken, Cassandra büyük miktarda çoğunlukla ilişkisel olmayan verileri işlemeyi amaçlamaktadır. Elbette bir RDBMS veritabanını Cassandra'ya taşımak mümkündür , ancak çok da akıllıca değildir. Her birinin kendi kullanımı vardır.
Dinlenme der Niels van

Öyleyse, her belge veritabanı aynı zamanda değerin yalnızca {value: base64 (val)} gibi bir JSON olduğu bir anahtar, değer deposu mudur?
GroovyDotCom

@GroovyDotCom: Evet, basit anahtar / değer nesnelerini depolamak için bir belge veritabanı kullanabilirsiniz.
Niels van istirahat der

16

Ayende , Anahtar-Değer ve Belge veritabanı arasındaki farkla ilgili güzel bir açıklama yaptı:

Bir belge veritabanı, özünde, bir büyük istisna dışında bir anahtar / değer deposudur. İçinde herhangi bir blob depolamak yerine, bir belge veritabanı , verilerin veritabanının anlayabileceği bir formatta (yani JSON, XML vb.) Depolanmasını gerektirir. Çoğu doc ​​dbs'de bu, artık belge verilerinde sorgulara izin verebileceğimiz anlamına gelir .

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.