Bases de datos NOSQL y PHP

El término NOSQL aplicado a bases de datos no se refiere a que no se utilice el lenguaje sql, si no que significa "not only sql". Estas bases de datos son no relacionales y no proporcionan garantías ACID, tampoco suelen tener esquemas fijos de tablas ni sentencias join. El término ACID hace referencia a un conjunto de características requeridas para que una serie de instrucciones puedan ser consideradas como una transacción.

Estas bases de datos tienen la ventaja de su rapidez y escalabilidad horizontal y los inconvenientes de que no garantizan las transacciones. Dependiendo del tipo de proyecto, puede que se adapte mejor una base de datos de este tipo o una relacional, todo depende de las necesidades del proyecto.

En PHP nos encontramos con distintos productos que utilizan esta tecnología, las más conocidas son de tipo documental y de tipo clave-valor. Bases de datos documentales tenemos por ejemplo CouchDB y MongoDB, en cuando a bases de datos de tipo clave-valor quizás la más conocida sea Cassandra, creada por y para Facebook. Todas estos ejemplos son de código abierto.

En este artículo nos centraremos en MongoDB, una bases de datos de tipo documental en la que los datos se guardan en disco en formato BSON (JSON binario). Es muy sencillo trabajar con ella, al no tener que definir esquemas fijos, la lógica del modelo es la que establece como se guardan los datos. En una misma tabla podemos tener datos con distintos formatos, lo que demuestra la potencia de esta tecnología. Otra de sus virtudes es la facilidad con la que se puede escalar sin apenas configurar nada, simplemente añadiendo nodos nuevos. Si se prevé que una aplicación vaya a ser usada por multitud de usuarios a la vez y las transacciones no sean un problema, seguramente esta sea la solución adecuada.

Veamos un ejemplo de utilización del driver de mongodb para php, con las operaciones básicas.

	$m = new Mongo(); // connect
	$db = $m->selectDB("example");
	$collection = $db->users;

	// Añadir un registro
	$obj = array( "username" => "Pedro", "password" => md5("mipassword") );
	$collection->insert($obj);


	// Añadir otro registro con un esquema diferente
	$obj = array( "username" => "Juan", "password" => md5("otropassword"), "year" => "1960" );
	$collection->insert($obj);

	// Buscar todos los elementos de la coleccion
	$cursor = $collection->find();

	// Iterar a través de los resultados
	foreach ($cursor as $obj) {
		echo $obj["username"] . "\n";
	}

	// Buscar el usuario con nombre Juan
	$user = $collection->findOne(array('username' => 'Juan')));

	// Buscar usuarios con el campo año  > 1950
	$users = $collection->find(array('year' => array( '$gt' => 1950)));


	// Usar javascript para reducir un resultado, conseguiremos los usuarios que se llamen juan o que su año sea < 1950
	$js = "function() {
		return this.username == 'Juan' || this.year < 1950;
	}";
	$users = $collection->find(array('$where' => $js));

Comentarios

Comentario de Nicolas - 09 de Octubre de 2011 - 08:11
muy bueno, gracias
Ha habido un error en el envío
Comentario enviado. Será revisado por la moderación antes de ser publicado.

Deja tu comentario

Tu nombre:
Tu email:
Tu comentario: