İlişkisel veritabanı yerine neden belge tabanlı veritabanı kullanmalıyım?


188

İlişkisel veritabanı kullanmak yerine neden CouchDB gibi belge tabanlı veritabanı kullanmalıyım? Belge tabanlı veritabanının ilişkisel veritabanından daha uygun olduğu tipik uygulama veya etki alanı türleri var mı?


Belgeye yönelik bir veritabanı bazı yönlerden "varlık-öznitelik-değer" (EAV) veritabanına benzer olabilir.
ChrisW

Yanıtlar:


167

Muhtemelen yapmamalısınız :-)

İkinci en belirgin cevap, verileriniz ilişkisel değilse bunu kullanmanızdır. Bu genellikle verilerinizi bir sütun kümesi olarak tanımlamanın kolay bir yolu olmadığında kendini gösterir. Bunun iyi bir örneği, örneğin ofis postasını tarayarak kağıt belgeleri depoladığınız bir veritabanıdır. Veriler taranan PDF'dir ve her zaman var olan (taranan, taranan, belge türü) bazı meta verileriniz ve bir süre var olan olası birçok meta veri alanı (müşteri numarası, tedarikçi numarası, sipariş numarası, OCRed tam metin, vb.). Genellikle önümüzdeki iki yıl içinde hangi meta veri alanlarını ekleyeceğinizi önceden bilmezsiniz. CouchDB gibi şeyler bu tür veriler için ilişkisel veritabanlarından çok daha iyi çalışır.

Ben şahsen CouchDB için şu anda neredeyse her programlama dilinde bulunan bir HTTP istemcisi dışında herhangi bir istemci kütüphanesine ihtiyacım olmadığını seviyorum.

Muhtemelen en az açık cevap: RDBMS kullanarak acı hissetmiyorsanız, onunla kalın. İşinizi yapmak için her zaman RDBMS'niz üzerinde çalışmanız gerekiyorsa, belge odaklı bir veritabanı görülmeye değer olabilir.

Daha ayrıntılı bir liste için Richard Jones'un bu gönderisine bakın .


1
İki yıl içinde hiç bir veritabanı şeması görmedim, başladığımız orijinal şemaya benziyor ... bu yüzden her şey eşittir (ki ... değil), her zaman şematik bir veritabanı kullanmalısınız = belge yönelimli; bence oldukça yanıltıcı bir isim ...
ᆼ ᆺ ᆼ

3
@ int3 Verilerinizi bir sütun kümesi olarak tanımlayamıyorsanız, söz konusu veriler üzerinde nasıl akıllı sorgular yazmanız gerekir?
Clay Smith

46

CouchDB ( web sitelerinden )

  • RESTful JSON API ile erişilebilen bir belge veritabanı sunucusu. Genellikle, ilişkisel veritabanlarına REST hizmetleri aracılığıyla erişilmez, ancak çok daha karmaşık bir SQL API'sı gerekir. Genellikle bu API'ler (JDBC, ODBC vb.) Oldukça karmaşıktır. REST oldukça basittir.

  • Düz adres alanı ile geçici ve şema içermez. İlişkisel veritabanlarının karmaşık, sabit şeması vardır. Tabloları, sütunları, dizinleri, dizileri, görünümleri ve diğer öğeleri tanımlarsınız. Kanepe bu düzeyde karmaşık, pahalı, kırılgan gelişmiş planlama gerektirmez.

  • İki yönlü çatışma algılama ve yönetimi ile sağlam, artımlı çoğaltma özelliğine sahip dağıtılmış. Bazı SQL ticari ürünleri bunu sunmaktadır. SQL API ve sabit şemalar nedeniyle, bu karmaşık, zor ve pahalıdır. Couch için basit ve ucuz görünüyor.

  • Sorgu yapabilen ve dizin kullanabilen, Javascript'i sorgu dili olarak kullanan tablo odaklı bir raporlama motoru. SQL ve ilişkisel veritabanları da öyle. Burada yeni bir şey yok.

Yani. Neden CouchDB?

  • REST, JDBC veya ODBC'den daha basittir.
  • Hiçbir Şema, Şema'dan daha basit değildir.
  • Basit ve ucuz görünen bir şekilde dağıtılır.

12
Ben NoSQL veritabanlarının büyük bir hayranıyım, ancak ilk iddia (REST JDBC'den daha basit) çok şüpheli.
ᆼ ᆺ ᆼ

2
REST protokolü benim için oldukça basit görünüyor, çünkü sadece HTTP: vatansız, birkaç yöntem vb. Vb. Belki JDBC (kaputun altında) basittir; sadece durumsal olmasına dayanarak daha basit görünmüyor.
S.Lott

5
@ S.Lott Yanıt sadece CouchDb'ye yönelik olmak yerine daha "genel" olmamalı mı?
Pacerier

"kırılgan ileri planlama" vs ne? Deneyimlerime göre alternatif, bir hevesle değiştirilen spagetti veri yapılarına yol açan hiçbir planlama değildir.
Tejay Cardon

26

Diğer sunucu verilerini aptalca saklamak ve sunmak için.

Son birkaç hafta içinde, beslemelerimi (lezzetli, flickr, github, twitter ...) yoklayan ve onları couchdb'de saklayan bir canlı yayın uygulamasıyla oynuyordum. Couchdb'nin güzelliği, orijinal verileri orijinal yapısında ek yük olmadan tutmama izin vermesidir. Kaynak belgeyi saklayarak her belgeye bir 'sınıf' alanı ekledim ve her kaynak için bir javascript render sınıfı yazdım.

Genelleştirme, sunucunuz başka bir sunucuyla her iletişim kurduğunda, şema üzerinde hiçbir kontrolünüz olmadığından şema içermeyen bir depolama en iyisidir. Bonusdp, couchdb, sunucuların ve istemcilerin yerel protokollerini kullanır - temsil için JSON ve aktarım için HTTP REST.


Neden bunları yalnızca bir dosyada veya feed başına bir dosyada saklamıyorsunuz?
j_random_hacker

6
çünkü couchdb ayrıca harita / azalt özelliğini kullanarak ilginç görünümler oluşturmanıza olanak tanır. Örneğin, veri kaynağına dayalı bir görünüm oluşturabilirim veya her bir kaynağın toplamlarını hesaplayabilirim.
daonb

4
Bu harika bir nokta ... veri tüketiyorsanız ve gelen veri şeması üzerinde kontrolünüz yoksa - bir belge deposu kullanın.
Joshua Robinson

1
Bu NoSQL veritabanlarının değeri için duyduğum ilk ikna edici argüman
Caleb McNevin

20

Hızlı uygulama geliştirme akla geliyor.

Şemamı sürekli olarak geliştirdiğimde, şemayı MySQL / SQLite'de korumak zorunda kaldığım için sürekli hayal kırıklığına uğradım. Henüz CouchDB ile çok fazla şey yapmamış olmama rağmen, RAD işlemi sırasında şemayı geliştirmenin ne kadar basit olduğunu seviyorum.

İlişkisel olmayan bir veritabanı kullanmak istemeyebileceğiniz bir durum, çoktan çoğa ilişkileriniz olduğunda; Özellikle de birleşme ilişkisinde meta verilere ihtiyacınız varsa, bu tür ilişkiler etrafında iyi MapReduce işlevlerinin nasıl oluşturulacağı konusunda henüz kafamı kurmadım. Emin değilim, ancak potansiyel olarak sonsuz döngülere neden olabileceğinden CouchDB Harita işlevlerinin veritabanında kendi sorgularını çağırabileceğini düşünmüyorum.


1
Mükemmel nokta. Belge (ve diğer şematik) veri depoları hızlı erken aşama gelişimi için mükemmeldir. Bununla birlikte, aynı nedenlerden dolayı erken aşama prototipleme için mükemmeldirler, sağlam üretim uygulamaları için problemlidirler.
Tejay Cardon

6

Her kayıt için tek biçimli alanlara sahip tablolarda veri depolamanız gerekmediğinde belge tabanlı bir veritabanı kullanın. Bunun yerine, her bir kaydı belirli özelliklere sahip bir belge olarak saklamanız gerekir. Herhangi bir uzunlukta herhangi bir sayıda alan, önce "tabloyu değiştirmeye" gerek kalmadan, herhangi bir zamanda bir belgeye dinamik olarak eklenebilir. Belge tabanlı alanlar da birden fazla veri parçası içerebilir.


1

Smdelfin hakkında ayrıntılı bilgi için: esneklik. Verileri herhangi bir yapıda (yapılandırılmamış ve hepsi) saklayabilirsiniz ve her belge tamamen farklı olabilir. CouchDB özellikle kullanışlıdır çünkü "görünüm" dizinleriyle, belirli belgeleri filtreleyebilir ve veritabanınızın bu alt kümelerini istediğinizde yalnızca bu görünümü sorgulayabilirsiniz.

Verileri JSON biçiminde depolayan belge veritabanlarının en büyük kazanan noktası: bu, JavaScript'in yerel biçimidir. Bu nedenle, JavaScript web uygulamaları CouchDB ile inanılmaz derecede iyi çalışır. Son zamanlarda CouchDB kullanan bir web uygulaması yaptım ve sürekli değişen bir veri yapısını idare edebiliyorken roket hızlı.


0

Belgeye dayalı veritabanlarının, herhangi bir veri girmeden önce bir şemanın önceden tanımlanmasını gerektirmedikleri için ilişkisel veritabanlarına göre büyük bir avantajı vardır.

Ayrıca, veriler ilişkisel değilse ve bir tabloda saklanamıyorsa, bir dizi resim veya örneğin gazete makaleleri ise, bir belge veritabanı kullanmalısınız.

Diğer bir avantajı da web tabanlı veritabanlarında doküman tabanlı veri tabanlarının kullanım kolaylığıdır. Daha ayrıntılı NoSQL veritabanı modelleri için comarison bu kaynağı kontrol edin: https://arxiv.org/ftp/arxiv/papers/1509/1509.08035.pdf

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.