Los esquemas son la forma en que organizamos nuestros documentos en nuestras colecciones. MongoDB no impone ningún esquema pero podemos seguir buenas prácticas y estructurar nuestros documentos de forma parecida (no igual) para aprovechar la flexibilidad y escalabilidad de la base de datos sin aumentar la complejidad de nuestras aplicaciones.
Las relaciones son la forma en que nuestras entidades o documentos sen encuentran enlazados unos con otros. Por ejemplo: Una carrera tiene multiples cursos y cada curso tiene multiples clases.
:dancer: MongoDB tiene mucha flexibilidad y no nos impone seguir una estructura o esquema bien definido.
:no_good: SQL nos impone una estructura bien definida a más no poder; es super no-flexible.
:beers: Con MongoDB es más fácil empezar y añadir nuevas funcionalidades.
:timer_clock: Con SQL es más demorado de empezar porque debemos tener el orden super claro siempre. Todos los elementos deben tener los mismos elementos y todos deben ser del mismo tipo. Si queremos agregar un nuevo campo debemos añadirlo en todas partes con un valor pode defecto, aunque no lo necesitemos.
:face_with_thermometer: Si no seguimos buenas prácticas en MongoDB, vamos a necesitar queries ultra-complejas, demoradas y una visita diaria al psicólogo :scream:.
:massage: El orden impuesto de SQL no es por nada. Las queries son fáciles de entender porque todo sigue su orden y tranquilidad. Aunque, implementar nuevas features toma su buen tiempo :thinking:.
:medal_sports: Para mi el ganador es MongoDB siempre y cuando sigamos buenas prácticas desde el principio. Un gran poder conlleva a una gran responsabilidad :muscle::tada:.
Esquemas: La forma en que nosotros organizamos nuestros documentos dentro de nuestras colecciones.
Relaciones: La forma en que nuestras entidades o docuemntos estan entrelazados
excelente resumen
¿Qué son los esquemas y las relaciones?
Los esquemas son las formas en que nosotros organizamos nuestros documentos dentro de nuestras colecciones.
Las relaciones son las formas en que las entidades/documentos se encuentran enlazados unos con otros.
Me extraña mucho la falta de comentarios, ¿hace 2 años el ultimo?
Es pequeño, casi no se ve, pero existe un filtro para los comentarios, yo lo uso todo el tiempo, de esa manera me puede mostrar los comentarios, mas nuevos, las preguntas sin responder o los mas votados.
Se puede guardar imagenes en mongoDB como en formato de Bytes como en otras bases de datos SQL? y es buena practica almacenar archivos en bases de datos?
Sí se puede hacer con los tipos BSON pero tienes que tener en cuenta el costo en tamaño, escalabilidad, velocidad etc. Para imágenes que van a ser usadas en web lo recomendable es contar con un servicio de almacenamiento en la nube que te genere una URL para cada imagen. Es decir tener una CDN (Content Delivery Network).
Ademas esta el limite del tamaño de documentos, 16 mb, con una imagen facil lo rebasarías. saludos :)
MongoDB es una base de datos no relacional, es decir no es como las típicas bases de datos SQL (MySQL, Oracle, PostgreSQL, etc...) donde existen relaciones entre una tabla y otra. Veamos un ejemplo clásico.
Imaginemos una base de datos de libros. Tendríamos una tabla con los títulos de los libros y otra con los datos de los autores. El campo autor en la tabla de libros, apuntaría a un ID o clave primaria de un autor de la tabla autores.
En MongoDB podemos hacer algo parecido, por medio de referencias y el método populate de MongoDB .
Sigamos con el ejemplo anterior. Un modelo autor en Node.js usando mongoose sería tal que así:
var mongoose =require("mongoose");varSchema= mongoose.Schema;var autorSchema =newSchema({nombre:String,biografia:String,fecha_de_nacimiento:Date,nacionalidad:String,});module.exports= mongoose.model("Autor", autorSchema);
y supongamos un modelo sencillo para libro de la siguiente manera:
var mongoose =require('mongoose');varSchema= mongoose.Schema;varAutor= mongoose.model('Autor');var libroSchema =newSchema({titulo:Stringpaginas:Number,isbn:String,autor:{type:Schema.ObjectId,ref:"Autor"}});module.exports= mongoose.model("Libro", libroSchema);
Si nos fijamos, para el campo autor en el modelo libro hemos usado el tipo Schema.ObjectId y la referencia al modelo Autor. Esto nos permitirá establecer la relación entre un campo de una tabla y otra.
Pero si no tenemos consultas SQL, y pedimos una lista de todos los libros en la base de datos ¿Qué datos nos llegarán?
Lo primero que programaríamos sería esto (en Express/Node.js):
y si tenemos varios libros registrados en la base de datos, nos devolvería un JSON parecido a este:
[{"_id":"547db17cbe9956a000001","__v":0"titulo":"Juego de Tronos","paginas":150,"isbn":"0-553-57340-4","autor":"547db17cbe9958b000001"},{"_id":"547db17cbe9956a000001","__v":0"titulo":"Choque de Reyes","paginas":340,"isbn":"0-553-57340-5","autor":"547db17cbe9958b000001"},{"_id":"547db17cbe9956a000001","__v":0"titulo":"Tormenta de Espadas","paginas":620,"isbn":"0-553-57340-7","autor":"547db17cbe9958b000001"}]
En el campo autor obtenemos la referencia en formato ObjectID del autor, pero no su ficha completa. ¿Qué pasa si queremos mostrar en un sólo JSON toda la información para poder pintarla de una sola llamada en nuestra webapp? Para eso necesitamos hacer uso del método populate de MongoDB que también implementa la librería mongoose.
En nuestro controlador anterior, debemos ampliarlo con lo siguiente:
app.get("/libros",function(req, res){Libro.find({},function(err, libros){Autor.populate(libros,{path:"autor"},function(err, libros){ res.status(200).send(libros);});});});La línea Autor.populate(libros,{path:"autor"},...); toma el array de objectos libros y le indica que en la ruta autor lo "popule" con los datos del modelo Autor.Quedando una respuesta más completa como este ejemplo:[{"_id":"547db17cbe9956a000001","__v":0"titulo":"Juego de Tronos","paginas":150,"isbn":"0-553-57340-4","autor":{"_id":"547db17cbe9958b000001","__v":0,"nombre":"George R. R. Martin","biografia":"American novelist...","fecha_de_nacimiento":"1948-09-20T00:00:00.000Z","nacionalidad":"USA"}},{"_id":"547db17cbe9956a000001","__v":0"titulo":"Choque de Reyes","paginas":340,"isbn":"0-553-57340-5","autor":{"_id":"547db17cbe9958b000001","__v":0,"nombre":"George R. R. Martin","biografia":"American novelist...","fecha_de_nacimiento":"1948-09-20T00:00:00.000Z","nacionalidad":"USA"}},{"_id":"547db17cbe9956a000001","__v":0"titulo":"Tormenta de Espadas","paginas":620,"isbn":"0-553-57340-7","autor":{"_id":"547db17cbe9958b000001","__v":0,"nombre":"George R. R. Martin","biografia":"American novelist...","fecha_de_nacimiento":"1948-09-20T00:00:00.000Z","nacionalidad":"USA"}}]
Podemos ver que el objeto _id del campo autor ha sido sustituido por el modelo autor completo al que hace referencia.
MongoDB tiene una mejor flexibilidad.
que SQL
Sin duda el futuro es MongoDB
ok muy bien explicado, gracias ahora un caso practico
Los esquemas de una colección pueden ser flexibles entre sí?
¿Qué son los Esquemas?
Es la forma en la que organizamos nuestros documentos dentro de nuestras colecciones
Nota: Mongo no impone ningún esquema dentro de las colecciones
.
.
podemos encontrar casos en los que tengamos varios documentos dentro de una colección y que ninguno se parezca uno con otro, un caso extremo podría ser el siguiente ejemplo:
Los esquemas son la forma en que organizamos nuestros documentos en nuestras colecciones. MongoDB no impone ningún esquema pero podemos seguir buenas prácticas y estructurar nuestros documentos de forma parecida (no igual) para aprovechar la flexibilidad y escalabilidad de la base de datos sin aumentar la complejidad de nuestras aplicaciones.
Las relaciones son la forma en que nuestras entidades o documentos sen encuentran enlazados unos con otros. Por ejemplo: Una carrera tiene multiples cursos y cada curso tiene multiples clases.
Buena clase!!
Esquemas
Relaciones
Es muy cierto el ejemplo de sql vs mongo. Por ese lado creo que mongo tiene más poder!
Genial
Entendido
Hay algo que no entiendo, en las tablas y colecciones:
Tablas: se define la estructura de datos que debe tener esa tabla y con base en esa estructura son los datos que enviamos a la BD, o sea tenemos ya un esquelo o un modelo armado.
Colecciones: Como hacemos esto en las colecciones, se que no se tiene un esquema, pero como genero una estructura básica para enviar los datos, o sea cómo sé que datos enviar. O simplemente puedo enviar desde mi Frontend los datos que quiera a la colección que quiera y solo creo un documento en la colección para que me deje crear la BD y ya, no defino nada y así.
Espero me haya hecho entender y si no dejenmelo saber.
A este profesor siempre le da hipo o se queda sin aire, me parece que es porque recien acaba de desayunar, tiene que tomar mas agua
es mejor concentrarse en la clase, se nota que el profesor sabe y eso es lo que importa