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

Mandango al descubierto

Jun 20, 2015

Download

Technology

pablodip

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.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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