Introducción al mundo NoSQL
            César D. Rodas
            crodas@php.net
          http://crodas.org/




       ...
acerca de ...

         Desarrollador
         Estudiante
         Zelote de
              • Open Source
              • P...
Agenda

         NoSQL
         Redis
         CouchDB
         MongoDB




@crodas - http://crodas.org/ - L EX
          ...
NoSQL, ¾Qué es?



 NoSQL es un término usado en informática para agrupar una
     serie de almacenes de datos no relacion...
NoSQL, ¾Qué es?

         Como término nació a principios del 2009
         Como concepto, es algo viejo
         Conjunto...
Problemas de las bases de datos
                           relacionales

         SQL
              • Lenguaje interpretad...
CAP y BASE

         Teorema de CAP, puedes tener dos cosas:
              • Consistency
              • Availability
    ...
Algunas bases de datos NoSQL



@crodas - http://crodas.org/ - L EX
                               AT     8
REDIS



@crodas - http://crodas.org/ - L EX
                               AT             9
Redis
         In-memory Key-value store
         Muy rápido, en mi notebook:
              • 20K inserts en 0.6 segundos
...
¾Documentos?



@crodas - http://crodas.org/ - L EX
                               AT                    11
http://www.flickr.com/photos/beglen/152027605/


@crodas - http://crodas.org/ - L EX
                               AT    ...
¾Documentos?

            Objetos sin funciones
         Arrays (en PHP)
         Tuples (en Python)
         Hashes (en R...
Documentos!
$collection[$id] = array(
   "title" => "PHP rules",
   "tags" => array("php", "web"),
   "body" => "... PHP r...
@crodas - http://crodas.org/ - L EX
                               AT     15
CouchDB
         Proyecto Apache
         JSON (no XML :-)
         Interfaz RESTful (+/-)
              • Estándar (++)
 ...
CouchDB
         Javascript incrustado
         No soporta indexes (--)
         Map/Reduce para realizar queries (+/-)
  ...
@crodas - http://crodas.org/ - L EX
                               AT     18
@crodas - http://crodas.org/ - L EX
                               AT     19
MongoDB
         <EN>Mongo</EN> != <ES>Mongo</ES>
         Orientada a documento
         Rápida, escalable, fácil de usar...
MongoDB
         Soporta sub-documentos
         Updates in-places
         Javascript incrustrado
         Map/Reduce par...
http://bit.ly/mongodb-php



@crodas - http://crodas.org/ - L EX
                               AT     22
La diversión



@crodas - http://crodas.org/ - L EX
                               AT                    23
MongoDB - Operaciones
         Select
              • $gt, $lt, $gte, $lte, $eq, $neq: >, <, >=, <=, ==, !=
              ...
pecl install mongo



@crodas - http://crodas.org/ - L EX
                               AT              25
MongoDB - Connección


/* connects to localhost:27017 */
$connection = new Mongo();

/* connect to a remote host (default ...
FROM SQL to MongoDB




@crodas - http://crodas.org/ - L EX
                               AT      27
MongoDB - Count

/* SELECT count(*) FROM table */
$collection->count();

/* SELECT count(*) FROM table WHERE foo = 1 */
$c...
MongoDB - Consultas
/*
 * SELECT * FROM table WHERE field IN (5,6,7) and enable=1
 * and worth < 5
 * ORDER BY timestamp D...
MongoDB - Paginaciones
/*
 * SELECT * FROM table WHERE field IN (5,6,7) and enable=1
 * and worth < 5
 * ORDER BY timestam...
Diseñando documentos
                     Simple multi-blog system




@crodas - http://crodas.org/ - L EX
               ...
MongoDB - Collections
         Blog
         Post
         User
         Comment




@crodas - http://crodas.org/ - L EX
 ...
Documentos "blog"
$blog = array(
   "user" => <userref>,
   "title" => "Foo bar blog"
   "url" => array(
       "foobar.fo...
Documentos "post"
$post = array(
   "blog" => <blogref>,
   "author" => <userref>,
   "uri" => "/another-post",
   "title"...
otros documentos
$comment = array(
   "post" => <postref>,
   "name" => "foobar",
   "email" => "foo@bar.com",
   "comment...
Índices

$blog col->ensureIndex(array("url" => 1));

$post col->ensureIndex(array("blog" => 1, "date" => -1));
$post col->...
Eso es todo :-)




@crodas - http://crodas.org/ - L EX
                               AT                   37
Agreguemos emociones :-)




@crodas - http://crodas.org/ - L EX
                               AT     38
Let's shard it!




@crodas - http://crodas.org/ - L EX
                               AT                       39
Estrategia
         Shard la coleción "blog"
         Shard la coleción "user"
         Las otras coleciones estan aislada...
Configurando MongoDB

/* Asumiendo que tienes MongoDB ejecutandose
 * en un entorno distribuido (sharded), esto
 * se hace...
Nueva colección "blog"
$blog = array(
   "user" => <userref>,
   "title" => "Foo bar blog"
   "url" => array(
       "foob...
Selecionar el namespace
           correcto, y consultar :-)



@crodas - http://crodas.org/ - L EX
                      ...
Preguntas?




@crodas - http://crodas.org/ - L EX
                               AT                  44
Gracias hackers!




@crodas - http://crodas.org/ - L EX
                               AT                45
@crodas

                                      crodas.org



@crodas - http://crodas.org/ - L EX
                         ...
Próxima SlideShare
Cargando en…5
×

Introducción al mundo NoSQL

4.612 visualizaciones

Publicado el

Introducción al Mundo NoSQL, conceptos, porque utilizarlos, donde utilizarlo. Ejemplos practicos en MonoDB, CouchDB y redis

Publicado en: Tecnología
0 comentarios
4 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
4.612
En SlideShare
0
De insertados
0
Número de insertados
48
Acciones
Compartido
0
Descargas
193
Comentarios
0
Recomendaciones
4
Insertados 0
No insertados

No hay notas en la diapositiva.

Introducción al mundo NoSQL

  1. 1. Introducción al mundo NoSQL César D. Rodas crodas@php.net http://crodas.org/ Free Software Asunción Asunción, Paraguay 1
  2. 2. acerca de ... Desarrollador Estudiante Zelote de • Open Source • PHP • MongoDB PECL Developer ... y algunas cosas mas @crodas - http://crodas.org/ - L EX AT 2
  3. 3. Agenda NoSQL Redis CouchDB MongoDB @crodas - http://crodas.org/ - L EX AT 3
  4. 4. NoSQL, ¾Qué es? NoSQL es un término usado en informática para agrupar una serie de almacenes de datos no relacionales que no proporcionan garantías ACID. Normalmente no tienen esquemas fijos de tablas ni sentencias join . Wikipedia @crodas - http://crodas.org/ - L EX AT 4
  5. 5. NoSQL, ¾Qué es? Como término nació a principios del 2009 Como concepto, es algo viejo Conjunto de bases de datos que: • No provee SQL • Los datos no tienen relación • Generalmente escalan horizontalmente @crodas - http://crodas.org/ - L EX AT 5
  6. 6. Problemas de las bases de datos relacionales SQL • Lenguaje interpretado • Mucha funcionalidad ACID ofrece demasiado La manera más fácil de escalar es verticalmente @crodas - http://crodas.org/ - L EX AT 6
  7. 7. CAP y BASE Teorema de CAP, puedes tener dos cosas: • Consistency • Availability • Partition tolerance BASE, el reemplazo de ACID • Basically Available • Soft state • Eventually consistent @crodas - http://crodas.org/ - L EX AT 7
  8. 8. Algunas bases de datos NoSQL @crodas - http://crodas.org/ - L EX AT 8
  9. 9. REDIS @crodas - http://crodas.org/ - L EX AT 9
  10. 10. Redis In-memory Key-value store Muy rápido, en mi notebook: • 20K inserts en 0.6 segundos • 20K selects en 1 segundo Soporta operaciones con las claves Los valores pueden ser: • bytes • Sets • Tuplas Operaciones atómicas (Push, Pop, ranges, etc) Clientes para varios lenguajes Replicación a disco @crodas - http://crodas.org/ - L EX AT 10
  11. 11. ¾Documentos? @crodas - http://crodas.org/ - L EX AT 11
  12. 12. http://www.flickr.com/photos/beglen/152027605/ @crodas - http://crodas.org/ - L EX AT 12
  13. 13. ¾Documentos? Objetos sin funciones Arrays (en PHP) Tuples (en Python) Hashes (en Ruby y Perl) Sin esquema @crodas - http://crodas.org/ - L EX AT 13
  14. 14. Documentos! $collection[$id] = array( "title" => "PHP rules", "tags" => array("php", "web"), "body" => "... PHP rules ...", "comments" => array( array("author" => "crodas", "comment" => "Yes it does"), ), "visits" => array("200.10.228.34", "200.10.228.2"), ); @crodas - http://crodas.org/ - L EX AT 14
  15. 15. @crodas - http://crodas.org/ - L EX AT 15
  16. 16. CouchDB Proyecto Apache JSON (no XML :-) Interfaz RESTful (+/-) • Estándar (++) • Http es lento (--) MVCC Safe IO (append only b-tree) Multi-master Excelente Interfaz de administración @crodas - http://crodas.org/ - L EX AT 16
  17. 17. CouchDB Javascript incrustado No soporta indexes (--) Map/Reduce para realizar queries (+/-) Soporta guardar archivos Fácil de escalar (con proxies convencionales) Distribuido y concurrente por naturaleza (Erlang) @crodas - http://crodas.org/ - L EX AT 17
  18. 18. @crodas - http://crodas.org/ - L EX AT 18
  19. 19. @crodas - http://crodas.org/ - L EX AT 19
  20. 20. MongoDB <EN>Mongo</EN> != <ES>Mongo</ES> Orientada a documento Rápida, escalable, fácil de usar Soporta índices • Simples • Compuestos • Geo-spatial Auto-sharding Cliente PECL El MySQL del NoSQL @crodas - http://crodas.org/ - L EX AT 20
  21. 21. MongoDB Soporta sub-documentos Updates in-places Javascript incrustrado Map/Reduce para procesamiento off-line Todo es un documento @crodas - http://crodas.org/ - L EX AT 21
  22. 22. http://bit.ly/mongodb-php @crodas - http://crodas.org/ - L EX AT 22
  23. 23. La diversión @crodas - http://crodas.org/ - L EX AT 23
  24. 24. MongoDB - Operaciones Select • $gt, $lt, $gte, $lte, $eq, $neq: >, <, >=, <=, ==, != • $in, $nin • $size, $exists • $where: Any javascript expression • group() • limit() • skip() Updates • $set • $unset • $push • $pull • $inc @crodas - http://crodas.org/ - L EX AT 24
  25. 25. pecl install mongo @crodas - http://crodas.org/ - L EX AT 25
  26. 26. MongoDB - Connección /* connects to localhost:27017 */ $connection = new Mongo(); /* connect to a remote host (default port) */ $connection = new Mongo( "example.com" ); /* connect to a remote host at a given port */ $connection = new Mongo( "example.com:65432" ); /* select some DB (and create if it doesn't exits yet) */ $db = $connection->selectDB("db name"); /* select a "table" (collection) */ $table = $db->getCollection("table"); @crodas - http://crodas.org/ - L EX AT 26
  27. 27. FROM SQL to MongoDB @crodas - http://crodas.org/ - L EX AT 27
  28. 28. MongoDB - Count /* SELECT count(*) FROM table */ $collection->count(); /* SELECT count(*) FROM table WHERE foo = 1 */ $collection->find(array("foo" => 1))->count(); @crodas - http://crodas.org/ - L EX AT 28
  29. 29. MongoDB - Consultas /* * SELECT * FROM table WHERE field IN (5,6,7) and enable=1 * and worth < 5 * ORDER BY timestamp DESC */ $collection->ensureIndex( array('field'=>1, 'enable'=>1, 'worth'=>1, 'timestamp'=>-1) ); $filter = array( 'field' => array('$in' => array(5,6,7)), 'enable' => 1, 'worth' => array('$lt' => 5) ); $results = $collection->find($filter)->sort(array('timestamp' => -1)); @crodas - http://crodas.org/ - L EX AT 29
  30. 30. MongoDB - Paginaciones /* * SELECT * FROM table WHERE field IN (5,6,7) and enable=1 * and worth < 5 * ORDER BY timestamp DESC LIMIT $offset, 20 */ $filter = array( 'field' => array('$in' => array(5,6,7)), 'enable' => 1, 'worth' => array('$lt' => 5) ); $cursor = $collection->find($filter); $cursor->sort(array('timestamp' => -1))->skip($offset)->limit(20); foreach ($cursor as $result) { var dump($result); } @crodas - http://crodas.org/ - L EX AT 30
  31. 31. Diseñando documentos Simple multi-blog system @crodas - http://crodas.org/ - L EX AT 31
  32. 32. MongoDB - Collections Blog Post User Comment @crodas - http://crodas.org/ - L EX AT 32
  33. 33. Documentos "blog" $blog = array( "user" => <userref>, "title" => "Foo bar blog" "url" => array( "foobar.foobar.com", "anotherfoo.foobar.com", ), "permissions" => array( "edit" => array(<userref>, <userref>) ); "post" => 1, ... ); @crodas - http://crodas.org/ - L EX AT 33
  34. 34. Documentos "post" $post = array( "blog" => <blogref>, "author" => <userref>, "uri" => "/another-post", "title" => "Another post", "excerpt" => "bla, bla, bla", "body" => "bar, foo bar, foo, bar", "tags" => array("list", "of tags"), "published" => true, "date" => <mongodate>, ); @crodas - http://crodas.org/ - L EX AT 34
  35. 35. otros documentos $comment = array( "post" => <postref>, "name" => "foobar", "email" => "foo@bar.com", "comment" => "Hello world", "date" => <mongodate>, ); $user = array( "user" => "crodas", "email" => "crodas@php.net", "password" => "a1bad96dc68f891ca887d50eb3fb65ec82123d05", "name" => "Cesar Rodas", ); @crodas - http://crodas.org/ - L EX AT 35
  36. 36. Índices $blog col->ensureIndex(array("url" => 1)); $post col->ensureIndex(array("blog" => 1, "date" => -1)); $post col->ensureIndex(array("blog" => 1, "uri" => 1), array("unique" => 1)); $comment col->ensureIndex(array("post" => 1, "date" => -1)); $user col->ensureIndex(array("user" => 1), array("unique" => 1)); $user col->ensureIndex(array("email" => 1), array("unique" => 1)); @crodas - http://crodas.org/ - L EX AT 36
  37. 37. Eso es todo :-) @crodas - http://crodas.org/ - L EX AT 37
  38. 38. Agreguemos emociones :-) @crodas - http://crodas.org/ - L EX AT 38
  39. 39. Let's shard it! @crodas - http://crodas.org/ - L EX AT 39
  40. 40. Estrategia Shard la coleción "blog" Shard la coleción "user" Las otras coleciones estan aisladas • Crear namespaces para post and comments (foo.post, foo.comments) • Modificar "blog" para agregar referencia hace el namespaces MongoDB hará el trabajo por nosotros @crodas - http://crodas.org/ - L EX AT 40
  41. 41. Configurando MongoDB /* Asumiendo que tienes MongoDB ejecutandose * en un entorno distribuido (sharded), esto * se hace una sola vez. * * $admin es una coneccion a la DB "admin" */ $admin->command(array( "shardcollection" => "blog", "key" => array("uri" => 1), )); $admin->command(array( "shardcollection" => "user", "key" => array("user" => 1), "unique" => true, )); @crodas - http://crodas.org/ - L EX AT 41
  42. 42. Nueva colección "blog" $blog = array( "user" => <userref>, "title" => "Foo bar blog" "url" => array( "foobar.foobar.com", "anotherfoo.foobar.com", ), "permissions" => array( "edit" => array(<userref>, <userref>) ); "post" => 1, "namespace" => "3h3g3k3", "database" => "34fs321", ); @crodas - http://crodas.org/ - L EX AT 42
  43. 43. Selecionar el namespace correcto, y consultar :-) @crodas - http://crodas.org/ - L EX AT 43
  44. 44. Preguntas? @crodas - http://crodas.org/ - L EX AT 44
  45. 45. Gracias hackers! @crodas - http://crodas.org/ - L EX AT 45
  46. 46. @crodas crodas.org @crodas - http://crodas.org/ - L EX AT 46

×