Mandango al descubierto
-
Upload
pablodip -
Category
Technology
-
view
2.893 -
download
0
description
Transcript of Mandango al descubierto
Mandangoal descubierto
Pablo Díez1ª Meetup Symfony Madrid - 26 de marzo de 2011
sábado 26 de marzo de 2011
¿MongoDB?
sábado 26 de marzo de 2011
humongous
sábado 26 de marzo de 2011
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
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
MongoDB es la base de datos NOSQL más similar en conceptos a las SQL
sábado 26 de marzo de 2011
Base de datos == Base de datos
Tabla == Colección
Registro ~= Documento
sábado 26 de marzo de 2011
DocumentosSimplemente datos representados en JSON
sábado 26 de marzo de 2011
{ username: pablodip, email: [email protected]}
sábado 26 de marzo de 2011
DocumentosEn arrays en PHP
sábado 26 de marzo de 2011
array( 'username' => 'pablodip', 'email' => '[email protected]',)
sábado 26 de marzo de 2011
Documentos embebidosDocumentos dentro de otros documentos
sábado 26 de marzo de 2011
array( 'username' => 'pablodip', 'email' => '[email protected]', 'profile' => array( 'first_name' => 'Pablo', 'last_name' => 'Díez', ),)
sábado 26 de marzo de 2011
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
Al vueloLas bases de datos y colecciones se crean
automáticamente la primera vez que se usan
sábado 26 de marzo de 2011
$mongo = new \Mongo('mongodb://localhost:27017');$database = $mongo->selectDatabase('symfony2');$collection = $database->selectCollection('user');
sábado 26 de marzo de 2011
Esquema libreCada documento puede usar los campos que quiera
incluso en la misma colección
sábado 26 de marzo de 2011
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
SencilloGuardar arrays, consultar arrays
sábado 26 de marzo de 2011
$pablodip = array( 'username' => 'pablodip', 'email' => '[email protected]',);$collection->save($pablodip);
sábado 26 de marzo de 2011
$criteria = array( 'username' => 'pablodip');$pablodip = $collection->findOne($criteria);
$pablodip['city'] = 'Zamora';$collection->save($pablodip);
sábado 26 de marzo de 2011
SencilloConsultas realmente sencillas
sábado 26 de marzo de 2011
// 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
// 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
// un resultado$article = $db->article->findOne();
// criteria, fields$article = $db->article->findOne($criteria, $fields);
sábado 26 de marzo de 2011
Actualizaciones parcialesMuy eficientes
sábado 26 de marzo de 2011
$criteria = array('username' => 'pablodip');$update = array('$set' => array('city' => 'Oxford'));$db->article->update($criteria, $update);
sábado 26 de marzo de 2011
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
MongoDB -
• Sin integridad referencial
• Transacciones sólo a nivel de documento
sábado 26 de marzo de 2011
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
¡Pero queremos objetos!
sábado 26 de marzo de 2011
ODMObject Document Mapper
sá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 datos
sábado 26 de marzo de 2011
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
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
$article = new Article();$article->setTitle('foo');$article->setContent('bar');$article->save();
sábado 26 de marzo de 2011
Fácil de usarInterfaz fluida
sábado 26 de marzo de 2011
$article = Article::create() ->setTitle('foo') ->setContent('bar') ->save();
sábado 26 de marzo de 2011
Fácil de usarSencillo uso de namespaces.
Convención: \Model\...
sábado 26 de marzo de 2011
$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
Referencia, embebidosAutomáticamente; embebidos profundos
sábado 26 de marzo de 2011
// 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
// 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
Unit of Work¡Todo a la vez!
sábado 26 de marzo de 2011
$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
Sistema (simple) de QueriesOrientado a objetos.
Mismos conceptos que Mongo.
sábado 26 de marzo de 2011
$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
Perezoso
No consulta a la base de datos hasta que no se necesita.
sábado 26 de marzo de 2011
// 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
/* * 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
Referencias
sá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();$article2->getAuthor();// ...
sábado 26 de marzo de 2011
$in
Mandango consulta los documentos referenciados en una sola query.
$query->references(array('author'));
sábado 26 de marzo de 2011
En referencias a uno y a muchos.
$query->references(array( 'author', 'categories',));
sábado 26 de marzo de 2011
Campos
sábado 26 de marzo de 2011
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
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
En las referencias es imposible.
$article->getUser()->getUsername();
sábado 26 de marzo de 2011
En los embebidos es incluso peor.
$firstName = $user->getProfile()->getFirstName();$comments = $article->getComments();
sábado 26 de marzo de 2011
Y quizás no necesitemos ningún campo.
$article = \Model\Article::find($id);$article->delete();
sábado 26 de marzo de 2011
¿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
MandangoQuery Fields Cache
sábado 26 de marzo de 2011
Consulta sólo lo que usas
automáticamente
sábado 26 de marzo de 2011
$article = \Model\Article::query()->one();
// fieldsarray( '_id' => 1,);
sábado 26 de marzo de 2011
$article = \Model\Article::query()->one();$article->getTitle();$article->getContent();
// fieldsarray( '_id' => 1, 'title' => 1, 'content' => 1,);
sábado 26 de marzo de 2011
$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
$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
Se acabó el preocuparse por el tamaño de los
documentos
sábado 26 de marzo de 2011
¿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
¿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 normales
sábado 26 de marzo de 2011
0
12.5
25
37.5
50
Insert Update Delete Hydrate
MandangoDoctrineMongo
Tim
e (m
s)
sábado 26 de marzo de 2011
4-5-6-7-8-+x en casos de usar pocos campos en documentos complejos
sábado 26 de marzo de 2011
Y además usa 2-3x menos de memoria ;)
sábado 26 de marzo de 2011
sfMandangoPlugin
sábado 26 de marzo de 2011
MandangoBundle
sábado 26 de marzo de 2011
Mandango es a los ODMs lo que MongoDB a las bases de datos
sábado 26 de marzo de 2011
¿Preguntas?
sábado 26 de marzo de 2011