4. 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
5. 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
6. MongoDB es la base de datos NOSQL más
similar en conceptos a las SQL
sábado 26 de marzo de 2011
7. Base de datos == Base de datos
Tabla == Colección
Registro ~= Documento
sábado 26 de marzo de 2011
8. Documentos
Simplemente datos representados en JSON
sábado 26 de marzo de 2011
9. {
username: pablodip,
email: pablodip@gmail.com
}
sábado 26 de marzo de 2011
10. Documentos
En arrays en PHP
sábado 26 de marzo de 2011
11. array(
'username' => 'pablodip',
'email' => 'pablodip@gmail.com',
)
sábado 26 de marzo de 2011
12. Documentos embebidos
Documentos dentro de otros documentos
sábado 26 de marzo de 2011
13. array(
'username' => 'pablodip',
'email' => 'pablodip@gmail.com',
'profile' => array(
'first_name' => 'Pablo',
'last_name' => 'Díez',
),
)
sábado 26 de marzo de 2011
15. Al vuelo
Las bases de datos y colecciones se crean
automáticamente la primera vez que se usan
sábado 26 de marzo de 2011
16. $mongo = new Mongo('mongodb://localhost:27017');
$database = $mongo->selectDatabase('symfony2');
$collection = $database->selectCollection('user');
sábado 26 de marzo de 2011
17. Esquema libre
Cada documento puede usar los campos que quiera
incluso en la misma colección
sábado 26 de marzo de 2011
19. Sencillo
Guardar arrays, consultar arrays
sábado 26 de marzo de 2011
20. $pablodip = array(
'username' => 'pablodip',
'email' => 'pablodip@gmail.com',
);
$collection->save($pablodip);
sábado 26 de marzo de 2011
21. $criteria = array(
'username' => 'pablodip'
);
$pablodip = $collection->findOne($criteria);
$pablodip['city'] = 'Zamora';
$collection->save($pablodip);
sábado 26 de marzo de 2011
22. Sencillo
Consultas realmente sencillas
sábado 26 de marzo de 2011
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. // 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. // un resultado
$article = $db->article->findOne();
// criteria, fields
$article = $db->article->findOne($criteria, $fields);
sábado 26 de marzo de 2011
27. $criteria = array('username' => 'pablodip');
$update = array('$set' => array('city' => 'Oxford'));
$db->article->update($criteria, $update);
sábado 26 de marzo de 2011
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 sencillas
sábado 26 de marzo de 2011
29. MongoDB -
• Sin integridad referencial
• Transacciones sólo a nivel de documento
sábado 26 de marzo de 2011
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
37. Mandango es a los ODMs lo que
MongoDB a las bases de datos
sábado 26 de marzo de 2011
38. 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
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. $article = new Article();
$article->setTitle('foo');
$article->setContent('bar');
$article->save();
sábado 26 de marzo de 2011
41. Fácil de usar
Interfaz fluida
sábado 26 de marzo de 2011
43. Fácil de usar
Sencillo uso de namespaces.
Convención: Model...
sábado 26 de marzo de 2011
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. Referencia, embebidos
Automáticamente; embebidos profundos
sábado 26 de marzo de 2011
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. // 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. Unit of Work
¡Todo a la vez!
sábado 26 de marzo de 2011
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. Sistema (simple) de Queries
Orientado a objetos.
Mismos conceptos que Mongo.
sábado 26 de marzo de 2011
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. Perezoso
No consulta a la base de datos
hasta que no se necesita.
sábado 26 de marzo de 2011
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. /*
* 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
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. $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
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. Mandango
Query Fields Cache
sábado 26 de marzo de 2011
68. Consulta sólo lo que
usas
automáticamente
sábado 26 de marzo de 2011
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. Se acabó el preocuparse
por el tamaño de los
documentos
sábado 26 de marzo de 2011
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. ¿Killer feature?
Yo sólo se que es extremadamente eficiente ;)
sábado 26 de marzo de 2011
76. ¿Cuán rápido es Mandango
entonces?
sábado 26 de marzo de 2011
77. 3-4x comparado con
DoctrineMongo
en casos normales
sábado 26 de marzo de 2011
78. 50
37.5
Time (ms)
25
Mandango
DoctrineMongo
12.5
0
Insert Update Delete Hydrate
sábado 26 de marzo de 2011
79. 4-5-6-7-8-+x en casos de
usar pocos campos en
documentos complejos
sábado 26 de marzo de 2011
80. Y además usa 2-3x menos
de memoria ;)
sábado 26 de marzo de 2011