İlişkisel veritabanı KULLANMAMAK için iyi nedenler?


139

Lütfen alternatif veri depolama araçlarına işaret edebilir ve eski ilişkisel veritabanları yerine bunları kullanmak için iyi nedenler verebilir misiniz? Bence, çoğu uygulama nadiren SQL'in tam gücünü kullanır - SQL içermeyen bir uygulamanın nasıl oluşturulacağını görmek ilginç olurdu.

Yanıtlar:


148

Bir dosya sistemindeki düz metin dosyaları

  • Oluşturmak ve düzenlemek çok basit
  • Kullanıcıların basit araçlarla (metin editörleri, grep vb.)
  • İkili belgelerin verimli depolanması

Diskteki XML veya JSON dosyaları

  • Yukarıdaki gibi, ancak yapıyı doğrulamak için biraz daha yetenekli.

Elektronik tablo / CSV dosyası

  • İşletme kullanıcılarının anlaması için çok kolay bir model

Subversion (veya benzeri disk tabanlı sürüm kontrol sistemi)

  • Verilerin sürümlendirilmesi için çok iyi destek

Berkeley DB (Temelde, disk tabanlı bir karma)

  • Kavramsal olarak çok basit (sadece yazılmamış anahtar / değer)
  • Oldukça hızlı
  • Yönetim yükü yok
  • İnandığım işlemleri destekliyor

Amazon'un Basit DB'si

  • Berkeley DB'ye çok benziyorum ama ev sahipliği yapıyorum

Google'ın App Engine Veri Deposu

  • Barındırılan ve yüksek oranda ölçeklenebilir
  • Belge başına anahtar / değer depolama (esnek veri modeli)

CouchDB

  • Belge odağı
  • Yarı yapılandırılmış / belge tabanlı verilerin kolay depolanması

Yerel dil koleksiyonları (bellekte depolanır veya diskte serileştirilir)

  • Çok sıkı dil entegrasyonu

Özel (elle yazılmış) depolama motoru

  • Gerekli kullanım durumlarında potansiyel olarak çok yüksek performans

Onlar hakkında çok şey bildiğimi iddia edemem, ancak nesne veritabanı sistemlerine de bakmak isteyebilirsiniz .


10
Her seçimin dezavantajlarını da açıklarsanız harika olur, aksi takdirde nasıl seçilmesi gerekiyor? Teşekkürler,
Sklivvz

4
Bir DB'ye milyonlarca satır yazmak bir gün sürebilirken, bir dosyaya milyon satırlık günlük eklemek yalnızca birkaç dakika alır. İnsanların neden günlük verilerini bir veritabanına koymakta ısrar ettiğini asla anlamayacağım.
Aaron Digulla

33
Aaron: Bir sebebim var: iletileri NEREDEN günlükten SEÇİN (tarih 2009-01-01 VE 2009-03-01 ARASINDA) VE type = 'error' AND system = 'windows' :) Bunu bir metin dosyasından nasıl yüklersiniz? ?
Tomáš Fejfar

1
Mümkün olduğunca metin dosyalarını destekliyorum. Bunları her zaman kullanamazsınız, ancak mümkün olduğunda sorunları teşhis etmek çok daha kolaydır.
Loren Pechtel

berkeley db kesinlikle işlemleri var. metin dosyaları ve xml / json dosyaları, bu nedenle çok iş parçacıklı uygulamalar dikkatli değilseniz bunları durdurabilir. CSV dosyaları parametre koleksiyonları için mükemmeldir, çünkü işletme kullanıcıları bunlara kolayca bakabilir ve ekstra araçlar kullanmadan düzenleyebilir. Metin dosyaları, bir kez yazma / okuma-neredeyse-hiç yazma gibi uygulamalar için mükemmeldir. Bir yaklaşım seçmek için neyi başarmaya çalıştığınızı anlamanız gerekir
O. Jones

26

Matt Sheppard'ın cevabı harika (mod up), ancak bir mili düşünürken bu faktörleri dikkate alırım:

  1. Yapı: Açıkçası parçalara ayrılıyor mu yoksa ödünleşiyor musunuz?
  2. Kullanım: Veriler nasıl analiz edilecek / alınacak / silinecek?
  3. Ömür boyu: veriler ne kadar yararlıdır?
  4. Boyut: Ne kadar veri var?

CSV dosyalarının RDBMS'lere göre özel bir avantajı, yoğunlaştırılmaları ve pratik olarak başka herhangi bir makineye taşınmalarıdır. Büyük veri aktarımları yapıyoruz ve her şey sadece bir büyük CSV dosyası kullandığımız kadar basit ve rsync gibi araçları kullanarak kodlaması kolay. Büyük CSV dosyalarındaki tekrarlamayı azaltmak için YAML gibi bir şey kullanabilirsiniz . Önemli ilişki gereksinimleriniz olmadıkça JSON veya XML gibi bir şey depolayacağımdan emin değilim.

Belirtilmeyen alternatiflere gelince , MapReduce'un açık kaynaklı bir uygulaması olan Hadoop'u indirmeyin. Analiz edilmesi gereken bir TON gevşek yapılandırılmış veriye sahipseniz ve veri işlemeyi gerçekleştirmek için sadece 10 makine daha ekleyebileceğiniz bir senaryoda olmak istiyorsanız, bu iyi çalışmalıdır.

Örneğin, yaklaşık 20 makinede kaydedilen farklı işlevlerin tüm zamanlama sayıları olan performansı analiz etmeye çalıştım. RDBMS içindeki her şeyi yapıştırmaya çalıştıktan sonra, bir kez topladıktan sonra verileri tekrar sorgulamam gerekmediğini fark ettim. Ve bu sadece benim için toplu biçiminde yararlıdır. Bu yüzden, günlük dosyalarını etrafta tutuyorum, sıkıştırıyorum ve sonra toplanmış verileri bir DB'de bırakıyorum.

Not "Büyük" boyutlarda düşünmeye daha alışkınım.


5
CSV dosyalarının bir tehlikesi kaçmanın doğru yapılması gerektiğidir; 'aldatıcı bir şekilde basit göründüğü ve birkaç incelik olduğu için teknik özellikleri gerçekten takip etmeyen bir CSV okuyucu veya yazar uygulamak kolaydır: en.wikipedia.org/wiki/Comma-separated_values#Specification
Jared Updike

10

Dosya sisteminin ikili verileri depolamak için kullanışlı olması, ilişkisel veritabanlarında asla şaşırtıcı derecede iyi çalışmaz.



6

ACID'ye ihtiyacınız yoksa , muhtemelen bir RDBMS'nin ek yüküne ihtiyacınız yoktur. İlk önce buna ihtiyacınız olup olmadığını belirleyin. Olmayan RDBMS çoğu yok burada sağlanan yanıtları değil ASİT sağlarlar.


1
ACID'ye neden / ne zaman ihtiyaç duyulmadığını bir örnek verebilir misiniz?
Ivan Voroshilin

1
@vibneiro, veritabanında yalnızca sıralı işlemleri gerçekleştiren tek bir kullanıcı varsa veya bir elektrik kesintisi durumunda veritabanı tutarsızlığı riski kabul edilebilirse veya veritabanı işlemleri kavramı geçerli değilse veya kısıtlamalara gerek yoksa, kaskadlar, tetikleyiciler veya benzerleri, daha sonra ACID olmayan bir RDBMS sağlayıcısı (örneğin RDBMS benzeri bir API içeren bir metin dosyası) yeterli olabilir. Örneğin, uygulamanız ACID'nin tamamen alakasız olduğu ve "log.txt" nin yeterli olacağı geçmiş tanılama mesajlarının bir veritabanını saklayabilir.
bzlm

Çok nadir durumlarda ASİT'in gerekli olmadığı ortaya çıktı. Acaba neden NoSQL veritabanları bu kadar popüler? Çoğunluğu tam ACIDity'yi desteklemiyor.
Ivan Voroshilin

@vibneiro, NoSQL genellikle daha kolay, daha hafif, daha gömülebilir, daha fazla kendini barındıran, daha sezgisel, daha esnek ve genellikle bazı ACID ile. İlişkisel verileriniz yoksa, RDBMS muhtemelen ihtiyacınız olan şey değildir.
bzlm

6

Özel (elle yazılmış) depolama motoru / Gerekli kullanım durumlarında potansiyel olarak çok yüksek performans

http://www.hdfgroup.org/

Çok büyük veri kümeleriniz varsa, kendi verilerinizi döndürmek yerine Hiyerarşik Veri Biçimi olan HDF'yi kullanabilirsiniz.

http://en.wikipedia.org/wiki/Hierarchical_Data_Format :

HDF, çok boyutlu diziler, raster görüntüler ve tablolar dahil olmak üzere birçok farklı veri modelini destekler.

Aynı zamanda bir dosya sistemi gibi hiyerarşiktir, ancak veriler tek bir sihirli ikili dosyada saklanır.

HDF5, çok büyük ve karmaşık veri koleksiyonlarının yönetimini mümkün kılan bir pakettir.

NASA / JPL uzaktan algılama verilerinin petabaytlarını düşünün.


4

İyi günler,

Düşünebileceğim bir örnek, modellemekte olduğunuz verilerin ilişkisel bir veritabanında kolayca temsil edilememesidir.

Böyle bir örnek cep telefonu operatörleri tarafından mobil telefon şebekeleri için baz istasyonlarını izlemek ve kontrol etmek için kullanılan veritabanıdır.

Bu vakaların neredeyse hepsinde, bir OO DB , ticari bir ürün veya nesnelerin heirarchiesine izin veren kendi kendine haddelenmiş bir sistem kullanılır.

İsimsiz kalacak, ancak logosu kırmızı şarap lekesi olan büyük bir şirket için bir 3G izleme uygulaması üzerinde çalıştım (-: ve onlar içindeki bireysel hücreler için tüm çeşitli özellikleri takip etmek için böyle bir OO DB kullandılar ağ.

Bu tür DB'lerin sorgulanması, genellikle tamamen SQL içermeyen tescilli teknikler kullanılarak yapılır.

HTH.

şerefe,

soymak


4
Neden baz istasyonu verileri ilişkisel modele iyi uyum sağlamıyor?
kaybenleroll

3

Nesne veritabanları ilişkisel veritabanları değildir. Bir veritabanındaki bazı nesneleri doldurmak istiyorsanız gerçekten kullanışlı olabilirler. Ayrıca, veritabanında zaten var olan nesneler için sürüm oluşturmayı ve sınıfları değiştirmeyi de desteklerler. ilk akla gelen db4o .


3

Bazı durumlarda (örneğin finansal piyasa verileri ve süreç kontrolü) RDBMS yerine gerçek zamanlı bir veritabanı kullanmanız gerekebilir. Wiki bağlantısına bakın


3

Birkaç yıl önce JADE adlı yerleşik bir OODBMS'ye sahip olan bir RAD aracı vardı . DB motorunun önceki enkarnasyonları da Digitalk Smalltalk'i destekledi. RDBMS olmayan bir paradigma kullanarak uygulama oluşturma örneklemek istiyorsanız, bu bir başlangıç ​​olabilir.

Diğer OODBMS ürünleri arasında Objectivity , GemStone ( Smalltalk sürümünü çalıştırmak için VisualWorks Smalltalk almanız gerekir, ancak bir java sürümü de vardır). Bu alanda bazı açık kaynaklı araştırma projeleri de vardı - EXODUS ve onun inen SHORE akla geliyor.

Ne yazık ki, muhtemelen SQL tabanlı RDMBS sistemlerine göre açıkça görülebilen bir standart ve nispeten zayıf ad-hoc sorgu yeteneğinin olmaması nedeniyle kavram bir ölümle ölmüş gibi görünüyordu.

OODBMS, en iyi birbirine bağlı düğümlerin grafiği olarak temsil edilen temel veri yapılarına sahip uygulamalar için en uygundur. Özetin özeti OODBMS uygulamasının, odaların oyuncuların avatarlarını ve diğer nesneleri içereceği Çok Kullanıcılı Zindan (MUD) olduğunu söylerdim.


2
GemStone / S'yi (masaüstü uygulamaları için) kullanmak için bir Smalltalk istemcisine ihtiyacınız olduğu doğruydu, ancak Aida ( aidaweb.si ) ve Seaside ( seaside.st ) web çerçeveleri ile GemStone / S doğrudan bir uygulama olarak kullanılabilir sunucusu. GLASS ( seaside.gemstone.com )
Dale Henrichs

Veri kalitesini önemsiyorsanız başka bir neden olabilir. Gemstone gibi bir OODB'de karmaşık geçerlilik kurallarını uygulamak çok daha kolaydır.
Stephan Eggermont


1

Sadece dosya sisteminde saklanan dosyaları kullanarak uzun bir yol kat edebilirsiniz. RDBMS'ler lekeleri işlemede daha iyi hale gelir, ancak bu, özellikle sorgular basitse (tek tek öğeleri numaralandırma ve seçme), görüntü verilerini ve benzerlerini işlemenin doğal bir yolu olabilir.

Bir RDBMS'ye çok iyi uymayan diğer şeyler hiyerarşik veri yapılarıdır ve tahmin ediyorum ki coğrafi veri ve 3D modeller de çalışmak o kadar kolay değil.

Amazon S3 gibi hizmetler , SQL'i desteklemeyen daha basit depolama modelleri (anahtar-> değer) sağlar. Ölçeklenebilirlik burada anahtardır.

Özellikle kullanıcıların tanıdık bir ortamda verileri manipüle edebilmesi ve bunu yapmak için tam bir uygulama oluşturması gerekiyorsa, Excel dosyaları da yararlı olabilir.


1

Verileri depolamanın çok sayıda yolu vardır - hatta "ilişkisel veritabanları", yerel bir dosyayı (veya dosyaları) tek bir kullanıcı temelinde ilişkisel veritabanıymış gibi işleyen basit bir kod kitaplığından bir dizi alternatifi kapsar dosya tabanlı sistemlere göre çok sayıda kullanıcı ciddi "sunucu" tabanlı sistemlerin cömert bir seçim işlemek.

XML dosyalarını çok kullanıyoruz - iyi yapılandırılmış veriler, uygunsa düzenleme yapabilme yeteneğini sorgulamak için güzel araçlar, insan tarafından okunabilir bir şey elde edersiniz ve daha sonra db motorunun çalışması (veya işleyişi hakkında endişelenmenize gerek yoktur) db motoru). Bu, temelde yalnızca okunan şeyler (bizim durumumuzda başka bir yerde bir db'den üretilenden daha sık) ve ayrıca verileri yalnızca yükleyebileceğiniz ve gerektiği gibi kaydedebileceğiniz tek kullanıcı sistemleri için iyi çalışır - ancak fırsatlar yaratırsınız en azından tek bir dosyadan oluşan çok kullanıcılı düzenleme istiyorsanız sorunlar için.

Bizim için bu - ya SQL yapacak bir şey kullanacağız (MS, kurumsal sunucuya kadar tek kullanıcılı şeyler yapmak için bir .DLL'den çalışan bir dizi araç sunuyor ve hepsi aynı SQL'i konuşuyor (alt uçtaki sınırlamalarla birlikte)) veya XML'i biçim olarak kullanacağız çünkü (bizim için) ayrıntı düzeyi nadiren bir sorundur.

Şu anda uygulamalarımızdaki ikili verileri değiştirmek zorunda değiliz, bu nedenle bu soru ortaya çıkmıyor.

Murph


1

Uygulama verileri büyük ölçüde anahtar / değer yönelimli ve hiyerarşik nitelikte ise, geleneksel bir SQL veritabanı yerine bir LDAP sunucusunun kullanılması düşünülebilir.


1

BTree dosyaları genellikle ilişkisel veritabanlarından çok daha hızlıdır. SQLite, içinde kamusal alanda olan bir BTree kütüphanesi içerir (terimi 'gerçekten' kamusal alanda 'olduğu gibi, terimi gevşek bir şekilde kullanmaz).

Açıkçası, çok kullanıcılı bir sistem isteseydim, iyi bir sunucu ilişkisel veritabanı kullanmamaya ikna etmem gerekiyordu.


BTrees normal endekslerin temel uygulamasıdır. Oracle, yalnızca dizin olarak uygulanan bir tablo olan Dizin Düzenli tabloları destekler. Bunların okunması daha hızlı, bir B ağacı yazmak ve kullanmak daha yavaştır. Bakınız: < oracle.com/technology/products/oracle9i/datasheets/iots/… >
borjab

1

"10 kelimeden kısa sürede" gibi yakınlık operatörleriyle sorgulanabilen tam metin veritabanları.

İlişkisel veritabanları birçok amaç için ideal bir iş aracıdır - anlaması ve tasarımı yeterince kolay, yeterince hızlı, "tam gücü kullanabilen" bir dahi tarafından tasarlanıp optimize edilmese bile yeterli.

Ancak bazı ticari amaçlar, ilişkisel motorların sonradan düşünülmediği ya da üzerinde durmadığı tam metin dizinleme gerektirir. Özellikle, yasal ve tıbbi alanlarda, depolanacak ve geçecek büyük yapılandırılmamış metin alanları bulunmaktadır.


1

Ayrıca: * Gömülü senaryolar - Genellikle tam teşekküllü bir RDBMS'den daha küçük bir şey kullanılması gerekir. Db4o , bu durumda kolayca kullanılabilen bir ODB'dir . * Hızlı veya konsept kanıtı geliştirme - işe odaklanmak ve kalıcılık katmanından endişe etmemek istediğiniz yer


1

CAP teoremi bunu özlü bir şekilde açıklar. SQL temel olarak "Güçlü Tutarlılık: güncellemeler olsa bile tüm istemciler aynı görünümü görür".


1

ÖPÜCÜK: Küçük ve Basit Tut


1
Bu kibar versiyonu ... Daha sık "Basit, aptalca" duydum ... ya da yutkun, belki de insanların bana söylediği bu! :-(
GreenMatt

1

Ben RDBMS teklif ediyorum :) Eğer kurulum / yönetim ile sıkıntılar alışkanlık yoksa SQLite için gidin. Tam SQL desteği ile dahili RDBMS. Hatta herhangi bir sütunda herhangi bir veri türünü saklamanızı sağlar.

Örneğin günlük dosyasına karşı ana avantajı: Büyük bir dosyanız varsa, onu nasıl arayacaksınız? SQL motoru ile sadece indeks oluşturur ve operasyonu önemli ölçüde hızlandırırsınız.

Tam metin araması hakkında: SQLite'nin tam metin araması için de modülleri vardır ..

Sadece verilerinize hoş bir standart arayüz tadını çıkarın :)


0

İlişkisel veritabanı kullanmamanın iyi bir nedeni, büyük bir veri kümeniz olduğunda ve veriler üzerinde büyük ölçüde paralel ve dağıtılmış işlem yapmak istediğinizde olabilir. Google web dizini bu tür bir duruma mükemmel bir örnek olacaktır.

Hadoop ayrıca Google Dosya Sistemi'nin Hadoop Dağıtılmış Dosya Sistemi adı verilen bir uygulamasına sahiptir .


0

Lua, SQLite-tür veri depolama alternatif olarak şiddetle tavsiye ediyorum.

Çünkü:

  • Dil, başlamak için bir veri tanımlama dili olarak tasarlanmıştır
  • Sözdizimi insan tarafından okunabilir (XML değil )
  • Daha fazla performans için Lua parçaları ikili olarak derlenebilir

Bu, kabul edilen yanıtın "ana dil toplama" seçeneğidir. Uygulama seviyesi olarak C / C ++ kullanıyorsanız, sadece yapılandırmaları / verileri okumak veya yazmak için Lua motorunu (100kB ikili) atmak son derece mantıklıdır.


Lua bir programlama dilidir. Bu öneri, herhangi bir programlama dilinin herhangi bir kalıcılık / serileştirme özelliğini önermek için genelleştirilebilir (örneğin Python'da turşu / raf veya Perl ve arkadaşları için JSON / YAML vb.). Bu, eşzamanlı erişim ve ACID garantilerini hiç ele almaz.
Jim Dennis

Haklısın. Girişimde eksik olan, bu tür kullanımların zımni salt okunur doğasıydı. Böyle bir senaryoda metnime tutunuyorum. Lua'nın bu şekilde okuma-yazma kullanımı için kesinlikle bir anlamı yoktur. Birçok şey, sa dosya sistemi meta verileri çoğunlukla salt okunurdur, bu nedenle böyle bir yaklaşım tam ro gereksinimi anlamına gelmez.
akauppi
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.