2010-02-28 13 views
13

Sono stato alla ricerca di DB noSQL e non sono stato in grado di rispondere in modo soddisfacente per conto mio: è possibile costruire query complesse contro DB noSQL?È possibile costruire query complesse contro DB noSQL

Il tipo di query che sto chiedendo circa sarebbe qualcosa di simile:

select * from DB where 
vara > x AND 
varb = 2 AND 
varc < x AND 
vard in (x,y,z) AND 
vare like '%texthere%' AND 
varf = 2 AND 
varg = 3 and 
etc... 

NOTA: Mi rendo conto che non posso usare SQL, come sopra, quello che sto chiedendo è come vorrei interrogare usando la logica psuedo sopra, in altre parole un sacco di diverse condizioni. Finora la risposta migliore che ho trovato è che si dispone di un RDBMS per interrogare e quindi acquisire i dati in base alla chiave dal cloud. Questo non sembra necessariamente più efficiente per me.

Quindi come follow-up. Se provassi solo a risolvere un problema di "ricerca di 4 milioni di righe" anziché un problema di "miliardi di file di dati", dovrei preoccuparmi di guardare un DB noSQL?

risposta

9

In mongodb, si sarebbe solo fare qualcosa di simile db.mytbl.find({"vara": { $gt: 10}, "varb": 2, "varc": {$lt: 100 }})

Vedere here e here per gli esempi

1

Non sono un esperto NoSQL, ma come dice il nome, non si basano su SQL. Probabilmente puoi fare quello che vuoi, ma dovrai codificare map/ridurre la funzione o altro modo non SQL per interrogare i dati.

Forse questo blog fornire informazioni utili per voi: Query processing for NoSQL database

5

Dipende l'archivio dati stiamo usando.

Uso frequentemente AppEngine e il loro archivio dati consente solo la disuguaglianza su una colonna (e quella colonna deve essere il primo elemento nell'ordine di ordinamento. Quindi non sareste in grado di eseguire la query che avete postato, ma potreste fare un simile uno:.

select * from DB where 
vara > x AND 
varb = 2 AND 
varc in (t,u,v,w) 
vard in (x,y,z) AND 
varf = 2 AND 
varg = 3 

Inoltre, si possono fare cose come hanno una colonna che contiene una lista di stringhe e selezionare le righe che hanno un valore nell'elenco

Quindi, la risposta ufficiale è "forse, sorta, a volte, ma non proprio, tranne quando si "

0

A mio parere, è possibile farlo in un archivio dati di documenti, come MongoDB, ma non facilmente in un archivio dati a valore chiave come Cassandra. Se dovessi farlo in un archivio dati di valori-chiave, la chiave composta dovrebbe identificare tutti gli elementi di dati interrogati (colonne). In altre parole, un'istanza dovrebbe avere tutte le colonne della query. Questo è possibile. In un archivio di valori-chiave vanilla, c'è un elemento dati (colonna) per chiave ma puoi farlo per supportare molti. Un archivio di valori chiave lo consente poiché il valore è solo un valore stringa e può contenere ciò che si desidera. Raccomando più elementi di dati (colonne) per chiave ma dovresti programmare per questo. Se invece si hanno le colonne in istanze di colonne diverse, sarebbe molto lento cercare i dati verticalmente, anche se le colonne sono ordinate. L'esempio nella tua domanda ha solo una tabella. Se si dispone di più tabelle relazionali, negli archivi valore-chiave si dovrà creare una nuova famiglia di colonne per memorizzare i dati uniti e si dovranno comunque disporre di più elementi dati per chiave. Tuttavia, dovrebbe essere pre-caricato orizzontalmente in un'istanza in una famiglia da un processo simile a ETL. In altre parole, unire i dati prima che vengano caricati nell'archivio dei valori chiave e progettare l'archivio dati Cassandra per archiviare i dati già combinati in una colonna con più valori. O utilizzare il data mining. Credo che "big data analytics" stia attualmente affrontando questo problema nei negozi di valore-chiave.Un altro esempio, meno sofisticato del tuo, è il modo in cui nei negozi con valore-chiave puoi produrre un semplice report di fatturato e volume per cliente per prodotto per settimana?

Problemi correlati