2010-02-28 13 views
13

? He estado investigando no SQL DB y no he podido responder satisfactoriamente a esto: ¿es posible construir consultas complejas contra noSQL DB?¿Es posible construir consultas complejas contra noSQL DB

El tipo de consulta que estoy pensando en que sería algo como esto:

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: No soy consciente de que no puedo utilizar SQL, como el anterior, lo que pregunto es cómo ¿Preguntaría usando la lógica de psuedo anterior, en otras palabras, un montón de condiciones diferentes? Hasta ahora, la mejor respuesta que he encontrado es que tienes un RDBMS para consultar y luego tomar datos basados ​​en la clave de la nube. Eso no necesariamente me parece más eficiente.

Como seguimiento. Si solo intentamos resolver un problema de "búsqueda de 4 millones de filas" en lugar de un problema de "tenemos miles de millones de filas de datos", ¿debería siquiera molestarme en buscar un DB noSQL?

Respuesta

9

En mongodb, usted acaba de hacer algo como db.mytbl.find({"vara": { $gt: 10}, "varb": 2, "varc": {$lt: 100 }})

Ver here y here para ejemplos

1

No soy un experto en NoSQL, pero como su nombre lo indica, no dependen necesariamente de SQL. Probablemente puedas hacer lo que quieras, pero necesitarás codificar la función de mapa/reducción u otra forma distinta de SQL para consultar los datos.

Tal vez este blog proporcionan información útil para usted: Query processing for NoSQL database

5

Depende del almacén de datos están usando.

Uso AppEngine con frecuencia y su almacén de datos solo permite desigualdad en una columna (y esa columna debe ser el primer elemento en el orden de clasificación. Por lo tanto, no podría ejecutar la consulta que publicó, pero podría hacer similar:.

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 

Además, se pueden hacer cosas como tienen una columna que contiene una lista de cadenas y seleccionar las filas que tienen un valor en la lista

por lo tanto, la respuesta oficial es "tal vez, sorta, a veces, pero no realmente, excepto cuando sí "

0

En mi opinión, puede hacer esto en un almacén de datos de documentos, como MongoDB, pero no fácilmente en un almacén de datos clave-valor como Cassandra. Si tuviera que hacerlo en un almacén de datos clave-valor, la clave compuesta tendría que identificar todos los elementos de datos consultados (columnas). En otras palabras, una instancia debería tener todas las columnas de consulta. Esto es posible. En un almacén de valores-clave vainilla, hay un elemento de datos (columna) por clave, pero puede hacerlo para admitir muchos. Un almacén de valores clave lo permite porque el valor es solo un valor de cadena y puede contener lo que desee. Recomiendo múltiples elementos de datos (columnas) por clave, pero tendrías que programar para esto. Si en cambio tiene las columnas en diferentes instancias de columna, sería muy lento buscar los datos verticalmente, aunque las columnas estén ordenadas. La muestra en su pregunta tiene solo una tabla. Si tiene varias tablas en relaciones, en almacenes de valores-clave, tendría que crear una nueva familia de columnas para almacenar los datos unidos y aún tendría que tener múltiples elementos de datos por clave. Sin embargo, debería precargarse horizontalmente en una instancia en una familia mediante un proceso similar a ETL. En otras palabras, una los datos antes de que se carguen en el almacén de valores clave y diseñe el almacén de datos de Cassandra para almacenar los datos ya combinados en una columna con valores múltiples. O usa la minería de datos. Creo que el "análisis de big data" actualmente está abordando este problema en tiendas clave-valor.Otro ejemplo, menos sofisticado que el suyo, es cómo en las tiendas de valores clave puede producir un informe simple de los ingresos por ventas y el volumen por cliente por producto por semana.

Cuestiones relacionadas