Che cos'è un database di archivio chiave / valore?


56

Ho cercato la pagina di Wikipedia per NoSQL ed elenca diverse varianti nel database dell'archivio chiave / valore, ma non riesco a trovare alcun dettaglio su cosa significhi nell'archivio chiave / valore in questo contesto. Qualcuno potrebbe spiegare o collegare una spiegazione a me? Inoltre, quando dovrei usare un tale database?


3
Ciao @ indyK1ng ... Ho notato che sembra che tu abbia posto alcune domande sul sito, ma che non hai dato molti commenti sulle domande. Il sito è incentrato sull'INTERAZIONE della comunità e uno dei modi in cui lo facciamo è accettare risposte di buona qualità e fornire feedback quando le risposte non ci aiutano. Vorrei incoraggiarti ad accettare risposte o aggiungere commenti dove non aiutano. Grazie!
jcolebrand

Sfortunatamente sono in una situazione imbarazzante. Mi sono impegnato nuovamente quando la proposta era il più ampio termine definito database, non ho prestato attenzione, quindi ho visto questo passare alla beta privata prima di sapere che era stato modificato in Amministratori di database. Sono più interessato alle viscere dei database, ma voglio mantenere il mio impegno. Scusate.
indyK1ng

1
Quindi cosa ti impedisce di fare questo tipo di domande? Vai su Meta, esamina. Vogliamo porre anche queste domande. O hai intenzione di volere maggiori informazioni approfondite su come funziona NoSQL nei suoi interni? Posso approfondire anche questo, ma non pensavo fosse lo scopo di questa domanda.
jcolebrand

1
Inoltre, accettare non è un peccato anche se non vuoi essere qui, e aiuta quelli di Google o simili. Non sto dicendo "accetta tutte le mie risposte, ho bisogno del rappresentante" come puoi vedere se visiti il ​​mio profilo, io no. Sono più interessato a vedere che i futuri utenti potranno beneficiare della direzione fornita da "questo è ciò che il richiedente ha trovato utile".
jcolebrand

@jcolebrand Ho pensato che questo tipo di domande fossero considerate fuori tema a giudicare dal cambio di nome. Ecco perché questa domanda e alcune altre mie domande sono state formulate così com'erano, quindi sarebbero state dalla parte dell'argomento. Grazie per avermelo fatto notare, inizierò a essere più attivo una volta che ne avrò la possibilità (il college sta facendo del suo meglio per occupare il mio tempo, sto procrastinando in questo momento;)).
indyK1ng

Risposte:


42

Conosci il concetto di coppia chiave / valore? Presumendo che tu abbia familiarità con Java o C # questo è nella lingua come una mappa / hash / datatable / KeyValuePair (l'ultimo è nel caso di C #)

Il modo in cui funziona è dimostrato in questo piccolo diagramma di esempio:

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

Dove hai una chiave (a sinistra) e un valore (a destra) ... nota che può essere una stringa, int o simili. La maggior parte degli oggetti KVP ti consente di memorizzare qualsiasi oggetto sulla destra, perché è solo un valore.

Poiché avrai sempre una chiave univoca per un particolare oggetto che desideri restituire, puoi semplicemente eseguire una query nel database per quella chiave univoca e ottenere i risultati da qualunque nodo abbia l'oggetto (ecco perché è buono per i sistemi distribuiti, dal momento che ci sono altre cose coinvolte come il polling per i primi n nodi che restituiscono un valore che corrisponde ad altri ritorni dei nodi).

Ora il mio esempio sopra è molto semplice, quindi ecco una versione leggermente migliore di KVP

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

Come puoi vedere, la semplice generazione di chiavi consiste nel mettere "user" il numero univoco, un carattere di sottolineatura e l'oggetto. Ancora una volta, questa è una semplice variazione, ma penso che iniziamo a capire che fino a quando possiamo definire la parte a sinistra e averla formattata in modo coerente, possiamo estrarne il valore.

Si noti che non ci sono restrizioni sul valore della chiave (ok, ci possono essere alcune limitazioni, come solo il testo) o sulla proprietà del valore (potrebbe esserci una limitazione della dimensione) ma finora non ho avuto sistemi davvero complessi. Proviamo ad andare un po 'oltre:

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

Ti viene l'idea ... tutti quelli sarebbero archiviati in un'unica "tabella" sui nodi distribuiti (c'è la matematica dietro tutto) e chiederesti semplicemente al sistema distribuito il valore di cui hai bisogno per nome.

Per lo meno, questa è la mia comprensione di come funziona tutto. Potrei avere alcune cose sbagliate, ma queste sono le basi.


link wikipedia obbligatorio http://en.wikipedia.org/wiki/Associative_array


1
piuttosto che modificare includerò questo link en.wikipedia.org/wiki/Distributed_hash_table e sottolineerò che è qui che entra in gioco la magia della scalabilità di NoSQL e che hai due opzioni: o capire la matematica dietro perché questo funziona, o si fida che i ragazzi che implementano i sistemi capiscano la matematica su questo. Consiglio anche i podcast FLOSS per MongoDB e molti altri gruppi NoSQL perché parlano di queste cose in modo più dettagliato twit.tv/floss
jcolebrand

Allora qual è la differenza tra database Key / Value e database tradizionali orientati alle righe?
skan

1
Il fatto che spesso ci siano solo due (o tre, o poche altre, a seconda dei metadati coinvolti) invece di un numero enorme di colonne, e i tipi sono spesso fissi. Non c'è motivo di NON creare un negozio KVP in un RDBMS tradizionale, tranne per il fatto che è sostanzialmente privo di schemi.
jcolebrand

Non mi è chiaro il motivo per cui dovresti fare user1923_color: red, user1923_age: 18, ...al contrario user1923: {color: red, age: 18, ...}.
aroth

1
Il podcast FLOSS su MongoDB è su twit.tv/shows/floss-weekly/episodes/105
eleijonmarck

25

In termini SQL, un database NoSQL è una singola tabella con due colonne: una è la chiave (primaria) e l'altra è il valore. E questo è tutto, questa è tutta la magia di NoSQL.

Utilizzeresti NoSQL per un motivo principale: la scalabilità.

Se l'applicazione deve gestire milioni di query al secondo, l'unico modo per raggiungerla è aggiungere più server. Questo è molto economico e facile con NoSQL. Al contrario, il ridimensionamento di un database SQL tradizionale è molto più complicato.

Solo i più grandi siti Web là fuori stanno sfruttando appieno il potenziale NoSQL, ad esempio Facebook, con migliaia di server che eseguono Cassandra .

Consiglio vivamente di leggere questo post sul blog, confrontando SQL, NoSQL e ORM:

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


Ecco perché dovrei modificare la mia risposta, per spiegare come funziona la scalabilità ... Ho dimenticato di spiegare quella parte ieri sera.
jcolebrand

2
Direi che un altro buon caso per usare NoSQL è la flessibilità dello schema. I DB come Mongo e KVP non si preoccupano di quello che hai lì dentro. Se cerchi nel database e non ha un campo particolare, semplicemente non restituirà nulla.
Snowburnt

13

Presumo che tu abbia una conoscenza di base del movimento NoSQL e dei modelli di database non relazionali.

Key Value store è uno dei modelli di database non di relazione, come i grafici, i modelli di database orientati ai documenti.

Key Value store e il movimento NoSQL

In generale, SQL è riuscito a gestire dati appositamente strutturati e ha consentito query altamente dinamiche in base alle esigenze del dipartimento in questione.

Sebbene non ci siano ancora veri concorrenti per SQL in questo specifico campo, il caso d'uso nelle applicazioni Web quotidiane è diverso. Non troverai una gamma altamente dinamica di query piene di join interni ed esterni, sindacati e calcoli complessi su tabelle di grandi dimensioni. Di solito troverai un modo di pensare molto orientato agli oggetti. Soprattutto con l'adozione di modelli come MVC, i dati nel back-end di solito non vengono modellati per un database, ma per l'integrità logica che aiuta anche le persone a essere in grado di far fronte alla comprensione di enormi infrastrutture software. Ciò che viene fatto per inserire questi modelli orientati agli oggetti nei database relazionali è una grande quantità di normalizzazione che porta a complesse gerarchie di tabelle e si oppone completamente all'idea principale alla base della programmazione orientata agli oggetti.

Il fatto che SQL consenta query dinamiche arbitrarie per insiemi di dati complessi viene reso inutile utilizzando un database SQL solo per l'archiviazione persistente di dati orientati agli oggetti, che è ciò che sostanzialmente fanno la maggior parte delle applicazioni in questi giorni.

È qui che entrano in gioco i negozi Key Value. 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. I dati stessi sono in genere una sorta di primitiva del linguaggio di programmazione (una stringa, un numero intero, un array) o un oggetto che viene eseguito il marshalling dai bind dei linguaggi di programmazione nell'archivio valori chiave. Ciò sostituisce la necessità di un modello di dati fisso e rende meno rigoroso il requisito di dati correttamente formattati.

They all allow storage of arbitrary data which is being indexed using a single key to allow retrieval. La differenza principale per i negozi "più semplici" è il modo in cui è possibile (o non è possibile) autenticare o accedere a diversi negozi (se possibile). Mentre i vantaggi di velocità nella memorizzazione e nel recupero dei dati potrebbero essere un motivo per considerarli rispetto ai comuni database SQL, un altro grande vantaggio che emerge quando si utilizzano gli archivi di valori-chiave è che il codice risultante tende ad apparire pulito e semplice rispetto alle stringhe SQL incorporate in il tuo linguaggio di programmazione. Questo è qualcosa che le persone tendono a combattere con i framework di mappatura relazionale agli oggetti come Hibernate o Active Record. Avere un mappatore relazionale di oggetti sembra fondamentalmente emulare un archivio di valori chiave aggiungendo molto codice molto complesso tra un database SQL e un linguaggio di programmazione orientato agli oggetti.

Un'intera comunità di persone si riunisce sotto il tag " NoSQL " e discute di questi vantaggi e anche degli svantaggi dell'utilizzo di alternative ai sistemi di gestione di database relazionali. leggi di più
Questo è un articolo un po 'vecchio, ma l'ho trovato molto utile.

when would I use such a database? Could someone explain or link an explanation to me?
È più una decisione architettonica, e discutibile ... Devi considerare molti fattori come la scalabilità, le prestazioni ecc ...

Visualizza le diapositive / articoli seguenti e avrai un'idea di quando, perché e perché non utilizzare l'archivio valori chiave :)


12

Altri hanno spiegato questo, ma ho intenzione di prendere un colpo comunque.

Un database chiave / valore archivia i dati in base a una chiave primaria. Questo ci consente di identificare in modo univoco un record in un bucket. Poiché tutti i valori sono unici, le ricerche sono incredibilmente veloci: è sempre una ricerca semplice del disco.

Il valore è qualsiasi tipo di valore. Il modo in cui i dati vengono archiviati è opaco per il database stesso. Quando si archiviano i dati in un archivio chiave / valore, il database non conosce o si preoccupa se si tratta di XML, JSON, testo o immagine. In effetti, ciò che stiamo facendo in un archivio chiave / valore è spostare la responsabilità di comprendere come i dati vengono archiviati dal database nelle applicazioni che recuperano i nostri dati. Dal momento che hai una sola gamma di chiavi di cui preoccuparti per bucket, è molto facile diffondere le chiavi su molti server e utilizzare tecniche di programmazione distribuita per consentire l'accesso rapido a questi dati (ogni server memorizza una gamma di dati) .

Uno svantaggio di questo approccio ai dati è che la ricerca è un compito molto difficile. Devi leggere ogni record nel tuo secchio di dati oppure devi creare tu stesso indici secondari .

Esistono alcuni motivi per cui potresti voler utilizzare un database chiave / valore:

  • Quando la performance di scrittura è la tua massima priorità. Mozilla Test Pilot utilizza un database chiave / valore per registrare rapidamente i dati.
  • Quando le letture sono garantite solo da PK.
  • Quando si lavora con un modello di dati flat.
  • Quando si lavora con un modello di dati ricco e complesso che non può essere modellato in un RDBMS.

Ci sono circa altrettanti motivi per usare un database chiave / valore quanti ne sono per usare un RDBMS e ci sono altrettanti argomenti per giustificare l'uno sull'altro. È importante dare un'occhiata al modo in cui si esegue la query dei dati e capire come quel modello di accesso ai dati guida il modo in cui verranno inseriti e archiviati i dati.

Basta ricordare che un database chiave / valore è solo un tipo di database NoSQL.


8

Se si dispone di un database relazionale, è possibile sperimentare facilmente questo:

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

Ecco come erano tutti i database, con Berkeley DBM come un buon esempio, dal 1979. Da allora, le cose sono avanzate (puoi avere molti valori per chiave in qualsiasi RDBMS). Per molte applicazioni è sufficiente un archivio di valori-chiave (ad esempio, in questo modo sendmail memorizza i suoi alias). Ma se ti ritrovi a pre-elaborare il valore nel tuo codice (o concatenare stringhe per creare la tua "chiave"), forse suddividendo il valore su un delimitatore o analizzandolo, prima di poterlo utilizzare, probabilmente starai meglio con un RDBMS e in realtà lo memorizza in quel modo.


Non è ancora chiaro da Gaius rispondere a ciò che il nuovo DB di valori-chiave 'NoSQL' può fare che la tabella sopra descritta non può fare. Oltre a dividere la tabella in tabelle diverse su nodi server diversi.
GyRo,

2
La suddivisione è la differenza principale e non scontarla. Quando hai una tonnellata di dati in grado di elaborare in parallelo il recupero su molti server può essere un'enorme differenza di velocità.
user441521,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.