Anahtar / Değer deposu veritabanı nedir?


56

NoSQL için wikipedia sayfasına bakıyorum ve Anahtar / Değer deposu veritabanında çeşitli varyasyonları listeliyor, ancak bu bağlamda Anahtar / Değer deposu tarafından ne anlama geldiğiyle ilgili hiçbir ayrıntı bulamıyorum. Birisi bana bir açıklama yapabilir veya açıklayabilir mi? Ayrıca, böyle bir veritabanını ne zaman kullanırım?


3
Hi @ indyK1ng ... Sitede birkaç soru sormuş gibi göründüğünüzü biliyorum, fakat sorular hakkında çok fazla yorum yapmadığınız da görülüyor. Site, topluma ETKİLEŞİM üzerine odaklanmıştır ve bunu yapma yöntemlerimizden biri kaliteli cevapları kabul etmek ve cevaplar bize yardımcı olmadığında geri bildirimde bulunmaktır. Sizi ya cevapları kabul etmenizi ya da yardım etmedikleri yerlere yorum eklemenizi teşvik ediyorum. Teşekkürler!
jcolebrand

Maalesef biraz garip bir durumdayım. Teklif, daha geniş veritabanları olarak adlandırıldığında geri dönüş yaptım, dikkat etmedim ve bunun daha sonra Veritabanı Yöneticileri olarak değiştirildiğini fark etmeden önce özel beta uygulamasına girdiğini gördüm. Veritabanlarının içindekilerle daha çok ilgileniyorum, ancak taahhüdümü yerine getirmek istiyorum. Üzgünüm.
indyK1ng

1
Peki, bu tür soruları sormaktan alıkoyan ne? Meta'ya gidin, inceleyin. Biz de bu soruları sormak istiyoruz. Yoksa NoSQL'in kurum içinde nasıl çalıştığı hakkında daha fazla bilgi edinmek istediğinizi mi düşünüyorsunuz? Ben de buna girebilirim, ancak bu sorunun kapsamı olduğunu düşünmedim.
jcolebrand

1
Ayrıca, burada olmak istemeseniz bile kabul etmek günah değildir ve google veya benzeri kişilerden de yardımcı olur. Profilimi ziyaret edip etmediğin gibi görebildiğin gibi "tüm cevaplarımı kabul et, repa ihtiyacım var" demiyorum. Gelecekteki kullanıcıların "sorunun faydalı bulduğu şey bu" yönünden yararlanabileceğini görmekle daha fazla ilgileniyorum.
jcolebrand

@jcolebrand Bu tür soruların sadece isim değişikliğini değerlendirerek konu dışı olarak değerlendirildiğini düşündüm. Bu yüzden bu soru ve birkaç soru daha olduğu gibi ifade edildi, bu yüzden konunun yanında olacaklardı. Bana bildirdiğiniz için teşekkür ederiz, bir şansım olduğunda daha aktif olmaya başlayacağım (kolej zamanımı almak için elinden gelenin en iyisini yapıyor, şu anda erteliyorum;).
indyK1ng

Yanıtlar:


42

Anahtar / Değer Çifti kavramına aşina mısın? Java veya C # ile aşina olduğunuzu varsayalım, bu bir harita / karma / datatable / KeyValuePair (bu C # durumunda)

Çalışma şekli bu küçük örnek şemada gösterilmiştir:

Color        Red
Age          18
Size         Large
Name         Smith
Title        The Brown Dog

Bir anahtarın (solda) ve bir değerin (sağda) olduğu yerde ... bunun bir dize, int veya benzeri olabileceğine dikkat edin. Çoğu KVP nesnesi sağdaki herhangi bir nesneyi saklamanıza izin verir, çünkü bu yalnızca bir değerdir.

Döndürmek istediğiniz belirli bir nesne için her zaman benzersiz bir anahtara sahip olacağınız için, o benzersiz anahtara ilişkin veritabanını sorgulayabilir ve hangi düğümün nesnesine sahip olduğu sonuçlarını geri alabilirsiniz (bu nedenle dağıtılmış sistemler için iyidir, diğer düğümlerin geri dönüşleri ile eşleşen bir değer döndüren ilk düğümlerin yoklanması gibi başka şeyler olduğu için).

Şimdi yukarıdaki örneğim çok basit, işte KVP'nin biraz daha iyi bir sürümü.

user1923_color    Red
user1923_age      18
user3371_color    Blue
user4344_color    Brackish
user1923_height   6' 0"
user3371_age      34

Basit anahtar üretimini görebileceğiniz gibi, "kullanıcı" ifadesini userunique, bir alt çizgi ve nesneyi koymaktır. Yine, bu basit bir varyasyondur, ancak soldaki kısmı tanımlayabildiğimiz ve tutarlı biçimde biçimlendirdiğimiz, değeri çıkarabildiğimiz sürece anlamaya başladığımızı düşünüyorum.

Anahtar değeri (tamam, yalnızca metin gibi bazı sınırlamalar olabilir) veya value özelliği (boyut sınırlaması olabilir) konusunda herhangi bir kısıtlama bulunmadığına dikkat edin, ancak şu ana kadar gerçekten karmaşık sistemlere sahip değildim. Hadi biraz daha ileri gidelim:

app_setting_width      450
user1923_color         Red
user1923_age           18
user3371_color         Blue
user4344_color         Brackish
user1923_height        6' 0"
user3371_age           34
error_msg_457          There is no file %1 here
error_message_1        There is no user with %1 name
1923_name              Jim
user1923_name          Jim Smith
user1923_lname         Smith
Application_Installed  true
log_errors             1
install_path           C:\Windows\System32\Restricted
ServerName             localhost
test                   test
test1                  test
test123                Brackish
devonly
wonderwoman
value                  key

Fikri elde edersiniz ... tüm bunlar dağıtılmış düğümler üzerinde büyük bir "tabloda" saklanır (her şeyin arkasında matematik vardır) ve dağıtılmış sisteme sadece isminizle ihtiyacınız olan değeri sorarsınız.

En azından, hepsinin nasıl çalıştığını anladım. Yanlış bir şeyler yapabilirim, ama temel olan bu.


zorunlu wikipedia bağlantı http://en.wikipedia.org/wiki/Associative_array


1
düzenlemek yerine sadece bu bağlantıyı ekleyeceğim en.wikipedia.org/wiki/Distributed_hash_table ve buranın NoSQL ölçeklenebilirliğinin sihrinin geldiği yer olduğunu ve iki seçeneğiniz olduğunu belirtin: ya bunun arkasındaki matematiği anlayın çalışır ya da sistemleri uygulayan adamların bu konudaki matematiği anlamalarına güvenirler. Ayrıca MongoDB ve diğer bazı NoSQL gruplarına FLOSS podcast'lerini de tavsiye ediyorum, çünkü bunlar hakkında daha detaylı konuşuyorlar twit.tv/floss
jcolebrand

Öyleyse, Anahtar / Değer veritabanları ile geleneksel satır yönelimli veritabanları arasındaki fark nedir?
skan

1
Çok sayıda sütun yerine genellikle yalnızca iki (veya üç veya bir kaç tane daha, söz konusu meta verilere bağlı olarak) sütunların olması ve türlerinin çoğu kez düzeltilmesi. Geleneksel bir RDBMS'de bir KVP mağazası oluşturmamanın bir nedeni yoktur, bunun dışında temelde bir şema değildir.
jcolebrand

Neden user1923_color: red, user1923_age: 18, ...aksine yaptığını bana göre belirsiz user1923: {color: red, age: 18, ...}.
15'te

1
MongoDB ile ilgili FLOSS podcast'i twit.tv/shows/floss-weekly/episodes/105
eleijonmarck

25

SQL terimlerinde, bir NoSQL veritabanı iki sütunlu tek bir tablodur: biri (Birincil) Anahtar, diğeri ise Değer. Ve hepsi bu, hepsi NoSQL büyüsü.

NoSQL'i bir ana nedenden dolayı kullanırsınız: ölçeklenebilirlik.

Uygulamanızın saniyede milyonlarca sorguyu ele alması gerekiyorsa, bunu başarmanın tek yolu daha fazla sunucu eklemektir. NoSQL ile bu çok ucuz ve kolaydır. Buna karşılık, geleneksel bir SQL veritabanını ölçeklendirmek çok daha karmaşıktır.

Sadece dışarıdaki en büyük web siteleri aslında tam olarak NoSQL potansiyelinden (yani Facebook, Cassandra'yı çalıştıran binlerce sunucuya) sahip oluyor .

SQL, NoSQL ve ORM'yi karşılaştırarak bu blog gönderisini okumanızı şiddetle tavsiye ederim:

http://seldo.com/weblog/2010/07/12/in_defence_of_sql


Bu yüzden cevabımı düzenlemeliyim, ölçeklenebilirliğin nasıl çalıştığını açıklamak için ... Dün gece o kısmı açıklamayı unuttum.
jcolebrand

2
NoSQL kullanmak için başka bir iyi durumun şema esnekliği olduğunu iddia ediyorum. Mongo ve KVP'ler gibi DB'ler içinde ne olduğunu umursamıyor. Veritabanını ararsanız ve belirli bir alanı yoksa, hiçbir şey döndürmez.
Snowburnt

13

NoSQL hareketi ve ilişkisel olmayan veritabanları modelinin temel anlayışına sahip olduğunuzu varsayıyorum.

Anahtar Değer deposu, grafik gibi belgeye dayalı veritabanı modelleri gibi ilişkisiz veritabanı modellerinden biridir.

Anahtar Değer depoları ve NoSQL hareketi

Genel olarak, SQL özel olarak yapılandırılmış verilerle uğraşmayı başardı ve söz konusu departmanın ihtiyaçlarına göre oldukça dinamik sorgular sağladı.

Bu alanda SQL için hala gerçek bir rakip bulunmamakla birlikte, günlük web uygulamalarında kullanım durumu farklıdır. Büyük tablolar üzerinde dış ve iç bağlantılar, sendikalar ve karmaşık hesaplamalar ile dolu oldukça dinamik bir sorgu aralığı bulamazsınız. Genelde çok nesneye yönelik bir düşünce tarzı bulacaksınız. Özellikle MVC gibi kalıpların benimsenmesiyle, arka uçtaki veriler genellikle bir veri tabanı için değil, insanların da büyük yazılım altyapılarını anlamada başa çıkmalarına yardımcı olan mantıksal bütünlük için modellenmiştir. Nesne yönelimli modelleri ilişkisel veritabanlarına yerleştirmek için yapılan şey, karmaşık tablo hiyerarşilerine yol açan ve tamamen nesne yönelimli programlamanın arkasındaki ana fikre karşı yönlendiren çok sayıda normalleştirmedir.

SQL'in karmaşık veri kümeleri için rastgele dinamik sorgulara izin verdiği gerçeği, yalnızca temel olarak çoğu uygulamanın yaptığı günlerde, nesne odaklı verilerin sürekli depolanması için bir SQL Veritabanı kullanılarak işe yaramaz hale getiriliyor.

Anahtar Değer mağazalarının devreye girdiği yer burasıdır. Key value stores allow the application developer to store schema-less data. This data is usually consisting of a string which represents the key and the actual data which is considered to be the value in the "key - value" relationship. Verilerin kendisi genellikle programlama dilinin (bir dize, bir tam sayı, bir dizi) ya da programlama dilleri tarafından anahtar değer deposuna bağlanan bir nesnenin ilkeldir. Bu, sabit veri modeline duyulan ihtiyacın yerini alır ve uygun şekilde biçimlendirilmiş verilerin daha az katı olmasını sağlar.

They all allow storage of arbitrary data which is being indexed using a single key to allow retrieval. "Daha basit" mağazalar için en büyük fark, farklı mağazaların kimliğini doğrulama veya erişeme yönteminizdir (eğer mümkünse). Verilerin depolanmasında ve alınmasındaki hız avantajları, onu genel SQL Veritabanları üzerinden düşünmek için bir neden olsa da, anahtar-değer depolarını kullanırken ortaya çıkan bir diğer büyük avantaj, sonuç kodunun, içine yerleştirilmiş SQL dizeleriyle karşılaştırıldığında temiz ve basit görünme eğiliminde olmasıdır. programlama diliniz Bu, insanların Hazırda Bekletme veya Aktif Kayıt gibi nesne-ilişkisel haritalama çerçeveleriyle savaşma eğiliminde oldukları bir şeydir. Nesne ilişkisel eşleştiricilere sahip olmak, temel olarak bir SQL veritabanı ile nesne yönelimli bir programlama dili arasına birçok karmaşık kod ekleyerek bir anahtar değer deposunu taklit ediyor gibi görünmektedir.

Bütün bir topluluk " NoSQL " etiketi altında toplanır ve bu avantajları ve ayrıca alternatif veritabanı yönetim sistemlerine alternatif kullanmanın dezavantajlarını tartışır. devamını oku
Bu biraz eski bir makale, ama çok faydalı buldum.

when would I use such a database? Could someone explain or link an explanation to me?
Mimari karardan daha fazlası ve tartışmalı bir karar ... Ölçeklenebilirlik, performans vb. Gibi birçok faktörü göz önünde bulundurmalısınız.

Aşağıdaki slaytları / makaleleri görüntüleyin; anahtar değer deposunu ne zaman, neden ve neden kullanmadığınızı anlayacaksınız :)


12

Diğerleri bunu açıkladı ama ben yine de bıçaklanacağım.

Bir anahtar / değer veritabanı, verileri bir birincil anahtarla depolar. Bu, bir kovadaki kaydı benzersiz şekilde tanımlamamızı sağlar. Tüm değerler benzersiz olduğundan, aramalar inanılmaz derecede hızlıdır: her zaman basit bir disk aramasıdır.

Değer sadece herhangi bir değerdir. Verilerin saklanma şekli veritabanına göre opaktır. Verileri bir anahtar / değer deposunda sakladığınızda, veritabanı XML, JSON, metin veya resim olup olmadığını bilmiyor veya umursamıyor. Aslında, bir anahtar / değer deposunda yaptığımız şey, verilerin veritabanından nasıl depolandığını anlama konusundaki sorumluluğumuzu verilerimizi alan uygulamalara taşımaktır. Her kova için endişelenecek tek bir anahtar dizisine sahip olduğunuzdan, anahtarların birçok sunucuya dağıtılması ve bu verilere hızlı bir şekilde erişilmesini sağlamak için dağıtılmış programlama teknikleri kullanmak çok kolaydır (her sunucu bir dizi veriyi depolar) .

Verilere bu yaklaşımın bir dezavantajı, aramanın çok zor bir iş olduğudur. Kova verilerinizdeki her kaydı okumalısınız veya ikincil dizinleri kendiniz oluşturmalısınız .

Bir anahtar / değer veritabanı kullanmak isteyebileceğiniz birkaç neden var:

  • Yazma performansı en yüksek önceliğiniz olduğunda. Mozilla Test Pilot , verileri hızlı bir şekilde kaydetmek için bir anahtar / değer veritabanı kullanır.
  • Okurların yalnızca PK tarafından gerçekleştiği garanti edildiğinde.
  • Düz bir veri modeli ile çalışırken.
  • RDBMS'de modellenemeyen zengin, karmaşık bir veri modeli ile çalışırken.

Bir RDBMS kullanmakta olduğu gibi bir anahtar / değer veritabanını kullanmak için pek çok neden vardır ve bir tanesini diğerini haklı çıkarmak için birçok argüman vardır. Verilerinizi nasıl sorguladığınıza bir göz atmanız ve veri erişim düzeninin nasıl veri ekleyeceğiniz ve saklayacağınız konusunda nasıl rehberlik ettiğini anlamak önemlidir.

Anahtar / değer veritabanının sadece bir tür NoSQL veritabanı olduğunu unutmayın.


8

İlişkisel bir veritabanınız varsa, bunu kolayca deneyebilirsiniz:

create table keyvalue (my_key varchar2(255), my_value varchar2(255));
create unique index ix_keyvalue on keyvalue (my_key, my_value);

Berkeley DBM'nin 1979'dan itibaren iyi bir örnek olmasıyla , tüm veritabanlarının eskisi gibi bir durum vardı. O zamandan beri işler daha da gelişti ( herhangi bir RDBMS'de anahtar başına birçok değere sahip olabilirsiniz ). Birçok uygulama için bir anahtar-değer deposu yeterlidir (örneğin, sendmail takma adlarını bu şekilde saklar). Ancak, değeri kendi kodunuzda ön işleme koyarsanız (veya "anahtarınızı" yapmak için dizeleri birleştirirseniz), belki de değeri bir sınırlayıcıda bölüştürmek veya ayrıştırmak, kullanmadan önce muhtemelen kullanmanız gerekmeyecektir. Bir RDBMS ve aslında bu şekilde depolamak.


Gaius'tan hala yeni 'NoSQL' Anahtar Değer DB'nin yukarıda tarif ettiği masanın yapamayacağı şeyleri yapabileceği cevabını henüz anlayamadım. Tabloyu farklı bir sunucu düğümündeki farklı tablolara bölmenin dışında.
GyRo

2
Bölünmek anadir ve onu iskonto etmeyin, fark. Paralel işlemi birçok sunucu üzerinden geri almak için bir TON verisine sahip olduğunuzda büyük bir hız farkı olabilir.
user441521,
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.