Sütun odaklı NoSQL, belge odaklı olmaktan nasıl farklıdır?


91

Okuduğum üç tür NoSQL veritabanı anahtar-değer, sütun odaklı ve belge odaklıdır.

Anahtar / değer çifti oldukça basittir - sade bir değere sahip bir anahtar.

Anahtar-değer olarak tanımlanmış belge odaklı veritabanları gördüm, ancak değer JSON nesnesi gibi bir yapı olabilir. Her "belge" bir başkasıyla aynı anahtarların tümüne, bir kısmına veya hiçbirine sahip olmayabilir.

Sütun odaklı, bir yapı belirlemediğiniz için belgeye çok benziyor.

Öyleyse bu ikisi arasındaki fark nedir ve neden birini diğerine tercih edersiniz?

Özellikle MongoDB ve Cassandra'ya baktım. Temelde değişebilen, ancak diğer değerleri etkilemeyen dinamik bir yapıya ihtiyacım var. Aynı zamanda, belirli anahtarları arayabilmem / filtreleyebilmem ve raporları çalıştırabilmem gerekiyor. CAP ile AP benim için en önemli şey. Veri çakışması veya kaybı olmadığı sürece veriler "sonunda" düğümler arasında senkronize edilebilir. Her kullanıcı kendi "tablosuna" sahip olacaktır.

Yanıtlar:


42

Cassandra'da, her satır (bir anahtarla adreslenir) bir veya daha fazla "sütun" içerir. Sütunların kendileri anahtar / değer çiftleridir. Sütun adlarının önceden tanımlanması gerekmez, yani yapı sabit değildir. Bir satırdaki sütunlar, anahtarlarına (adlarına) göre sıralı olarak saklanır.

Bazı durumlarda, bir satırda çok fazla sayıda sütununuz olabilir (örneğin, belirli türden sorguları etkinleştirmek için bir dizin görevi görmek için). Cassandra bu kadar büyük yapıları verimli bir şekilde idare edebilir ve belirli sütun aralıklarını alabilirsiniz.

Bir sütunun iç içe (alt) sütunlar içerdiği süper sütunlar olarak adlandırılan başka bir yapı düzeyi (çok yaygın olarak kullanılmamaktadır) vardır.

Genel yapıyı, 2 veya 3 seviyeli anahtarla iç içe geçmiş bir hashtable / sözlük olarak düşünebilirsiniz.

Normal sütun ailesi:

row
    col  col  col ...
    val  val  val ...

Süper sütun ailesi:

row
      supercol                      supercol                     ...
          (sub)col  (sub)col  ...       (sub)col  (sub)col  ...
           val       val      ...        val       val      ...

Verilerinizi bölmek veya gruplamak için kullanılabilecek üst düzey yapılar (sütun aileleri ve anahtar alanları) da vardır.

Ayrıca şu Soruya bakın: Cassandra: Alt sütun nedir

Veya http://wiki.apache.org/cassandra/ArticlesAndPresentations adresindeki veri modelleme bağlantıları

Re: belge odaklı veritabanları ile karşılaştırma - ikincisi genellikle tüm belgeleri ekler (tipik olarak JSON), oysa Cassandra'da tek tek sütunları veya süper sütunları ele alabilir ve bunları ayrı ayrı güncelleyebilirsiniz, yani farklı bir ayrıntı düzeyinde çalışırlar. Her sütunun kendi ayrı zaman damgası / sürümü vardır (dağıtılmış küme genelinde güncellemeleri uzlaştırmak için kullanılır).

Cassandra sütun değerleri yalnızca bayttır, ancak ASCII, UTF8 metni, sayılar, tarihler vb. Olarak yazılabilir.

Elbette, Cassandra'yı JSON içeren sütunlar ekleyerek ilkel bir belge deposu olarak kullanabilirsiniz - ancak gerçek bir belge odaklı mağazanın tüm özelliklerini elde edemezsiniz.


5
Bir sütun ailesi bir tablo gibidir. Bir satır, bir tablo satırı gibidir. Sütunlar, anında tanımlanabilmeleri dışında bir tür veritabanı sütunlarına benzer, bu nedenle bazı durumlarda çok seyrek doldurulmuş bir tablonuz olabilir veya her satırda farklı sütunların doldurulması olabilir.
DNA

1
Veritabanına bağlıdır. MongoDB'de (belge odaklı) her bir anahtarı da güncelleyebilirsiniz.
David Raab

1
Bu doğruysa, MongoDB belge odaklı bir veritabanını tanımlarken, Cassandra sütun yönelimli. Nasıl farklılar?
Luke

3
@Luke Sütun odaklı, şemasız bir RDBMS'ye çok benziyor, ancak gevşek yapısının yanı sıra, temel fark, ilişkisel olmamasından kaynaklanıyor.
user327961

1
@ user327961 Ancak MongoDB aynı zamanda şemasız RDBMS gibidir ve ilişkisel de değildir.
huggie

56

Ana fark, belge depolarının (örneğin MongoDB ve CouchDB) keyfi olarak karmaşık belgelere izin vermesidir, yani alt belgelerdeki alt belgeler, belgeli listeler vb. iki seviyeli sözlükler.


Bu durumda mongo (belge), Cassendra'nın (Sütun) yapabildiğini yapabilir. O halde neden Sütun gerekli?
sanjay patel

1
Farklı özellikler arasında bir değiş tokuş, sütun odaklı bir tasarımla depolama motoru, belge odaklı bir depolama motorunun olabileceğinden çok daha verimli olabilir. MongoDB, büyürse tüm belgeyi diske yeniden yazmak zorunda, ancak Cassandra bunu yapmak zorunda değil (bu bir basitleştirmedir, elbette, bununla ilgili birçok ayrıntı var). Bu, yazma söz konusu olduğunda Cassandra'yı çok daha hızlı hale getirir.
Theo

30

Rdbms kelimelerini kullanmak için "insert" de, Belge tabanlı daha tutarlı ve doğrudur. Cassandra'nın, çekirdek kavramıyla tutarlılık elde etmenize izin verdiğini unutmayın, ancak bu tüm sütun tabanlı sistemler için geçerli değildir ve kullanılabilirliği azaltır. Bir kez yazma / sık okuma ağırlıklı bir sistemde MongoDB'yi tercih edin. Her zaman nesnenin tüm yapısını okumayı planlıyorsanız, bunu da düşünün. Belge tabanlı bir sistem, belgeyi aldığınızda tüm belgeyi iade etmek için tasarlanmıştır ve tüm satırın bazı kısımlarını iade etmede çok güçlü değildir.

Cassandra gibi sütun tabanlı sistemler "güncellemelerde" belge tabanlı sistemlerden çok daha iyidir. Bir sütunun değerini, onu içeren satırı bile okumadan değiştirebilirsiniz. Yazmanın aynı sunucuda yapılması gerekmiyor, birden çok sunucunun birden çok dosyasında bir satır bulunabilir. Hızlı gelişen devasa veri sisteminde Cassandra'yı tercih edin. Anahtar başına çok büyük veri yığınına sahip olmayı planlıyorsanız ve her sorguda hepsini yüklemeniz gerekmiyorsa, bunu da göz önünde bulundurun. "Seç" bölümünde Cassandra, yalnızca ihtiyacınız olan sütunu yüklemenize izin verir.

Ayrıca Mongo DB'nin C ++ ile yazıldığını ve ikinci büyük sürümünde olduğunu, Cassandra'nın bir JVM üzerinde çalışması gerektiğini ve ilk büyük sürümünün yalnızca dünden beri sürüm adayı olduğunu göz önünde bulundurun (ancak 0.X sürümleri, zaten büyük şirket).

Öte yandan, Cassandra'nın tasarımı kısmen Amazon Dynamo'ya dayanıyordu ve özünde Yüksek Kullanılabilirlik çözümü olacak şekilde oluşturuldu, ancak bunun sütun tabanlı formatla ilgisi yok. MongoDB de ölçeklenir, ancak Cassandra kadar incelikli değildir.


1
Java'ya karşı C ++ ile yazılmış bir yazılım parçasının nesi var?
Nayuki

@Nayuki Şimdi, Java'nın bellek yönetimi modelinin tembel çöp toplama işleminin teoride C ++ 'ın "manuel" yönetim modelinden daha iyi performans göstereceği yüksek çekişmeli iş yükleri olduğunun farkındayım, ancak genel olarak konuşursak, bir eşdeğer yazarak Java'dan daha iyi performans göstermek genellikle zor değildir en azından İstisnaları ve RTTI'yi devre dışı bıraktığınız sürece C ++ programında. Yığınsız eşdizimlerden ve devam ettirilebilir işlevlerden iyi bir şekilde yararlanırsanız, ben şahsen Java'nın C ++'ımı geçtiğini görmedim.
patrickjp93

0

Ana farkın, bu DB türlerinin her birinin verileri fiziksel olarak saklama şekli olduğunu söyleyebilirim.
Sütun türlerinde veriler, belirli bir sütunda verimli toplama işlemleri / sorguları etkinleştirebilen sütunlarda depolanır.
Belge türlerinde, tüm belge mantıksal olarak tek bir yerde depolanır ve genellikle bir bütün olarak alınır ("sütunlar" / "alanlar" üzerinde verimli bir toplama mümkün değildir).

Kafa karıştırıcı olan, geniş sütunlu bir "satırın" kolayca bir belge olarak temsil edilebilmesi, ancak belirtildiği gibi farklı şekilde depolanması ve farklı amaçlar için optimize edilmesidir.

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.