Neden verilerinizi diske kaydetmek yerine bir veritabanı kullanıyorsunuz?


193

Bir veritabanı yerine sadece verilerimi JSON'a seriyorum, gerektiğinde kaydedip diske yüklüyorum. Tüm veri yönetimi, SQL sorguları kullanmaktan daha hızlı VE daha kolay olan programın kendisinde yapılır. Bu nedenle veritabanlarının neden gerekli olduğunu hiç anlamadım.

Neden biri sadece verileri diske kaydetmek yerine bir veritabanı kullanmalı?


61
Uygulamanızdaki verilerinizin ilişkilerini yönetmek aslında bir veritabanında yapmaktan daha hızlıysa (ki buna inanmak çok zor buluyorum), o zaman SQL ve veritabanı normalleştirmesi hakkında okumaya ihtiyacınız var. Karşılaştığınız şey, muhtemelen korkunç bir şekilde tasarlanmış veritabanının yan etkisidir.
yannis

68
Açıkladığınız senaryoda bir veritabanına ihtiyacınız yoktur, çünkü veri kümeniz önemsizdir. Veritabanları, daha karmaşık veri kümeleri içindir, eğer yaptığınız tek şey bir listeyi okumak ve göstermek ise, yaklaşımınız işe yarar.
yannis

16
Hangi yarış koşullarıyla karşılaşabiliyordunuz ve buna hazır mısınız? Tek bir web sunucusunu ölçeklendirmek ister misiniz? Sunucunuz başarısız olursa, yedekleme planınız nedir? Tüm bu sorulara vereceğiniz cevabınız, veritabanınız yoksa yapmadığınızdan daha iyi olabilir. Ayrıca, veritabanlarının nasıl kullanılacağını öğrenme konusunda bir sıkıntı yaşarsanız, tahminimce "SQL sorgularını kullanmaktan daha kolay" 'ı "SQL sorgularını kullanmaktan daha kolay" olarak değiştirmiş olmanız gerektiğidir.
btilly

37
Veritabanı zaten diske veri depolar. Bu, yapılandırılmış verilerin dosyaya kaydedilmesi için doğal bir sistem gelişimi sonucunun sonucudur. Muhtemelen, yapılandırılmış verilerinizi saklamak için dosyaları kullanmaya karar verirseniz, daha önce veritabanlarında geliştirilmiş olan özellikleri yeniden keşfedeceksiniz. Peki neden baştan sadece bir veritabanı kullanmıyorsunuz?
Benedict,

13
Projenizin nasıl geliştiğine bağlı olarak, eşzamanlı erişim ve geri alma gibi şeylerle uğraşmak zorunda kalacağınızı görebilirsiniz. Önemsiz geliyorlar, ama değiller. Onları çözmeyi tamamladığınızda, temelde bir veritabanı yazdığınızı göreceksiniz. Gerçekten veritabanı işinde mi yoksa başka bir işletmede olmak mı istiyorsunuz?
jwernerny

Yanıtlar:


280
  1. Bir veritabanındaki verileri sorgulayabilirsiniz (sorularınızı sorun).
  2. Veritabanındaki verileri nispeten hızlı bir şekilde arayabilirsiniz.
  3. JOIN'leri kullanarak iki farklı tablodaki verileri birlikte ilişkilendirebilirsiniz.
  4. Bir veritabanındaki verilerden anlamlı raporlar oluşturabilirsiniz.
  5. Verilerinizde yerleşik bir yapı vardır.
  6. Belirli bir türdeki bilgiler her zaman yalnızca bir kez saklanır.
  7. Veritabanları ACID'dir .
  8. Veritabanları hataya dayanıklı.
  9. Veritabanları çok büyük veri kümelerini işleyebilir.
  10. Veritabanları eşzamanlıdır; birden fazla kullanıcı, verileri bozmadan aynı anda bunları kullanabilir.
  11. Veritabanları iyi ölçeklenir.

Kısacası, çok çeşitli akıllı insanlar tarafından yıllarca geliştirilen, tanınmış ve kanıtlanmış teknolojilerden faydalanırsınız.

Bir veritabanının fazla olduğundan endişeleniyorsanız, SQLite'a göz atın.


21
6. Normalleştirme, 7. Bağlantıya bakınız, 8. Hata toleransı hakkında okuma. Oh, ve NoSQL çılgınlığına girmeden önce, SQL veritabanları hakkında bilgi edinin; Onları kendi şartlarıyla tanıyın. Anlayacaksın. Yalnızca basit yapılandırma verilerinden bahsediyorsanız, JSON ihtiyacınız olan tek şey olabilir. Ancak, program ayarlarının yanı sıra başka birçok veri türü var.
Robert Harvey

25
Verileri aynı anda düzenleyen iki programın olması güvenli olmadığı sürece, kısmen bu yüzden veritabanları mevcuttur. Eğer bu gereksinime sahipseniz (ve bahsettiğim diğer ihtiyaçların bir kısmı veya tamamı), tüm bunları yeniden icat etmeniz gerekmediği için çok mutlu olacaksınız.
Robert Harvey

23
@Dokkat Gerekli değil, hiçbir şey yok. Eğer yaklaşımınız sizin için işe yararsa, elbette, bunun için gidin. Ancak, yarısı kadar iyi durumda olan rdbms'lerin hafıza tabanlı depoları desteklediğini belirtmeliyim, uygulamanız uyandığında (zaten yaptığınız gibi) hafızada ihtiyacınız olan her şeyi yükleyebilir ve bunları tipik bir veritabanında yaptığınız gibi sorgulayabilirsiniz (tüm avantajlarını Robert’in bahsettiği gibi tutar) ).
yannis

28
Başka bir deyişle, bazen bir çadır gerekir, ama bazen bir eve ihtiyacınız olur ve bir ev inşa etmek, çadır kurmaktan tamamen farklı bir top oyunudur.
Robert Harvey,

49
@Dokkat, insanlar çökmelere atıfta bulunurken, "veritabanı" dosyanızı yazarken işlemcinizin yarısı patladı. Şimdi ne olacak Büyük olasılıkla dosyanız bozuk / okunamıyor (en azından artık kendi biçiminize uygun olmayabilir) ve bir yedekleme formu geri yüklemeniz gerekir (çoğu "gerçek" DB'ler yalnızca son işlemi kaybeder). Elbette, bunun üstesinden gelmek için kod yazabilirsiniz. Sonra diğer şeyler için kod yazabilirsiniz. Ve sonra 6 aydır baştan kullandığınız bir DB'yi yazmak için çok az çaba harcamak üzere olduğunuzu anlıyorsunuz.
Daniel B,

200

Robert’in söylediği her şeyle aynı fikirdeyken, verileri diske kaydetmenin aksine, bir veritabanını ne zaman kullanmanız gerektiğini size söylemedi.

Öyleyse bunu Robert’ın ölçeklenebilirlik, güvenilirlik, hata toleransı, vb. Hakkında söylediklerine ek olarak alın.

RDBMS'yi ne zaman kullanacağınızla ilgili olarak, göz önünde bulundurmanız gereken bazı noktalar şunlardır:

  • İlişkisel verileriniz var, yani ürünlerinizi satın alan bir müşteriniz var ve bu ürünler bir tedarikçiye ve üreticiye sahip
  • Çok miktarda veriye sahipsiniz ve ilgili bilgileri hızlı bir şekilde bulabilmeniz gerekiyor.
  • Tanımlanan önceki konular hakkında endişelenmeye başlamanız gerekir: ölçeklenebilirlik, güvenilirlik, ACID uyumluluğu
  • İşle ilgili sorunları çözmek için raporlama veya istihbarat araçlarını kullanmanız gerekir.

NoSQL kullanmaya gelince

  • Saklanması gereken ve yapılandırılmamış birçok veriye sahipsiniz.
  • Ölçeklenebilirlik ve hız ihtiyaçları
  • Genellikle şemanızı önceden tanımlamanıza gerek yoktur, bu nedenle değişen gereksinimleriniz varsa, bu iyi bir nokta olabilir

Son olarak, ne zaman dosya kullanılır

  • Dosya sisteminin işleyebileceği makul miktarlarda yapılandırılmamış verileriniz var.
  • Yapı, ilişkiler umrunda değil
  • Ölçeklenebilirlik veya güvenilirlik umrunda değil (bunlar dosya sistemine bağlı olarak yapılabilir)
  • Bir veritabanının ekleyeceği ek yükü istemezsiniz veya işlemezsiniz
  • Örneğin, dosya sistemine ait yapılandırılmış ikili verilerle uğraşıyorsunuz, örneğin: görüntüler, PDF'ler, belgeler vb.

14
+1, dosyaların gerçekten depolamaya uygun olduğu zamanları belirttiğinizi düşünüyorum.
GrandmasterB

15
Veriler aslında zaman: Eğer üçüncü listeye başka bir örnek ekleyebilir olan dosyalar örneğin, resim, pdf belge ve böyle yüklendi. Belli gözüküyor olabilir ama görüntülerin bir veritabanı bloğunda saklandığı durumları, herhangi bir sebep olmaksızın, hiçbir sebep olmadan gördüm.
Goran Joviç,

5
Bir web uygulaması olduğu söylenen hiçbir açık söz yoktu ama JSON yorumundan çıkardım. Bununla birlikte, bazen bir şeyler yalnızca birkaç kişi tarafından kullanılacaktır ve uygulamanın kapsamını ölçeklenebilirlik ve güvenilirlik konusunda endişelenmeyecek şekilde haklı çıkarabilirsiniz. Bununla, kümelenme ve fazlalık gibi şeyler için endişelenmemeyi kastediyorum.
Sam

8
@ GoranJovic bazen mantıklı. 10.000'den fazla görüntüyü bir dizinde saklayın; bazı dosya sistemleri durma noktasına gelecektir - bir DB, el ile alt dizin bölümleme planından daha kolay olabilir.
Martin Beckett,

2
@ MartinBeckett: son on yılın hangi dosya sistemi bunu yapıyor?
Eamon Nerbonne

55

Kimsenin bahsetmediği bir şey var ki kayıtların indekslenmesi. Şu anda yaklaşımınız gayet iyi ve çok küçük bir veri kümeniz olduğunu ve buna çok az kişinin eriştiğini varsayıyorum.

Daha karmaşık hale geldikçe, aslında bir veritabanı yaratıyorsunuz. Her ne çağırmak isteseniz, bir veritabanı diske kaydedilmiş kayıtlardan ibarettir. Dosyayı oluştururken veya MySQL , SQLite veya dosyaları oluştururken ne olursa olsun, ikisi de veritabanlarıdır.

Eksik olan, kullanımlarını kolaylaştırmak için veritabanı sistemlerinde yerleşik olan karmaşık işlevdir.

Akla gelen en önemli şey endekslemedir. Tamam, seri hale getirilmiş bir dizide veya bir JSON dizisinde 10 veya 20 veya hatta 100 veya 1000 kaydı saklayıp dosyanızdan çekip nispeten hızlı bir şekilde yineleyebilirsiniz .

Şimdi, 10.000, 100.000, hatta 1.000.000 kayıt bulunduğunu hayal edin. Birisi oturum açmaya çalıştığında, artık birkaç yüz megabayt büyüklüğünde bir dosyayı açmanız gerekecek, onu programınızdaki belleğe yükleyin, benzer boyuttaki bir bilgi dizisini çıkarın ve sonra sadece yüz binlerce kaydı yineleyin erişmek istediğiniz bir kaydı bulun.

Uygun bir veritabanı, kayıtlarda belirli alanlarda indeksler oluşturmanızı ve veritabanını sorgulamanızı ve çok büyük veri kümelerinde bile çok hızlı bir şekilde yanıt almanızı sağlar. Bunu Memcached veya hatta bir ev yapımı önbellekleme sistemi gibi bir şeyle birleştirin (örneğin, bir aramanın sonuçlarını 10 dakika boyunca ayrı bir tabloda saklayın ve bir başkasının aynı şeyi araması durumunda bu sonuçları yükleyin) ve yanan hızlı sorgulara sahip olacaksınız, manuel olarak dosya okurken / yazarken böyle büyük bir veri setiyle elde edemeyeceğiniz bir şey olacak.

Endekslemeyle gevşek bir şekilde ilişkili olan bir diğer şey de bilgi aktarımıdır. Yukarıda belirttiğim gibi, yüzlerce veya binlerce megabaytlık dosya bulunduğunda, tüm bu bilgileri belleğe yüklemek zorundasınız, el ile yineleyin (muhtemelen aynı iş parçacığında) ve verilerinizi değiştirin.

Bir veritabanı sistemiyle kendi iş parçacığında ya da kendi sunucusunda çalışacaktır. Programınız ve veritabanı sunucusu arasında aktarılanların tümü bir SQL sorgusu ve geri aktarılanların tümü erişmek istediğiniz veridir. Tüm veri setini belleğe yüklemiyorsunuz - tüm gönderdiğiniz ve aldığınız toplam veri kümenizin küçük bir kısmı.


1
1. Lütfen kullanıcı bilgilerinizi asla müşteri koduna yüklemeyin! (Sadece bir örnek olduğuna eminim) 2. İlk etapta 100 MB büyüklüğündeki bir dosyadan yükleme yapmak biraz zaman alacak. 3. Örneğiniz doğrudur, ancak yalnızca kullanıcı adıyla arama yapacağınızı varsayarsınız. Bir kullanıcı hakkında daha fazla veri depolamak istiyorsanız ne olur? örneğin Yaş. Şimdi 20-30 yaş arasındaki tüm kullanıcıları aramak istiyorsunuz. Daha da basit, jsonunuz şöyle göründüğünde adrese göre bir kullanıcı bulun: {login: {pass: pass, add1: "123 sasd", şehir: "Wherever"}}.
Thomas Clayson

2
Son noktanız potansiyel olarak doğru olabilir, ancak daha sonra eski verilerden çalışıyor olabilirim - özellikle, eğer programınızı açarsam, mevcut veritabanını yükleyin, 5 dakika sonra bir başkası oturum açar ve bir şeyi düzenlerse, veritabanım şimdiye kadar sürüm programdan çıkın ve yeniden başlatın. Daha sonra veritabanımı düzenleyip tekrar kaydedersem, diğer kullanıcının yaptığı değişikliklerin üzerine yazacağım. Bir kullanıcının veritabanına sahip olduğunuzda, bu yalnızca şifrenizi değiştirmekten herhangi bir şey olabilir. İki kullanıcı birbirlerinin oturumları sırasında şifrelerini değiştirirse, bir kullanıcı değişikliklerini tersine çevirir.
Thomas Clayson,

4
İndeksleme ile ilgili bazı şeyleri aradıktan sonra çok şey öğrendim. Gerçekten aydınlatıcıydı. Veritabanları şimdi biraz daha anlamlı. Hala anlamadığım bazı şeyler var, ama bu büyük bir gelişme. Bu cevap için teşekkürler!
MaiaVictor

4
Endeksler hakkında, hayır, veritabanı her şeyi otomatik olarak indekslemez. Yalnızca birkaç şey otomatik olarak dizine eklenirken geri kalanı "lütfen bu dizine ekleyin" ifadesini gerektirir. Ve endeksler aramayı logaritmik zamana indirger, O (log (n)), sabitden biraz daha yavaştır.
İmparator Orionii,

1
Karma tabanlı ve b ağacı tabanlı uygulama arasındaki farktan endişe etmek erken bir optimizasyondur. Veri dizinde ise, diskten okumaktan bir düzine kat daha hızlı olacaktır.
SilverbackNet

14

Basit verileriniz olduğunda, sorunuzun yorumunda açıkladığınız şeylerin bir listesi gibi, o zaman bir SQL veritabanı size pek bir şey vermez. Pek çok insan hala bunları kullanıyor, çünkü verilerinin zaman içinde daha karmaşık hale gelebileceğini biliyorlar ve veritabanında önemsiz kılan birçok kitaplık var.

Ancak yüklediğiniz, bellekte tuttuğunuz, sonra gerektiğinde yazdığınız basit bir liste olsa bile, bir takım sorunlardan muzdarip olabilir:

Anormal program sonlandırma veri kaybedebilir veya diske veri yazarken bir şeyler ters gider ve tüm dosyayı öldürmeye son verebilirsiniz. Bunu yapabilmek için kendi mekanizmalarınızı kullanabilirsiniz, ancak veritabanları bunu kanıtlanmış savaş tekniklerini kullanarak sizin için halleder.

Verileriniz çok büyüyüp çok sık güncellenmeye başlarsa, tüm verilerinizi seri hale getirmek ve tasarruf etmek büyük bir kaynak olacak ve her şeyi yavaşlatacak. Bir şeyleri nasıl bölmek için çalışmaya başlamalısın, bu yüzden o kadar pahalı olmaz. Veritabanları, yalnızca diske değişen şeyleri hataya dayanıklı bir şekilde kaydetmek için optimize edilmiştir. Ayrıca tasarlanmışlardır, böylece istediğiniz zaman küçük veri parçalarını hızlıca yükleyebilirsiniz.

Ayrıca, SQL veritabanlarını kullanmak zorunda değilsiniz. Sen kullanabilirsiniz NoSQL , sadece veri depolamak için JSON kullanırım çok "veritabanlarını". Ancak, hataya dayanıklı bir şekilde ve verilerin akıllıca bölünebileceği, sorgulanabileceği ve akıllıca birden fazla bilgisayara bölünebileceği şekilde yapılır.

Ayrıca, bazı insanlar işleri karıştırır. Giriş bilgilerini depolamak için Redis gibi bir NoSQL veri deposunu kullanabilirler . Ardından, daha ilginç sorgular yapmaları gereken yerlerde daha karmaşık verileri depolamak için ilişkisel veritabanlarını kullanın.


12

Eşzamanlılık ve güvenilirlik sorununa odaklanan birçok cevap görüyorum. Veritabanları eşzamanlılık, güvenilirlik ve performansın yanı sıra başka avantajlar da sağlar. Baytların ve karakterlerin bellekte nasıl temsil edildiğini rahatsız etmemelerine izin verir. Başka bir deyişle, veritabanları programcının kendisini “nasıl” yerine “neye” odaklanmasına izin verir.

Cevaplardan biri sorgulardan bahsediyor. "SQL veritabanına bir soru sormak" bir sorunun karmaşıklığı ile iyi ölçeklenir. Kod geliştirme sırasında geliştikçe, "hepsini getir" gibi basit sorgular, özellik1'in bu değere eşit olduğu ve ardından özellik2'ye göre sıralanabildikleri her şeyi getirecek şekilde kolayca genişletilebiliyor. Sorguların çoğu, belirli bir özellik için dizin oluşturarak performansı hızlandırabilir.

Diğer fayda, ilişkilerdir. Sorgularla iç içe döngülere sahip olan farklı veri kümelerinden gelen verileri çapraz referanslamak daha kolaydır. Örneğin, kullanıcıların ve gönderilerin farklı veri kümeleri (veya DB tabloları veya JSON nesneleri) olduğu bir sistemde 3'ten daha az kullanıcıya sahip tüm forum mesajlarını aramak, okunabilirlikten ödün vermeden tek bir sorgu ile yapılabilir.

Sonuçta, SQL veritabanları daha iyidir, eğer veri hacmi büyükse (1000'den fazla nesne diyelim), önemsiz olmayan ve farklı kod bölümlerinde farklı veri alt kümelerine erişim.


Maddelerin nasıl temsil edildiğini görmezden gelebileceğiniz fikrine biraz güveniyorum. Eğer ederken olabilir esp yapmak ve eğer bu görmezden. biraz daha karmaşık bir sorgu yazarsanız, uygulamanızın artık ölçeklendirilmemesi olasıdır. "Dizin eklemek" her zaman mümkün değildir - bununla başa çıkmak için yazmanız gerekir ve karmaşıklığı birden çok tabloya yayılan sorgularda bu kadar yardımcı olmaz. Endeksler gerektiğinde , etkileşimli sorgulanabilirlik avantajını kaybettiniz, çünkü yalnızca özel olarak yapılandırılmış sorgular makul sürede yanıtlanabilir.
Eamon Nerbonne

12

TLDR

Uygulamanız için esasen geçerli, kısa vadeli bir veri deposu teknik kararı verdiğiniz anlaşılıyor - özel bir veri deposu yönetim aracı yazmayı seçtiniz.

Her iki yönde hareket etme seçenekleri ile bir süreklilik üzerinde oturuyorsunuz.

Uzun vadede, muhtemelen (neredeyse, ancak% 100 kesinlikle değil) başınızın belada olduğunu göreceksiniz ve mevcut veri deposu çözümlerini kullanmakta değişiklik yapmanız daha iyi olabilir. Başa çıkmanız gereken özel, çok yaygın, öngörülebilir performans sorunları vardır ve kendi araçlarınızı kullanmak yerine mevcut araçları kullanmaktan daha iyi olursunuz.


Uygulamanızın içine yerleştirilmiş ve doğrudan kullanılan (küçük) bir özel amaçlı veritabanı yazmışsınız gibi gözüküyor. Fiili disk yazmayı ve okumayı yönetmek ve kombinasyonu veri deposu olarak değerlendirmek için bir işletim sistemine ve dosya sistemine güvendiğinizi farz ediyorum.

Ne yaptığını ne zaman yapmalı

Veri depolamak için tatlı bir yerde oturuyorsun. Bir işletim sistemi ve dosya sistemi veri deposu inanılmaz derecede kullanışlı, erişilebilir ve platformlar arası taşınabilir. Kombinasyon, neredeyse her standart dağıtım yapılandırmasında, sizin desteklendiğinizden ve uygulamanızın çalışmasını sağladığınızdan emin olun.

Aynı zamanda kod yazmak için de kolay bir kombinasyon - API oldukça basit ve basit ve çalışmasını sağlamak için nispeten az sayıda kod satırı gerekiyor.

Genellikle ne yaptığınızı yapmak idealdir:

  • Yeni fikirlerin prototiplenmesi
  • Akıllıca ölçeklendirilmesi gerekmeyen uygulamalar oluşturmak, akıllıca yapmak
  • Bir veritabanı kurmak için kaynak yetersizliği gibi olağandışı koşullar tarafından sınırlandırılmıştır.

Alternatifler

Süreklilik arzusunuz, ve buradan aşağıya gidebileceğiniz, 'aşağı' ve 'yukarı' olarak düşündüğüm iki yön var:

Aşağı

Bu, uygulanacak en düşük seçenek, ancak bütünlük uğruna burada:

İsterseniz aşağı inebilir , yani işletim sistemi ve dosya sistemini tamamen atlayabilir ve doğrudan diskten yazabilir ve okuyabilirsiniz. Bu seçim sadece aşırı verimlilik gerektiren durumlarda genellikle alakalı olduğunu - düşünmek, örneğin, minimal bir / küçücük bir MP3 yeterli olmadan, oyuncu cihazının RAM tamamen işlevsel OS için ya da benzeri bir şey Wayback Machine inanılmaz etkili kitle gerektirir veri yazma işlemleri (çoğu veri deposu daha hızlı okuma için daha yavaş yazılar yazar, çünkü neredeyse tüm uygulamalar için çok daha yaygın kullanım durumudur).

yukarı

Burada birkaç alt kategori var - bunlar yine de tamamen dışlayıcı değil. Bazı araçlar her ikisinde de işlevsellik sağlayan, her ikisi de bir modda çalışmaktan diğerine çalışmak arasında tamamen geçiş yapabilir ve bazıları uygulamanızın farklı bölümlerine farklı işlevler sağlayarak birbirlerinin üzerine yerleştirilebilir.

Daha güçlü veri depoları

Veri manipülasyon karmaşıklığını yönetmek için hala kendi uygulamanıza güvenirken, daha yüksek ve daha yüksek miktarda veri depolamak için kendinizi ihtiyaç duyabilirsiniz. İlgili işlevler için çeşitli destek uzantılarıyla birlikte çok çeşitli anahtar / değer depoları bulunmaktadır. NoSQL araçları diğerlerinin yanı sıra bu kategoriye girer.

Aşağıdakiler uygulamanızı tanımladığında ölçeklendirmenin açık yolu budur:

  • Olağandışı ağır okuma bağımlı
  • Düşük (kısa vadeli) tutarlılık garantileri için yüksek performansla işlem yapma konusunda sorun değil (çoğu teklif "nihai tutarlılık").
  • Veri manipülasyonunun ve tutarlılık eksikliğinin çoğunu "doğrudan" idare ediyor mu (pratikte muhtemelen ilk önce üçüncü taraf bir araç kullanacaksınız, ancak sonunda bunu uygulamanıza veya özel bir yazılı ara katmana getireceksiniz) .
  • Sakladığınız veri miktarını ve / veya "nispeten basit" veri manipülasyon gereklilikleriyle arama yeteneğinizi büyük ölçüde ölçeklendirmek istiyorsunuz.

Burada bir kıpırdatma odası var - daha yavaş okumalar için daha iyi okuma tutarlılığı elde edebilirsiniz. Çeşitli araçlar ve seçenekler, belirli uygulamanızı kolayca yazmak için uygun olabilecek veri manipülasyonu apis, indeksleme ve diğer seçenekleri sağlar. Dolayısıyla, yukarıdaki noktalar uygulamanızı neredeyse tamamen açıklarsa, daha güçlü bir veri deposu çözümü ile çalışmak için "yeterince yakın" olabilirsiniz.

Tanınmış örnekler: CouchDB , MongoDB , Redis , Microsoft'un Azure , Google App Veri Mağazası ve Amazon'un ECE'si gibi bulut depolama çözümleri .

Daha karmaşık veri işleme motorları

Veri depolama uygulamasının "SQL" ailesi ve diğerleri de saf veri depolama araçlarından ziyade veri işleme aracı olarak tanımlanmaktadır. Verilerin depolanmasının ötesinde ve çoğu zaman işlerin anahtar değer deposunda mevcut olanların ötesinde çok çeşitli ek işlevler sunarlar. Aşağıdaki durumlarda bu yolu kullanmak isteyeceksiniz:

  • Performansta bir başarıya ulaşacağınız anlamına gelse bile kesinlikle tutarlı olmalısınız.
  • Verimli bir şekilde karmaşık veri işlemlerini verimli bir şekilde yapmak istiyorsunuz - çok karmaşık JOIN ve UPDATE işlemlerini, veri küplerini ve dilimlemeyi, vb. Düşünün ...
  • Performans için sağlamlık elde etmekte sorun yok (kolay ve / veya verimli bir şekilde değiştirilemeyen tablolar gibi zorlanmış, sabit veri depolama formatları düşünün).
  • Çoğu zaman daha karmaşık araçlar ve arabirimlerle başa çıkacak kaynaklara sahipsiniz.

Bu, bir veritabanı veya veri deposunu düşünmenin daha "geleneksel" yoludur ve çok daha uzun zamandır var - bu yüzden burada mevcut çok şey var ve bununla başa çıkmak için çok fazla karmaşıklık var. Bazı uzmanlık ve bilgi almak ve basit çözümler üretmek / karmaşıklığın çoğundan kaçınmak mümkün olsa da, bu muhtemelen sizin için çoğunu yönetmek için üçüncü taraf araçlarını ve kütüphanelerini kullanmanızla sonuçlanacaktır.

İyi bilinen örnekler MySQL , SQL Server , Oracle'ın Veritabanı ve DB2'dir .

İşin dış kaynak kullanımı

Karmaşıklığı yönetmenize yardımcı olmak için, veri depolama araçlarınız ve uygulamanız arasında bir araya gelen çeşitli, modern, üçüncü taraf araçlar ve kütüphaneler vardır.

Başlangıçta, veri depolarını yönetme ve manipüle etme işinin çoğunu veya tamamını elinden almaya çalışırlar ve ideal olarak, yalnızca gerektiğinde ve gerektiğinde karmaşıklığa sorunsuz bir geçiş yapmanıza izin verir. Bu, hemen ulaşılabilir ve kullanılabilir bir kaç sonuçla birlikte aktif bir girişimcilik ve araştırma alanıdır.

İyi bilinen örnekler, MVC araçları ( Django , Yii ), Ruby on Rails ve Datomic'dir . Kelimenin tam anlamıyla adil olması zordur çünkü kelimenin tam anlamıyla çeşitli veri depolarının API'leri etrafına sarmalayıcı görevi yapan düzinelerce araç ve kitaplık vardır.


Not: Metni videoya çevirmeyi tercih ederseniz, Rich Hickey'in veritabanı ile ilgili bazı videolarını izlemek isteyebilirsiniz; Bir veri deposunu seçme, tasarlama ve kullanma konusundaki düşüncenin çoğunu açıklamak için iyi bir iş çıkarmıştır.


11

Bir dosya sistemi bir NoSQL veritabanının tanımına uyuyor, bu nedenle verilerinizi nasıl depolayacağınıza karar verirken bunu kullanmayı kesinlikle düşünmelisiniz, sadece RDBMS'nin lehine reddetmekle kalmayıp, bazı cevapların burada ortaya koyduğu gibi görünüyor.

Dosya sistemleriyle ilgili bir sorun (ve genel olarak NoSQL) veriler arasındaki ilişkileri ele almaktır. Buradaki ana engelleyici değilse, şimdilik RDBMS'yi atlayın derim. Ayrıca bir dosya sistemini depolama alanı olarak kullanmanın olumlu yanlarını da unutmayın:

  • Sıfır yönetimi
  • Düşük karmaşıklık, kurulumu kolay
  • Herhangi bir işletim sistemi, dil, platform, kütüphaneler vb. İle çalışır
  • Dizin sadece yapılandırma ayarlarıdır.
  • Test etmek önemsiz
  • Mevcut araçlarla inceleme, yedekleme, değiştirme vb.
  • İyi performans özellikleri ve işletim sistemi tarafından iyi ayarlanmış
  • Herhangi bir geliştiricinin anlaması kolay
  • Bağımlılık yok, ekstra sürücüler yok
  • Güvenlik modeli anlamak için önemsizdir ve işletim sisteminin temel bir parçasıdır
  • Veri dışarıdan erişilebilir değil

( kaynak )


10

Dosya sistemleri bir tür veritabanıdır. Belki de herkes gibi konuştuğu gibi bir RDBMS değil, en kesin anlamıyla kesinlikle bir DB. Özetlenen depolama alanlarına ve programınızın iletişim kurduğu bir API'ye sahip arama verisine (dosya içeriği) ilişkin anahtarlar (dosya adı) sağlarsınız.

Yani, bir veritabanı kullanıyorsunuz. Diğer yazılar, farklı veritabanı türlerinin erdemleri hakkında tartışabilir ...


1
veritabanı ve depolama gerçekten birbirlerinin yerine kullanılamaz. Bir veritabanı bir tür depolama alanıdır, ancak bir dosya sistemi kesinlikle bir tür veritabanı değildir
Gaz_Edge 15:13

3
"depolama", bit ve baytların tutulduğu yerdir. Bir veritabanı mutlaka bir dosya sistemindeki dosyaları kullanmaz. Bir dosya sistemi kesinlikle terimin tam anlamıyla bir veritabanı türüdür.
Chris S

6
Alternatif olduklarında veritabanlarında kullanımın olmadığını iddia eden biri için veritabanı kullanmaktır ; Evet. Onlara argümanlarının yanlış olan önyargılı bir fikre dayandığını açıklamak faydalı olabilir. İlk durumlarını daha iyi anladıklarında, mevcut teknolojilerin daha eksiksiz anlaşılmasıyla ilerlemelerine yardımcı olabiliriz. Dosya sistemleri hiyerarşik veritabanlarıdır, ilişkinin iyi bir nedeni vardır ve nesne veritabanı sistemleri bunları daha hızlı, daha iyi organize edilmiş ve daha verimli veri depolama / alma olarak desteklemiştir.
Chris S

2
@Gaz_Edge Veriler zaten yapısı ve içeriği OP'nin uygulaması tarafından yönetilen bir sürü dosyada saklanarak çeşitsiz bir "veritabanında". OP'nin bunu anlamasını ve kabul etmesini sağlamaya çalışmak , “gerçek” bir veritabanı sisteminin kullanım durumunu anlamalarını sağlamak için yararlı bir ilk adımdır; Bir çeşit "veritabanı" nın nasıl gerçekleştiğini anladıklarında, düzgün yapılandırılmış ve yönetilen bir hizmetin uygulamanın kendi işini yapmasına izin vermekten daha verimli olduğu hakkında konuşmaya başlamak daha kolaydır. Bu cevabın işe yarayıp yaramadığını öneririm.
Rob Moir

8

Verileri değiştiren birden fazla işleminiz varsa (kullanıcılar / sunucular) bir veritabanı gerekir. Ardından veritabanı, birbirlerinin değişikliklerinin üzerine yazmalarını önlemeye yarar.

Verileriniz bellekten büyük olduğunda da bir veritabanına ihtiyacınız vardır. Günümüzde elimizdeki hafıza ile, bu aslında pek çok uygulamada veritabanlarının kullanılmasını engellemektedir.

Yaklaşımınız kesinlikle "hafıza içi veritabanlarının" saçmalıklarından daha iyidir. Bu esasen sizin yaklaşımınızdır, fakat ek yükler çok fazladır.


Dürüst olmak gerekirse, bu cevabı seviyorum ve bunun doğru olmasını istiyorum, ama durumun bu olduğundan emin değilim. Örneğin, bazı kullanıcılar (ve siz) hafıza hakkında bir endişe dile getirdiler. Tabii ki, eğer GB değerinde veri saklıyorsam, hepsini hafızada tutamam. Fakat verilerin bu kadar büyük olamayacağından eminsem, sadece bellek kullanmalı mıyım? Şey, başka şeyler de var. Örneğin, CouchDB'nin artan görüşlerini öğrendim. Bu, kesinlikle, endekslemeden farklı olarak, kendinizi uygulamak için önemsiz olmayacak bir şeydir ve bir görünüm modeli kullanırken kesinlikle çok büyük bir hızlanmadır,
MaiaVictor,

ki sanırım öyleyim. Örneğin, verileri "oynatıcı listesi" den "sıralamaya" dönüştürdüğümde, bu bir harita işleminden başka bir şey değil. Bir oyun veya etkileşimli bir site oluştururken, sunduğunuz hemen hemen her şey bir haritayı azaltma işlemidir. Bu yüzden, bu tür bir optimizasyona sahip olmak gerçekten arzu edilebilir. Peki, konuştuğum herhangi biri devam ederse hiçbir fikrim yok, ama bu mantıklı. Bugün çok şey öğreniyorum ve NoSQL kavramlarını gerçekten çok beğeniyorum. Cevabınız için teşekkürler (:
MaiaVictor

7

Belirli bir uygulamanın bir RDBMS'ye ihtiyacı olup olmadığını her zaman kendinize sormalısınız. Gerekli tüm araçları ve çerçeveleri başlangıçta otomatik olarak varsayan bir tasarım süreci ile çok fazla uygulama oluşturulmuştur. İlişkisel veritabanları çok yaygındır ve birçok geliştirici daha önce olduğu gibi benzer uygulamalar üzerinde çalışmış olup, bunlar proje başlamadan önce otomatik olarak dahil edilmiştir. Birçok proje bununla başedebilir, bu yüzden çok sert yargılama.

Projenize bir olmadan başladınız ve işe yarıyor. SQL'e kadar beklemeden bu işlemi çalıştırıp çalıştırmanız daha kolaydı. Bunda yanlış bir şey yok.

Bu proje genişledikçe ve gereksinimler daha karmaşık hale geldikçe, bazı şeylerin inşa edilmesi zorlaşacaktır. Alternatif yöntemleri araştırıp test edene kadar hangisinin daha iyi olduğunu nereden biliyorsunuz? Alevlerden Programcılara ve yabancı otlara sorabilirsiniz ve bu soruyu cevaplamak için 'bağlıdır'. Öğrendikten sonra, bir veritabanının avantajlarından bazılarını ele almak için kendi dilinizde ne kadar kod satırı yazmak istediğinizi düşünebilirsiniz. Bir noktada, tekerleği yeniden icat ediyorsun.

Kolay genellikle görecelidir. Kullanıcının herhangi bir kod yazmasını gerektirmeden bir web sayfası oluşturabilecek ve bir formu bir veritabanı tablosuna bağlayabilecek bazı çerçeveler vardır. Sanırım fare ile mücadele edersen, bu bir sorun olabilir. Herkes biliyor, bu ölçeklenebilir veya esnek değil, çünkü tanrı her şeyi GUI ile sıkı sıkıya bağlamanızı yasaklıyor. Programcı olmayan bir prototip üretti; Burada birçok YAGNI bulunur.

SQL öğrenmek yerine seçtiğiniz dilde manipüle edilen bir ORM öğrenmek istiyorsanız , devam edin, ancak bir tablo oluşturmaya ve bazı verileri SQL ile popüler bir veritabanından çıkarmaya çalışın (Seç * Kimden; akıllara durgunluk veren şeyler). Yapması kolay. Bu yüzden birileri onları ilk etapta yarattı. Bilgili bir karar vermek için böyle büyük bir yatırım gibi görünmüyor. Muhtemelen bir performans testi de yapabilirsin.


Sadece not etmek gerekirse, bir "otserv" barındırdığım yıllardır mysql kullandım. Bil bakalım ne oldu? Tek getirdiği sorun oldu. İnsanlar, çıkış yaptıklarında karakterlerin kaydedildiğini fark ettikten sonra, sunucu düştüğünde değil, kirli bir numara kullanarak öğeleri "klonlayabilir". Bu, denetçiler için ciddi bir sorundur. Ve otserv topluluğu BÜYÜK. Bu sadece hafızaya veri depolarlar ve periyodik olarak seri hale getirirlerse olmazdı. Bu yüzden kaynağı kendim değiştirdim, bu uzun C ++ dosyalarını ve karakterlerin çıkışını yapmak yerine periyodik olarak MySQL'e kaydetmeye başladım. Bil bakalım ne oldu? SLOW oldu!
MaiaVictor

Mysql, her 2 dakikada bir tam kaydetme durumunu kaldıramadı. Tasarruf gerçekleştiğinde oldukça açıktı - tüm sunucu bir saniye "gecikti". Buraya gönderilen kişilerin bunun için bir cevabı olsa şimdi gerçekten minnettar olurum!
MaiaVictor

1
RDBMS'leri, muhtemelen kötü kodlanmış tek bir uygulamada olanlarla yargılamayın. Özellikle bir veritabanını destekleyecek değişiklikler veritabanı deneyimi olmayan biri tarafından yapıldığı zaman.
alroc

1
@Dokkat, umarım hiç kimse banka hesabınıza para yatırmak ve hesap bakiyesini diske yazmak "periyodik olarak" arasında güç kablosunu kullanamaz. Garantili bir veri kaybı mimarisi tanımladınız. Bazı uygulamalar için bu iyidir, ancak çoğu veritabanı uygulaması kullanıcılara seçme gücü verir. Yedeklemeli tek bir veritabanı düğümünü çalıştırabilir ve bazı veri kayıplarını riske atabilir veya tek bir düğüm başarısız olursa veri kaybını ortadan kaldırmak için çoğaltmayı kullanabilirsiniz.
mikerobi

@Dokkat böylece MySQL veya başka herhangi bir tam özellikli "sunucu" tarzı DB kullanmayın. Sqlite (veya benzeri) kullanıyorsunuz ve her seferinde diske devam ederken, uygulamanıza gömülü bir DB (bu nedenle ayrı bir kuruluma gerek kalmadan) ve size sql erişimi, işlem bütünlüğü ve disk kalıcılığı sağlıyor.
gbjbaanb

6

Verilerin diske kaydetme IS Eğer kayıt anahtarı olan dosyanın adıyla kendi dosyasındaki her nesneyi koymak, özellikle eğer bir veritabanına yazma. Dosyayı okumak için arama sürelerini en aza indirmek için, anahtarın ilk birkaç karakterini temel alan alt dizinler oluşturun.

Örneğin, key = ghostwriter, g / ho / stwriter.json veya g / h / o / stwriter.json veya g / ho / ghostwriter.json veya g / h / o / ghostwriter.json öğelerine gider. Anahtarlarınızın dağıtımına göre adlandırma düzeninizi seçin. Sıra numaraları ise 5/4/3 / 12345.json, etrafındakilerden daha iyidir.

Bu bir veritabanıdır ve ihtiyacınız olan her şeyi yaparsa, o şekilde yapın. Günümüzde bu GDBM veya Berkeley db gibi bir NoSQL veritabanı olarak adlandırılacak. Çok fazla seçenek. Önce neye ihtiyacınız olduğunu belirleyin, sonra ayrıntılarla başa çıkmak için bir arabirim kütüphanesi oluşturun, belki de memcached veya bir CRUD arayüzü gibi bir get / set arayüzü, ve sonra bir tane için veritabanı biçimini değiştirmeniz gerekirse, kütüphaneleri değiştirebileceksiniz. farklı özelliklere sahip.

PostgreSQL ve Apache Derby DB gibi bazı SQL veritabanlarının, kendi homegrown veritabanlarınız dahil olmak üzere birçok NoSQL formatının üzerinde SQL sorguları yapmanıza izin vereceğini unutmayın. MyBatis hakkında emin değilim ama benzer olabilir.

NoSQL yutturmaca kaçının. Özellikleri okuyun, performansı ve kapasiteyi test edin ve ardından uygulamanızın gereksinimlerine ne kadar iyi uyduğunu temel alarak seçin.

http://www.hdfgroup.org/HDF5/ , insanların genellikle göz önünde bulundurmadığı ilginç ve yaygın olarak kullanılan başka bir veri formatı formatıdır.


4

Veriler eşzamanlı olarak güncellenir güncellenmez, bir veri tabanı kullanan yaklaşım (bellek veri tabanında da olabilir) büyük olasılıkla daha doğru ve daha performanslı olur, aynı zamanda kodunuz kolay kalır, çünkü eşzamanlı güncellemeler, işlemler, önbellekleme, asenkron I / O ve diğerleri hakkında endişelenmek.


Bir süreç içindeki eşzamanlı değişiklik, bir grup kilit alan bir veritabanı arka planında IPC yerine süreç içi kilitlerin kullanılmasıyla daha verimli olacaktır. Fakat muhtemelen verileri değiştiren birden fazla işlemden bahsediyorsunuzdur.
dhasenan

@dhasenan - Bu, iyi veritabanı sistemlerinin bir başka avantajı. Eşzamanlılığı elde edersiniz ve her durumda çalışır: Çok iş parçacıklı, çok işlemli, farklı sunucularda birden çok müşteri veya bunların bir kombinasyonu. İyi iş parçacıklı çok iş parçacıklı programınız bazı durumlarda "daha verimli" olabilir, ancak yalnızca ölçeklendirilmez.
Ingo

-5

Burada gönderdiklerimiz gibi QA'ları depolamak / almak için bir veritabanına ihtiyacınız var! Basit bir dosya, farklı konularla ilgili verileri düzenleyemiyor.


3
Hayır, "konular" klasörler olabilir ve sitedeki "gönderiler" dosyalar olabilir. Böyle bir siteyi bir dosya sisteminden çalıştırmak kesinlikle mümkün. Etkili değil: yavaş ve karmaşık, sorguları yürüten, yeni veriler ekleyen, vb
Chris S

yavaş + karmaşık = yapamaz?
Joe,

Yapmak için yavaş ve karmaşık! = Fonksiyon için yavaş ve karmaşık
joe

1
@joe, bir dosyanın (belki de "basit" bir dosya değil, ama bu ne anlama geliyor?) farklı konularla ilgili verileri düzenlemek için kullanılamadığı doğru değil. JSON, Dokkat'ın önerdiği gibi, XML veya XML öncesi günlerde yaptığımız gibi karışık kayıt dosyaları veya hayal edebileceğiniz dosya formatlarını kullanabilirsiniz. Çoğu senaryo için bu yaklaşımların hiçbirini tavsiye etmem ama bu yapılamayacakları anlamına gelmez.
John M Gant,

@John M Gant: Sizinle tamamen aynı fikirdeyim, veritabanları tek (tamamen sevmediğiniz için) dosyalarının yerini alamaz ve tam tersi, bir arabanın bisiklet değiştirememesi nedeniyle olabilir. 3 "insan" dili konuşuyorum ve kelime ve kelime seçimlerim yanlış anlaşılmamın sebebi ... sanırım
joe
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.