Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Base de Datos NOSQL (MongoDB)

Estas en el tema de Base de Datos NOSQL (MongoDB) en el foro de Bases de Datos General en Foros del Web. Busqué en el foro algun tema sobre NoSQL y no encontré nada, asique me pareció bueno dejar un tema al respecto. Hace ya algún tiempo ...
  #1 (permalink)  
Antiguo 01/10/2010, 16:17
 
Fecha de Ingreso: mayo-2005
Mensajes: 284
Antigüedad: 18 años, 10 meses
Puntos: 11
Base de Datos NOSQL (MongoDB)

Busqué en el foro algun tema sobre NoSQL y no encontré nada, asique me pareció bueno dejar un tema al respecto.

Hace ya algún tiempo que este tipo de base de datos empezó a ganar popularidad.
Sin embargo todavía no me queda claro cual es la ventaja respecto a las BD tradicionales (relacionales).
Es un reemplazo para cualquier diseño o solo es conveniente para aplicaciones específicas?

Alguien sabe cuando es conveniente usar (por ejemplo) MongoDB en vez de MySQL?
  #2 (permalink)  
Antiguo 02/10/2010, 14:21
 
Fecha de Ingreso: mayo-2005
Mensajes: 284
Antigüedad: 18 años, 10 meses
Puntos: 11
Respuesta: Base de Datos NOSQL (MongoDB)

Bueno arranco yo con algunas cosas que fui aprendiendo a ver si alguien se anima a agregar más.

NoSQL viene de Not Only SQL, yn en realidad se debería llamar Not Only Relaciones, porque lo que trata de evitar es la estructura de tablas y relaciones en las base de datos "comunes" (en su mayoria SQL).

Por qué? porque por lo general escribimos en lenguajes orientados a OBJETOS, no relaciones y tablas. De hecho a todos nos ha pasado que terminamos programando en 2 lenguajes bien diferentes, uno el orientado a objetos (PHP, por ej.) y el otro SQL, donde tenemos que organizar nuestros datos en tablas y relaciones bien diferentes a los objetos que manejamos.

Por ej. Si tenemos un objeto "Persona" y una persona puede tener un nombre, una direccion y varios teléfonos. Esto en OO (Orientado a Objetos) es una clase persona, con un string nombre, un string direccion y un array de Number para los teléfonos.
Pero en la base de datos tenemos que normalizar porque no podemos guardar ese Array, asique tenemos 2 tablas, una Personas y otra Telefonos (que tiene una FK a persona).

Para solucionar esta "discrepancia" entre los objetos y las tablas se inventaron los ORM (ActiveRecords como uno de los patterns mas comunes), que en PHP hay varios (Propel, Doctrina, etc.).
Lo que hace un ORM es basicamente armar las consultas SQL "por atrás" asi nosotros manejamos siempre objetos (el ORM convierte ese objeto a las consultas SQL que necesita).

Los lenguajes NoSQL, de los cuales los más comunes son los basados en Documentos, lo que hacen es guardar "objetos" directamente. Agrupados en Colecciones no tablas.
No es necesario ni siquiera definir ningún esquema. En las BD SQL tenemos que primer armar las tablas, definir cuantos campos tiene, de que tipo es cada campo, etc.
Con NoSQL guardamos un objeto con las propiedades que querramos y listo. Sin avisar siquiera de que tipo son ni nada.

Un ejemplo de un documento que podriamos guardar en una coleccion "Articulos":
Cita:
<?php
array(
'title' => 'Hello World',
'authors' => array('John', 'Sally', 'Jim'),
'body' => 'Hello world',
'tags' => array('tag1', 'tag2', 'tag3')
);
?>
Esto hace que las consultas sean más sencillas (tambien menos poderosas, es decir no podemos hacer grandes filtrados o calculos como en SQL).

Otra de las grandes ventajas de NoSQL es que escala muy bien, es por eso de hecho que sitios como Facebook, Twitter e incluso Google usan este tipo de bases de datos.
Porque manejan muchisima informacion y mantener una BD en muchos servidores con SQL puede ser bastante complejo y costoso, pero con estas NoSQL no.

Tambien suelen ser mas rapidas para consultas de lectura y escritura básicas. Porque no tienen todo el procesado previo del SQL, ni respetan el ACID.
Esto ultimo es justamente lo que puede llegar a decidir si usamos SQL o NoSQL, porque si necesitamos transacciones y que la integridad de la BD sea perfecta (por ej. en operaciones bancarias), entonces necesitamos SQL.
Pero cuando esto no es de vital importancia usar NoSQL puede darnos una gran ventaja en cuanto a performance y escalabilidad.
  #3 (permalink)  
Antiguo 15/12/2010, 15:19
Avatar de jam666  
Fecha de Ingreso: septiembre-2009
Ubicación: Isla De Margarita - Venezuela
Mensajes: 428
Antigüedad: 14 años, 7 meses
Puntos: 39
Respuesta: Base de Datos NOSQL (MongoDB)

Una de las grandes ventajas que tienen las bases de datos NoSQL es la escalabilidad a bajo coste.. es mas esta es una de las razones por las cuales Facebook y Twitter cambiaron a NoSQL (al parecer les salia muy costoso las licencia de MySQL para escalar).

Para los usuarios novatos en BD la principal ventaja (al menos yo lo veo asi) es que al no contar con esquemas es mas facil crear/diseñar las bases de datos y almacenar los datos, ya que en las BD Relacionales habia que crear la correspondiente BD, diseñar las tablas que contendran la informacion (teniendo en cuenta que requieren de campos claves y posiblemente relaciones con otras tablas) y luego es que se almacenaban los datos.

En una BD NoSQL del tipo Documento basta con solo Crear la BD e inmediatamente comenzar a introducirle informacion sin importar mucho el campo clave (ya que se crear automaticamente y no es incremental), sin preocuparse por relaciones (ya que en NoSQL esto no existe) y sin importar que un documento tenga mas claves:valores que los demas (en las BD relacionales habia que regirse por el esquema de la tabla).


Aunque las Bd NoSQL mas usadas o mas conocidas son las de tipo documentos, existen otros tipos de BD NoSQL como por ejemplo Grafos, clave:valor almacenada en disco, multivalores, objetos, tabular, almacenamiento en tublas, entre otras mas...

Las BD NoSQL del tipo documentos mas conocidas o usadas son MongoDB y CouchDB, ambas se caracterizan por almacenar estos documentos en formatos del estilo JSON. si por ejemplo agarramos el Array PHP que nos coloca enridp y creamos a partir de alli un documento JSON perfectamente compatible con MongoDB o CouchDB, el documento se veria similar a esto:

Código Json:
Ver original
  1. {
  2.     "title" : "Hello World",
  3.     "authors": [ "John","Sally","Jim" ],
  4.     "body": "Hello world",
  5.     "tags": ["tag1","tag2","tag3"]
  6. }

Tanto en MongoDB como CouchDB se crean/realizan las consultas usando funciones en JavaScript por lo que si ya conoces este lenguaje, te sera muy facil diseñar consultas para tus aplicaciones. Por ejemplo, si quieieramos mostrar el valor de la clave authors y la clave tags de el documento anterior podriamos diseñar una consulta como esta:


Código Javascript:
Ver original
  1. function(doc) {
  2. if (doc.body == "Hello world")
  3.   emit(doc.tags, doc.authors);
  4. }

Esto nos devolvera algo como esto:

["tag1", "tag2", "tag3"] ["John", "Sally", "Jim"]


Yo llevo cerca de un mes probando CouchDB y me a parecido bastante buena... una de las ventajas que tiene CouchDB es que esta incluida en las Distribuciones Ubuntu e incluye una interfaz web llamada Futon la cual facilita la tarea de administrar tus bases de datos, debido a que CouchDB contiene un conjunto de metodos REST/HTTP es posible administrar nuestras bases de datos desde simples comandos con Curl.


Saludos,
__________________
J.A.M
Jam Blog

Última edición por jam666; 15/12/2010 a las 15:22 Razón: correciones menores
  #4 (permalink)  
Antiguo 18/03/2011, 11:27
Avatar de ARICARRARO  
Fecha de Ingreso: diciembre-2010
Ubicación: México
Mensajes: 227
Antigüedad: 13 años, 3 meses
Puntos: 10
Respuesta: Base de Datos NOSQL (MongoDB)

Buen tema para iniciar con MongoDB.
  #5 (permalink)  
Antiguo 23/03/2011, 18:46
Avatar de oswalgogra  
Fecha de Ingreso: septiembre-2007
Ubicación: En algún lugar del territorio Colombiano
Mensajes: 140
Antigüedad: 16 años, 7 meses
Puntos: 5
De acuerdo Respuesta: Base de Datos NOSQL (MongoDB)

Hola,

Me parece que con las bases de datos noSQL se le quita responsabilidad y carga al gestor de la base de datos, para dejarle las tareas de validación e integridad de la información al software que accede a la información.

Yo he estado haciendo pruebas con mongoDB y la verdad me ha parecido muy bueno cuando se tiene un modelo de datos en los cuales las entidades que son de una misma clase no cuentan con los mismos atributos, por ejemplo, si tienes una base de datos con la información de los animales de un zoológico, puedes tener almacenados los registros de todos los animales en una misma colección ("colección", en las bases de datos relacionales se usan las tablas), sin importar el número de atributos que tenga cada animal (un caballo tiene 4 patas, un tiburón no tiene). De esta manera no se utiliza tabla con 200 atributos, sinó que se tiene una colección con animales, que comparten ciertos atributos, pero también difieren de otros.

También estuve haciendo unas pruebas entre mongodb y mysql, encontré que con mongodb pude insertar 10.000 registros en una colección 3 veces más rápido que en una tabla de mysql de tipo myISAM.

Hace tiempo que quiero desarrollar un proyecto utilizando al menos una parte con mongoDB.

Sería muy bueno conformar un equipo para investigar y desarrollar algún proyecto utilizando bases de datos noSQL, y mejorar algún sistema que ya exista.

Si alguien desea empezar a trabajar con mongoDB, o conocer su funcionamiento pueden ingresar a la web oficial del proyecto en: mongoDB

Ah!, también hay una herramienta web equivalente al phpMyAdmin para mongoDB, se llama rock mongo y me ha parecido muy buena.

Éxitos y hasta pronto!
__________________
Oswaldo: El que gobierna con el poder de Dios.
  #6 (permalink)  
Antiguo 23/03/2011, 19:30
Avatar de jam666  
Fecha de Ingreso: septiembre-2009
Ubicación: Isla De Margarita - Venezuela
Mensajes: 428
Antigüedad: 14 años, 7 meses
Puntos: 39
Respuesta: Base de Datos NOSQL (MongoDB)

oswalgogra Efectivamente esas son unas de las ventajas de las bases de datos NoSQL, ya que al no usar el lenguaje de consultas SQL, no se ata uno a sus reglas y requerimientos (creación de tablas, formato fila-columna, normalización, relaciones, etc) por lo que se es mas flexible a la hora de almacenar datos o cambiar la estructura o la forma en la que la aplicación almacena la información.

Al momento de escribir mi post de arriba estaba comenzando a leer sobre el tema y comencé a practicar con CouchDB, y termine por probar y usar MongoDB la cual me dejo mucho mas enganchado que la anterior e incluso escribí unos 11 artículos en mi blog referente a las dos incluyendo una pequeña aplicación que uso a diario.

Saludos.
__________________
J.A.M
Jam Blog
  #7 (permalink)  
Antiguo 26/04/2011, 14:56
 
Fecha de Ingreso: junio-2010
Mensajes: 9
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Base de Datos NOSQL (MongoDB)

Hola muy buenas tardes, mi duda es la siguiente, lo que pasa es que tengo que desarrollar una pequeña aplicacion utilizando ruby y mongoDB desde netbeans, pero no he encontrado mucha informacion al respecto, ya tengo la base de datos creada, y la aplicacion de ruby arriba, mi problema es cuando quiero conectarme a la base de datos desde la aplicacion, ya que no he encintrado la forma de hacerlo, muchas gracias por su atencion

Agradezco de antemano cualquier ayuda.
  #8 (permalink)  
Antiguo 26/04/2011, 15:39
Avatar de jam666  
Fecha de Ingreso: septiembre-2009
Ubicación: Isla De Margarita - Venezuela
Mensajes: 428
Antigüedad: 14 años, 7 meses
Puntos: 39
Respuesta: Base de Datos NOSQL (MongoDB)

Cita:
Iniciado por rasilvap Ver Mensaje
... tengo que desarrollar una pequeña aplicacion utilizando ruby y mongoDB desde netbeans, pero no he encontrado mucha informacion al respecto, ya tengo la base de datos creada, y la aplicacion de ruby arriba, mi problema es cuando quiero conectarme a la base de datos desde la aplicacion, ya que no he encintrado la forma de hacerlo

¿Probaste por casualidad entrando en el Ruby Language Center de la web de MongoDB, leer la extensa Documentación del Driver oficial de Ruby para MongoDB?, o ¿quizas realizar el Tutorial.?

¿De casualidad viste uno de los tantos ODM para MongoDB y Ruby y su documentación en la pagina oficial de cada uno de ellos?
Saludos.
__________________
J.A.M
Jam Blog
  #9 (permalink)  
Antiguo 23/06/2011, 11:34
Avatar de oswalgogra  
Fecha de Ingreso: septiembre-2007
Ubicación: En algún lugar del territorio Colombiano
Mensajes: 140
Antigüedad: 16 años, 7 meses
Puntos: 5
Información Respuesta: Base de Datos NOSQL (MongoDB)

Hola! para quien quiera probar una instancia mongodb, puede conseguir una cuenta gratuita aquí:
Mongo HQ

Y pueden conectar sus aplicativos web con ese servidor, ojo, que no es hosting, es sólo una instancia de mongodb, pero vale la pena probar.

Aquí hay una muestra de un script que tengo en mi pc y que estoy probando con la instancia mongodb de Mongo HQ. Recuerden que deben tener instalada la extensión de mongodb en PHP.

Código PHP:
$connection = new Mongo("mongodb://tu_usuario:tu_clave@el_servidor:el_puerto/la_base_de_datos");
echo 
"Objeto conexion: <br/>";
print_r($connection);
echo
"<br/>";
$db $connection->la_base_de_datos;
echo 
"Objeto db: <br/>";
print_r($db);
$coleccionX $db->nombre_de_la_coleccion;
echo 
"<br/>Colecci&oacute;n:<br/>";
print_r($coleccionX);
$unArticulo = array(
                    
"nombre" => "Moto azul honda"
                    
"descripcion" => "Moto azul casi nueva."
                    
"modelo" => "2009",
                    
"marca" => "Honda",
                    
"motor" => "Tres tiempos");
$result $coleccionX->insert($unArticulo);
echo 
"<br/>Resultado:<br/>";
var_dump($result);

// otra inserción
$otroArticulo = array(
"nombre" => "Automóbil renault"
"descripcion" => "Automóbil renault clio modelo 2008."
"modelo" => "2008",
"marca" => "Renault",
"vidrios" => "Electricos",
"asientos" => "Cuero",
"kilometros_recorridos" => 30000);

$result2 $coleccionX->insert($otroArticulo);
$articulos $coleccionX->find();
print_r($articulos); 
Como pueden ver, las bases de datos permiten almacenar en una misma colección artículos con distintas características, esa es una gran ventaja respecto a la flexibilidad.

Si tienen algún problema, estaré atento a colaborar en lo que pueda.

Éxitos y hasta pronto!
__________________
Oswaldo: El que gobierna con el poder de Dios.
  #10 (permalink)  
Antiguo 23/06/2011, 13:19
Avatar de jam666  
Fecha de Ingreso: septiembre-2009
Ubicación: Isla De Margarita - Venezuela
Mensajes: 428
Antigüedad: 14 años, 7 meses
Puntos: 39
Respuesta: Base de Datos NOSQL (MongoDB)

Tambien puedes probar MongoLab, la cual tiene cuentas gratuitas de hasta 240Mb y la posibilidad de elegir si quieres alojar tus BD en Amazon EC2 o Rackspace.

Yo he probado las dos con scripts ejecutados localmente en Python y Ruby.

A comienzos de este mes MongoLab migro sus instancias a MongoDB 1.8.1, por lo que se pueden usar las nuevas caracteristicas de esta version de MongoDB.

Saludos.
__________________
J.A.M
Jam Blog
  #11 (permalink)  
Antiguo 06/09/2011, 11:30
 
Fecha de Ingreso: enero-2011
Ubicación: Lima - Perú
Mensajes: 9
Antigüedad: 13 años, 3 meses
Puntos: 2
Respuesta: Base de Datos NOSQL (MongoDB)

saludos, recien empiezo a avanzar en el tema de MongoDB me parece una opcion que facilita los tiempos de respuestas de los datos y lo veo mas orientado a un repositorio para datamarts y/o datawarehouse en el entorno web.

Tengo una duda quisiera algun comando simple para obtener el ultimo registro que se ingreso en una coleccion. Haber si alguien intento esto antes que me de la mano.

gracias!
  #12 (permalink)  
Antiguo 06/09/2011, 17:03
 
Fecha de Ingreso: enero-2011
Ubicación: Lima - Perú
Mensajes: 9
Antigüedad: 13 años, 3 meses
Puntos: 2
Respuesta: Base de Datos NOSQL (MongoDB)

saludos nuevamente bueno ya lo solucione les dejo un aporte de como manejar una insercion y generar y autogenerar id's

$db = $this->_mongoDB->appcomments;//crea y conecta a la bd nsql
$collection = $db->comentario;//crea y se establece el esquema de conexion a la coleccion comentario
$n=$collection->count();//cuenta registros en la coleccion
if($n>0){//si existen registros
$data = $collection->find()->sort(array("idcomentario" => -1))->limit(1);//obtener el ultimo registros insertado
foreach($data as $row);//recorremos el arreglo
$data_comentario["idcomentario"]=$row["idcomentario"]+1;//al id anterior le sumamos la unidad
}else{//si no existen registros
$data_comentario["idcomentario"]=1;//por defecto la unidad
}
$collection->insert($data_comentario);//insertamos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 15:57.