0
Mandango                              al descubierto                                             Pablo Díez               ...
¿MongoDB?sábado 26 de marzo de 2011
humongoussábado 26 de marzo de 2011
NOSQL                   • No SQL Not Only SQL                   • Necesidades de rendimiento                    • Especial...
MongoDB                   •         Alto rendimiento                   •         Escalable                   •         Ori...
MongoDB es la base de datos NOSQL más               similar en conceptos a las SQLsábado 26 de marzo de 2011
Base de datos == Base de datos                                     Tabla == Colección                                  Reg...
Documentos                             Simplemente datos representados en JSONsábado 26 de marzo de 2011
{                             username: pablodip,                             email: pablodip@gmail.com                   ...
Documentos                               En arrays en PHPsábado 26 de marzo de 2011
array(                 username => pablodip,                 email => pablodip@gmail.com,             )sábado 26 de marzo ...
Documentos embebidos                             Documentos dentro de otros documentossábado 26 de marzo de 2011
array(                        username => pablodip,                        email => pablodip@gmail.com,                   ...
array(                  title => MongoDB Rocks!,                  content => blah blah blah,                  tags => arra...
Al vuelo                              Las bases de datos y colecciones se crean                             automáticament...
$mongo = new Mongo(mongodb://localhost:27017);       $database = $mongo->selectDatabase(symfony2);       $collection = $da...
Esquema libre                    Cada documento puede usar los campos que quiera                             incluso en la...
array(                username => pablodip,                city     => Zamora,                odm      => Mandango,       ...
Sencillo                             Guardar arrays, consultar arrayssábado 26 de marzo de 2011
$pablodip = array(                    username => pablodip,                    email => pablodip@gmail.com,               ...
$criteria = array(                    username => pablodip                );                $pablodip = $collection->findO...
Sencillo                             Consultas realmente sencillassábado 26 de marzo de 2011
// SELECT * FROM article    $articles = $db->article->find();    // SELECT * FROM article WHERE is_active="true"    $artic...
// SELECT * FROM article ORDER BY date ASC    $articles = $db->article->find()->sort(array(date => 1));    // DESC    $art...
// un resultado    $article = $db->article->findOne();    // criteria, fields    $article = $db->article->findOne($criteri...
Actualizaciones parciales                             Muy eficientessábado 26 de marzo de 2011
$criteria = array(username => pablodip);    $update = array($set => array(city => Oxford));    $db->article->update($crite...
Conclusiones                   •         MongoDB es una base de datos ultrarápida                   •         MongoDB comp...
MongoDB -                   • Sin integridad referencial                   • Transacciones sólo a nivel de documentosábado...
Puedes usar MongoDB en cualquier proyecto,         simplemente si necesitas integridad referencial o        transacciones ...
¡Pero queremos objetos!sábado 26 de marzo de 2011
ODM          Object Document Mappersábado 26 de marzo de 2011
DoctrineMongo                             ¿Ein?sábado 26 de marzo de 2011
Mondongo...sábado 26 de marzo de 2011
Demasiados Mondongos por Google y                              Twitter ;)sábado 26 de marzo de 2011
¡Mejor                       Mandangos!sábado 26 de marzo de 2011
Mandango es a los ODMs lo que       MongoDB a las bases de datossábado 26 de marzo de 2011
Mandango                   • Sencillo                    • Fácil de usar                   • Potente                    • ...
Fácil de usar                             Mismos conceptos que cualquier mapeador.                               Sin magia...
$article = new Article();                         $article->setTitle(foo);                         $article->setContent(ba...
Fácil de usar                               Interfaz fluidasábado 26 de marzo de 2011
$article = Article::create()                    ->setTitle(foo)                    ->setContent(bar)                    ->...
Fácil de usar                             Sencillo uso de namespaces.                               Convención: Model...sá...
$mandango            =   ModelArticle::mandango();        $repository          =   ModelArticle::repository();        $que...
Referencia, embebidos                             Automáticamente; embebidos profundossábado 26 de marzo de 2011
// references one       $article->setAuthor($author);       $author = $article->getAuthor();       // references many     ...
// embeddeds one       $article->setSource($source);       $source = $article->getSource();       // embeddeds many       ...
Unit of Work                               ¡Todo a la vez!sábado 26 de marzo de 2011
$article = ModelArticle::create()->setTitle(foo);             $mandango->persist($article);             $author = ModelAut...
Sistema (simple) de Queries                                 Orientado a objetos.                             Mismos concep...
$query = ModelArticle::query();                 $query                     ->criteria($criteria)                     ->fie...
Perezoso                     No consulta a la base de datos                       hasta que no se necesita.sábado 26 de ma...
// lógica SIN consultar la base de datos       $query = ModelArticle::query($criteria);       if ($sort) {           $quer...
/*      * Consulta a la base de datos.      */     // todos     $articles = $query->all();     foreach ($query as $article...
Referenciassábado 26 de marzo de 2011
MongoDB no tiene Joins       $query->joins(array(author => 1));sábado 26 de marzo de 2011
¿Tenemos que hacer una consulta            por referencia entonces?                             $article1->getAuthor();   ...
$in         Mandango consulta los documentos          referenciados en una sola query.      $query->references(array(autho...
En referencias a uno y a muchos.                             $query->references(array(                                 aut...
Campossábado 26 de marzo de 2011
$query->fields(array());                    Consultar todos los campos de los                   documentos es muy lento pa...
$query->fields(array(                                 title   => 1,                                 content => 1,         ...
$article->getUser()->getUsername();                             En las referencias es imposible.sábado 26 de marzo de 2011
$firstName = $user->getProfile()->getFirstName();         $comments = $article->getComments();                     En los ...
$article = ModelArticle::find($id);         $article->delete();             Y quizás no necesitemos ningún campo.sábado 26...
¿Soluciones?                   •         Usar documentos más pequeños                         •     Perdemos potencia del ...
Mandango      Query Fields Cachesábado 26 de marzo de 2011
Consulta sólo lo que                            usas                    automáticamentesábado 26 de marzo de 2011
$article = ModelArticle::query()->one();      // fields      array(          _id => 1,      );sábado 26 de marzo de 2011
$article = ModelArticle::query()->one();      $article->getTitle();      $article->getContent();      // fields      array...
$article = ModelArticle::query()->one();      $article->getTitle();      $article->getAuthor()->getName();      // article...
$article = ModelArticle::query()->one();      $article->getTitle();      $article->getSource()->getUrl();      // article ...
Se acabó el preocuparse                por el tamaño de los                    documentossábado 26 de marzo de 2011
¿Cómo?                       Mandango por defecto no consulta ningún campo.                 Consulta perezosamente la prim...
¿Killer feature?      Yo sólo se que es extremadamente eficiente ;)sábado 26 de marzo de 2011
¿Cuán rápido es Mandango               entonces?sábado 26 de marzo de 2011
3-4x comparado con                          DoctrineMongo                         en casos normalessábado 26 de marzo de 2...
50             37.5 Time (ms)              25                                                                  Mandango   ...
4-5-6-7-8-+x en casos de             usar pocos campos en             documentos complejossábado 26 de marzo de 2011
Y además usa 2-3x menos               de memoria ;)sábado 26 de marzo de 2011
sfMandangoPluginsábado 26 de marzo de 2011
MandangoBundlesábado 26 de marzo de 2011
Mandango es a los ODMs lo que       MongoDB a las bases de datossábado 26 de marzo de 2011
¿Preguntas?sábado 26 de marzo de 2011
Upcoming SlideShare
Loading in...5
×

Mandango al descubierto

2,901

Published on

Presentación de Mandango, con introducción de MongoDB, el cambio de nombre de Mondongo a Mandango y por supuesto, la gran evolución que ha traido.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,901
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
39
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Mandango al descubierto"

  1. 1. Mandango al descubierto Pablo Díez 1ª Meetup Symfony Madrid - 26 de marzo de 2011sábado 26 de marzo de 2011
  2. 2. ¿MongoDB?sábado 26 de marzo de 2011
  3. 3. humongoussábado 26 de marzo de 2011
  4. 4. NOSQL • No SQL Not Only SQL • Necesidades de rendimiento • Especialmente webs • Gran cantidad de datos • Gran cantidad de lecturas y escriturassábado 26 de marzo de 2011
  5. 5. MongoDB • Alto rendimiento • Escalable • Orientada a documentos • Esquema libre • Extremadamente sencilla • Índices • Código abierto • Continua evoluciónsábado 26 de marzo de 2011
  6. 6. MongoDB es la base de datos NOSQL más similar en conceptos a las SQLsábado 26 de marzo de 2011
  7. 7. Base de datos == Base de datos Tabla == Colección Registro ~= Documentosábado 26 de marzo de 2011
  8. 8. Documentos Simplemente datos representados en JSONsábado 26 de marzo de 2011
  9. 9. { username: pablodip, email: pablodip@gmail.com }sábado 26 de marzo de 2011
  10. 10. Documentos En arrays en PHPsábado 26 de marzo de 2011
  11. 11. array( username => pablodip, email => pablodip@gmail.com, )sábado 26 de marzo de 2011
  12. 12. Documentos embebidos Documentos dentro de otros documentossábado 26 de marzo de 2011
  13. 13. array( username => pablodip, email => pablodip@gmail.com, profile => array( first_name => Pablo, last_name => Díez, ), )sábado 26 de marzo de 2011
  14. 14. array( title => MongoDB Rocks!, content => blah blah blah, tags => array(mongodb, databases), comments => array( array( name => pablodip, text => blah, ), array( name => barbelith, text => blah, ), ), )sábado 26 de marzo de 2011
  15. 15. Al vuelo Las bases de datos y colecciones se crean automáticamente la primera vez que se usansábado 26 de marzo de 2011
  16. 16. $mongo = new Mongo(mongodb://localhost:27017); $database = $mongo->selectDatabase(symfony2); $collection = $database->selectCollection(user);sábado 26 de marzo de 2011
  17. 17. Esquema libre Cada documento puede usar los campos que quiera incluso en la misma colecciónsábado 26 de marzo de 2011
  18. 18. array( username => pablodip, city => Zamora, odm => Mandango, ) array( username => barbelith, country => Valladolid, database => book, phones => array(806XXX, 902XXX) )sábado 26 de marzo de 2011
  19. 19. Sencillo Guardar arrays, consultar arrayssábado 26 de marzo de 2011
  20. 20. $pablodip = array( username => pablodip, email => pablodip@gmail.com, ); $collection->save($pablodip);sábado 26 de marzo de 2011
  21. 21. $criteria = array( username => pablodip ); $pablodip = $collection->findOne($criteria); $pablodip[city] = Zamora; $collection->save($pablodip);sábado 26 de marzo de 2011
  22. 22. Sencillo Consultas realmente sencillassábado 26 de marzo de 2011
  23. 23. // SELECT * FROM article $articles = $db->article->find(); // SELECT * FROM article WHERE is_active="true" $articles = $db->article->find(array(is_active => true)); // SELECT id, title FROM article WHERE author=pablodip $criteria = array(author => pablodip); $fields = array(_id => 1, title => 1); $articles = $db->article->find($criteria, $fields);sábado 26 de marzo de 2011
  24. 24. // SELECT * FROM article ORDER BY date ASC $articles = $db->article->find()->sort(array(date => 1)); // DESC $articles = $db->article->find()->sort(array(date => -1)); // SELECT * FROM article LIMIT 10, 2 $articles = $db->article->find()->limit(10)->skip(2);sábado 26 de marzo de 2011
  25. 25. // un resultado $article = $db->article->findOne(); // criteria, fields $article = $db->article->findOne($criteria, $fields);sábado 26 de marzo de 2011
  26. 26. Actualizaciones parciales Muy eficientessábado 26 de marzo de 2011
  27. 27. $criteria = array(username => pablodip); $update = array($set => array(city => Oxford)); $db->article->update($criteria, $update);sábado 26 de marzo de 2011
  28. 28. Conclusiones • MongoDB es una base de datos ultrarápida • MongoDB comparte muchos conceptos con bases de datos relacionales • MongoDB es extremadamente sencilla de usar • Creación de bases de datos y colecciones al vuelo • Esquema libre (sin migraciones) • Consultas sencillassábado 26 de marzo de 2011
  29. 29. MongoDB - • Sin integridad referencial • Transacciones sólo a nivel de documentosábado 26 de marzo de 2011
  30. 30. Puedes usar MongoDB en cualquier proyecto, simplemente si necesitas integridad referencial o transacciones a nivel de colección o base de datos necesitas combinarla con una base de datos relacional.sábado 26 de marzo de 2011
  31. 31. ¡Pero queremos objetos!sábado 26 de marzo de 2011
  32. 32. ODM Object Document Mappersábado 26 de marzo de 2011
  33. 33. DoctrineMongo ¿Ein?sábado 26 de marzo de 2011
  34. 34. Mondongo...sábado 26 de marzo de 2011
  35. 35. Demasiados Mondongos por Google y Twitter ;)sábado 26 de marzo de 2011
  36. 36. ¡Mejor Mandangos!sábado 26 de marzo de 2011
  37. 37. Mandango es a los ODMs lo que MongoDB a las bases de datossábado 26 de marzo de 2011
  38. 38. Mandango • Sencillo • Fácil de usar • Potente • Referencias, embebidos, relaciones • Unit of Work • Sistema de Queries • Behaviors, índices, eventos • ... • Ultrarápidosábado 26 de marzo de 2011
  39. 39. Fácil de usar Mismos conceptos que cualquier mapeador. Sin magia, todo el código es generado. Autocompletado IDE +sábado 26 de marzo de 2011
  40. 40. $article = new Article(); $article->setTitle(foo); $article->setContent(bar); $article->save();sábado 26 de marzo de 2011
  41. 41. Fácil de usar Interfaz fluidasábado 26 de marzo de 2011
  42. 42. $article = Article::create() ->setTitle(foo) ->setContent(bar) ->save() ;sábado 26 de marzo de 2011
  43. 43. Fácil de usar Sencillo uso de namespaces. Convención: Model...sábado 26 de marzo de 2011
  44. 44. $mandango = ModelArticle::mandango(); $repository = ModelArticle::repository(); $query = ModelArticle::query(); $article = ModelArticle::find($id); $collection = ModelArticle::collection();sábado 26 de marzo de 2011
  45. 45. Referencia, embebidos Automáticamente; embebidos profundossábado 26 de marzo de 2011
  46. 46. // references one $article->setAuthor($author); $author = $article->getAuthor(); // references many $article->getCategories()->add($category); $article->getCategories()->remove($category); $categories = $article->getCategories()->saved(); foreach ($article->getCategories()) { // ... }sábado 26 de marzo de 2011
  47. 47. // embeddeds one $article->setSource($source); $source = $article->getSource(); // embeddeds many $article->getComments()->add($comment); $article->getComments()->remove($comment); $comments = $article->getComments()->saved(); foreach ($article->getComments() as $comment) { // ... }sábado 26 de marzo de 2011
  48. 48. Unit of Work ¡Todo a la vez!sábado 26 de marzo de 2011
  49. 49. $article = ModelArticle::create()->setTitle(foo); $mandango->persist($article); $author = ModelAuthor::create()->setName(bar); $mandango->persist($author); $user = ModelUser::query()->one(); $mandango->remove($user); $category = ModelCategory::query()->one(); $category->setName(foobar); $mandango->persist($category); // todo es enviado a la base de datos aquí $mandango->flush();sábado 26 de marzo de 2011
  50. 50. Sistema (simple) de Queries Orientado a objetos. Mismos conceptos que Mongo.sábado 26 de marzo de 2011
  51. 51. $query = ModelArticle::query(); $query ->criteria($criteria) ->field($fields) ->sort($sort) ->limit($limit) ->skip($skip) ; $query = ModelArticle::query($criteria);sábado 26 de marzo de 2011
  52. 52. Perezoso No consulta a la base de datos hasta que no se necesita.sábado 26 de marzo de 2011
  53. 53. // lógica SIN consultar la base de datos $query = ModelArticle::query($criteria); if ($sort) { $query->sort($sort); } if ($limit) { $query->limit($limit); }sábado 26 de marzo de 2011
  54. 54. /* * Consulta a la base de datos. */ // todos $articles = $query->all(); foreach ($query as $article) { // ... } // uno $article->one(); // contar $articles->count();sábado 26 de marzo de 2011
  55. 55. Referenciassábado 26 de marzo de 2011
  56. 56. MongoDB no tiene Joins $query->joins(array(author => 1));sábado 26 de marzo de 2011
  57. 57. ¿Tenemos que hacer una consulta por referencia entonces? $article1->getAuthor(); $article2->getAuthor(); // ...sábado 26 de marzo de 2011
  58. 58. $in Mandango consulta los documentos referenciados en una sola query. $query->references(array(author));sábado 26 de marzo de 2011
  59. 59. En referencias a uno y a muchos. $query->references(array( author, categories, ));sábado 26 de marzo de 2011
  60. 60. Campossábado 26 de marzo de 2011
  61. 61. $query->fields(array()); Consultar todos los campos de los documentos es muy lento para la base de datos y los objetos (hydrate!), sobre todo con documentos y campos grandes.sábado 26 de marzo de 2011
  62. 62. $query->fields(array( title => 1, content => 1, )); Seleccionar todos los campos que se usan en todos los sitios es cansado.sábado 26 de marzo de 2011
  63. 63. $article->getUser()->getUsername(); En las referencias es imposible.sábado 26 de marzo de 2011
  64. 64. $firstName = $user->getProfile()->getFirstName(); $comments = $article->getComments(); En los embebidos es incluso peor.sábado 26 de marzo de 2011
  65. 65. $article = ModelArticle::find($id); $article->delete(); Y quizás no necesitemos ningún campo.sábado 26 de marzo de 2011
  66. 66. ¿Soluciones? • Usar documentos más pequeños • Perdemos potencia del esquema libre • Usar menos embebidos • Perdemos potencia de usar documentos • Tener moral y seleccionar a mano todos los campos que se usan. • Pff... • O...sábado 26 de marzo de 2011
  67. 67. Mandango Query Fields Cachesábado 26 de marzo de 2011
  68. 68. Consulta sólo lo que usas automáticamentesábado 26 de marzo de 2011
  69. 69. $article = ModelArticle::query()->one(); // fields array( _id => 1, );sábado 26 de marzo de 2011
  70. 70. $article = ModelArticle::query()->one(); $article->getTitle(); $article->getContent(); // fields array( _id => 1, title => 1, content => 1, );sábado 26 de marzo de 2011
  71. 71. $article = ModelArticle::query()->one(); $article->getTitle(); $article->getAuthor()->getName(); // article fields array( _id => 1, ); title => 1, Referencias // author fields array( _id => 1, name => 1, );sábado 26 de marzo de 2011
  72. 72. $article = ModelArticle::query()->one(); $article->getTitle(); $article->getSource()->getUrl(); // article fields array( _id => 1, Embebidos title => 1, source.url => 1, );sábado 26 de marzo de 2011
  73. 73. Se acabó el preocuparse por el tamaño de los documentossábado 26 de marzo de 2011
  74. 74. ¿Cómo? Mandango por defecto no consulta ningún campo. Consulta perezosamente la primera vez, y guarda los campos que usas en cache para consultarlos a partir de la segunda petición. No importa si cambias el código y usas más campos, se van añadiendo.sábado 26 de marzo de 2011
  75. 75. ¿Killer feature? Yo sólo se que es extremadamente eficiente ;)sábado 26 de marzo de 2011
  76. 76. ¿Cuán rápido es Mandango entonces?sábado 26 de marzo de 2011
  77. 77. 3-4x comparado con DoctrineMongo en casos normalessábado 26 de marzo de 2011
  78. 78. 50 37.5 Time (ms) 25 Mandango DoctrineMongo 12.5 0 Insert Update Delete Hydratesábado 26 de marzo de 2011
  79. 79. 4-5-6-7-8-+x en casos de usar pocos campos en documentos complejossábado 26 de marzo de 2011
  80. 80. Y además usa 2-3x menos de memoria ;)sábado 26 de marzo de 2011
  81. 81. sfMandangoPluginsábado 26 de marzo de 2011
  82. 82. MandangoBundlesábado 26 de marzo de 2011
  83. 83. Mandango es a los ODMs lo que MongoDB a las bases de datossábado 26 de marzo de 2011
  84. 84. ¿Preguntas?sábado 26 de marzo de 2011
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×