Mandango al descubierto

84
Mandango al descubierto Pablo Díez 1ª Meetup Symfony Madrid - 26 de marzo de 2011 sábado 26 de marzo de 2011

description

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.

Transcript of Mandango al descubierto

Page 1: Mandango al descubierto

Mandangoal descubierto

Pablo Díez1ª Meetup Symfony Madrid - 26 de marzo de 2011

sábado 26 de marzo de 2011

Page 2: Mandango al descubierto

¿MongoDB?

sábado 26 de marzo de 2011

Page 3: Mandango al descubierto

humongous

sábado 26 de marzo de 2011

Page 4: Mandango al descubierto

NOSQL

• No SQL Not Only SQL

• Necesidades de rendimiento

• Especialmente webs

• Gran cantidad de datos

• Gran cantidad de lecturas y escrituras

sábado 26 de marzo de 2011

Page 5: Mandango al descubierto

MongoDB• Alto rendimiento

• Escalable

• Orientada a documentos

• Esquema libre

• Extremadamente sencilla

• Índices

• Código abierto

• Continua evolución

sábado 26 de marzo de 2011

Page 6: Mandango al descubierto

MongoDB es la base de datos NOSQL más similar en conceptos a las SQL

sábado 26 de marzo de 2011

Page 7: Mandango al descubierto

Base de datos == Base de datos

Tabla == Colección

Registro ~= Documento

sábado 26 de marzo de 2011

Page 8: Mandango al descubierto

DocumentosSimplemente datos representados en JSON

sábado 26 de marzo de 2011

Page 9: Mandango al descubierto

{ username: pablodip, email: [email protected]}

sábado 26 de marzo de 2011

Page 10: Mandango al descubierto

DocumentosEn arrays en PHP

sábado 26 de marzo de 2011

Page 11: Mandango al descubierto

array( 'username' => 'pablodip', 'email' => '[email protected]',)

sábado 26 de marzo de 2011

Page 12: Mandango al descubierto

Documentos embebidosDocumentos dentro de otros documentos

sábado 26 de marzo de 2011

Page 13: Mandango al descubierto

array( 'username' => 'pablodip', 'email' => '[email protected]', 'profile' => array( 'first_name' => 'Pablo', 'last_name' => 'Díez', ),)

sábado 26 de marzo de 2011

Page 14: Mandango al descubierto

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

Page 15: Mandango al descubierto

Al vueloLas bases de datos y colecciones se crean

automáticamente la primera vez que se usan

sábado 26 de marzo de 2011

Page 16: Mandango al descubierto

$mongo = new \Mongo('mongodb://localhost:27017');$database = $mongo->selectDatabase('symfony2');$collection = $database->selectCollection('user');

sábado 26 de marzo de 2011

Page 17: Mandango al descubierto

Esquema libreCada documento puede usar los campos que quiera

incluso en la misma colección

sábado 26 de marzo de 2011

Page 18: Mandango al descubierto

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

Page 19: Mandango al descubierto

SencilloGuardar arrays, consultar arrays

sábado 26 de marzo de 2011

Page 20: Mandango al descubierto

$pablodip = array( 'username' => 'pablodip', 'email' => '[email protected]',);$collection->save($pablodip);

sábado 26 de marzo de 2011

Page 21: Mandango al descubierto

$criteria = array( 'username' => 'pablodip');$pablodip = $collection->findOne($criteria);

$pablodip['city'] = 'Zamora';$collection->save($pablodip);

sábado 26 de marzo de 2011

Page 22: Mandango al descubierto

SencilloConsultas realmente sencillas

sábado 26 de marzo de 2011

Page 23: Mandango al descubierto

// 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

Page 24: Mandango al descubierto

// 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

Page 25: Mandango al descubierto

// un resultado$article = $db->article->findOne();

// criteria, fields$article = $db->article->findOne($criteria, $fields);

sábado 26 de marzo de 2011

Page 26: Mandango al descubierto

Actualizaciones parcialesMuy eficientes

sábado 26 de marzo de 2011

Page 27: Mandango al descubierto

$criteria = array('username' => 'pablodip');$update = array('$set' => array('city' => 'Oxford'));$db->article->update($criteria, $update);

sábado 26 de marzo de 2011

Page 28: Mandango al descubierto

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 sencillas

sábado 26 de marzo de 2011

Page 29: Mandango al descubierto

MongoDB -

• Sin integridad referencial

• Transacciones sólo a nivel de documento

sábado 26 de marzo de 2011

Page 30: Mandango al descubierto

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

Page 31: Mandango al descubierto

¡Pero queremos objetos!

sábado 26 de marzo de 2011

Page 32: Mandango al descubierto

ODMObject Document Mapper

sábado 26 de marzo de 2011

Page 33: Mandango al descubierto

DoctrineMongo

¿Ein?

sábado 26 de marzo de 2011

Page 34: Mandango al descubierto

Mondongo...

sábado 26 de marzo de 2011

Page 35: Mandango al descubierto

Demasiados Mondongos por Google y Twitter ;)

sábado 26 de marzo de 2011

Page 36: Mandango al descubierto

¡Mejor Mandangos!

sábado 26 de marzo de 2011

Page 37: Mandango al descubierto

Mandango es a los ODMs lo que MongoDB a las bases de datos

sábado 26 de marzo de 2011

Page 38: Mandango al descubierto

Mandango• Sencillo

• Fácil de usar

• Potente

• Referencias, embebidos, relaciones

• Unit of Work

• Sistema de Queries

• Behaviors, índices, eventos

• ...

• Ultrarápido

sábado 26 de marzo de 2011

Page 39: Mandango al descubierto

Fácil de usarMismos conceptos que cualquier mapeador.

Sin magia, todo el código es generado.Autocompletado IDE +

sábado 26 de marzo de 2011

Page 40: Mandango al descubierto

$article = new Article();$article->setTitle('foo');$article->setContent('bar');$article->save();

sábado 26 de marzo de 2011

Page 41: Mandango al descubierto

Fácil de usarInterfaz fluida

sábado 26 de marzo de 2011

Page 42: Mandango al descubierto

$article = Article::create() ->setTitle('foo') ->setContent('bar') ->save();

sábado 26 de marzo de 2011

Page 43: Mandango al descubierto

Fácil de usarSencillo uso de namespaces.

Convención: \Model\...

sábado 26 de marzo de 2011

Page 44: Mandango al descubierto

$mandango = \Model\Article::mandango();$repository = \Model\Article::repository();$query = \Model\Article::query();$article = \Model\Article::find($id);$collection = \Model\Article::collection();

sábado 26 de marzo de 2011

Page 45: Mandango al descubierto

Referencia, embebidosAutomáticamente; embebidos profundos

sábado 26 de marzo de 2011

Page 46: Mandango al descubierto

// 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

Page 47: Mandango al descubierto

// 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

Page 48: Mandango al descubierto

Unit of Work¡Todo a la vez!

sábado 26 de marzo de 2011

Page 49: Mandango al descubierto

$article = \Model\Article::create()->setTitle('foo');$mandango->persist($article);

$author = \Model\Author::create()->setName('bar');$mandango->persist($author);

$user = \Model\User::query()->one();$mandango->remove($user);

$category = \Model\Category::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

Page 50: Mandango al descubierto

Sistema (simple) de QueriesOrientado a objetos.

Mismos conceptos que Mongo.

sábado 26 de marzo de 2011

Page 51: Mandango al descubierto

$query = \Model\Article::query();

$query ->criteria($criteria) ->field($fields) ->sort($sort) ->limit($limit) ->skip($skip);

$query = \Model\Article::query($criteria);

sábado 26 de marzo de 2011

Page 52: Mandango al descubierto

Perezoso

No consulta a la base de datos hasta que no se necesita.

sábado 26 de marzo de 2011

Page 53: Mandango al descubierto

// lógica SIN consultar la base de datos$query = \Model\Article::query($criteria);

if ($sort) { $query->sort($sort);}

if ($limit) { $query->limit($limit);}

sábado 26 de marzo de 2011

Page 54: Mandango al descubierto

/* * 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

Page 55: Mandango al descubierto

Referencias

sábado 26 de marzo de 2011

Page 56: Mandango al descubierto

MongoDB no tiene Joins

$query->joins(array('author' => 1));

sábado 26 de marzo de 2011

Page 57: Mandango al descubierto

¿Tenemos que hacer una consulta por referencia entonces?

$article1->getAuthor();$article2->getAuthor();// ...

sábado 26 de marzo de 2011

Page 58: Mandango al descubierto

$in

Mandango consulta los documentos referenciados en una sola query.

$query->references(array('author'));

sábado 26 de marzo de 2011

Page 59: Mandango al descubierto

En referencias a uno y a muchos.

$query->references(array( 'author', 'categories',));

sábado 26 de marzo de 2011

Page 60: Mandango al descubierto

Campos

sábado 26 de marzo de 2011

Page 61: Mandango al descubierto

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.

$query->fields(array());

sábado 26 de marzo de 2011

Page 62: Mandango al descubierto

Seleccionar todos los campos que se usan en todos los sitios es cansado.

$query->fields(array( 'title' => 1, 'content' => 1,));

sábado 26 de marzo de 2011

Page 63: Mandango al descubierto

En las referencias es imposible.

$article->getUser()->getUsername();

sábado 26 de marzo de 2011

Page 64: Mandango al descubierto

En los embebidos es incluso peor.

$firstName = $user->getProfile()->getFirstName();$comments = $article->getComments();

sábado 26 de marzo de 2011

Page 65: Mandango al descubierto

Y quizás no necesitemos ningún campo.

$article = \Model\Article::find($id);$article->delete();

sábado 26 de marzo de 2011

Page 66: Mandango al descubierto

¿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

Page 67: Mandango al descubierto

MandangoQuery Fields Cache

sábado 26 de marzo de 2011

Page 68: Mandango al descubierto

Consulta sólo lo que usas

automáticamente

sábado 26 de marzo de 2011

Page 69: Mandango al descubierto

$article = \Model\Article::query()->one();

// fieldsarray( '_id' => 1,);

sábado 26 de marzo de 2011

Page 70: Mandango al descubierto

$article = \Model\Article::query()->one();$article->getTitle();$article->getContent();

// fieldsarray( '_id' => 1, 'title' => 1, 'content' => 1,);

sábado 26 de marzo de 2011

Page 71: Mandango al descubierto

$article = \Model\Article::query()->one();$article->getTitle();$article->getAuthor()->getName();

// article fieldsarray( '_id' => 1, 'title' => 1,);// author fieldsarray( '_id' => 1, 'name' => 1,);

Referencias

sábado 26 de marzo de 2011

Page 72: Mandango al descubierto

$article = \Model\Article::query()->one();$article->getTitle();$article->getSource()->getUrl();

// article fieldsarray( '_id' => 1, 'title' => 1, 'source.url' => 1,);

Embebidos

sábado 26 de marzo de 2011

Page 73: Mandango al descubierto

Se acabó el preocuparse por el tamaño de los

documentos

sábado 26 de marzo de 2011

Page 74: Mandango al descubierto

¿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

Page 75: Mandango al descubierto

¿Killer feature?Yo sólo se que es extremadamente eficiente ;)

sábado 26 de marzo de 2011

Page 76: Mandango al descubierto

¿Cuán rápido es Mandango entonces?

sábado 26 de marzo de 2011

Page 77: Mandango al descubierto

3-4x comparado con DoctrineMongo

en casos normales

sábado 26 de marzo de 2011

Page 78: Mandango al descubierto

0

12.5

25

37.5

50

Insert Update Delete Hydrate

MandangoDoctrineMongo

Tim

e (m

s)

sábado 26 de marzo de 2011

Page 79: Mandango al descubierto

4-5-6-7-8-+x en casos de usar pocos campos en documentos complejos

sábado 26 de marzo de 2011

Page 80: Mandango al descubierto

Y además usa 2-3x menos de memoria ;)

sábado 26 de marzo de 2011

Page 81: Mandango al descubierto

sfMandangoPlugin

sábado 26 de marzo de 2011

Page 82: Mandango al descubierto

MandangoBundle

sábado 26 de marzo de 2011

Page 83: Mandango al descubierto

Mandango es a los ODMs lo que MongoDB a las bases de datos

sábado 26 de marzo de 2011

Page 84: Mandango al descubierto

¿Preguntas?

sábado 26 de marzo de 2011