Introducción a las bases de datos NoSQL
feat. MongoDB
Alfonso Fernández
8 marzo 2019
Gracias ;)
About me
Alfonso Fernández
Full-Stack Developer.
CTO at Quoters. Co-founder at Cloud Man Labs
alfonso.fernandez@cloudmanlabs.com
https://slides.com/alfonsofernandez/introduccion-nosql
¿Qué son?
"Aquellas bases de datos que no solo usan SQL como lenguaje de consulta"
Hay demasiadas...
... y todas son la mejor
Pero lo mas importante es...
... que no resuelven todos los problemas
Las bases de datos SQL son especialmente buenas cuando:
Existen muchas relaciones entre los datos
Se necesitan sacar informes complejos
Hablaremos de:
Redis
Firebase
DynamoDB
MongoDB
Características principales
Utiliza un sistema de almacenamiento clave-valor
Es un sistema efímero, solo guarda datos en memoria
Usos
Se utiliza mayoritariamente como sistema de caché
Muy útil para el escalado horizontal de aplicaciones
Guardar datos de sesión de usuarios
Cachear resultados de búsqueda de otras bases de datos
Compartir datos entre servidores
Servicio adquirido en 2014 por Google
Realtime Database
Cloud Firestore
Sistema de almacenamiento documental
Implementa permisos a nivel de documento. ¡No require backend!
Lenguajes soportados
Javascript / Node
Swift
Objetive-C
Java / Android
Python
Go
PHP
Ejemplos de uso
Apps / juegos
móviles
Apps web
sin backend
Puntos clave
Es administrada.
No hay que instalar, mantener o aprovisionar servidores.
pero...
Acoplas tu aplicación a los servicios de AWS
Es la base de datos NoSQL de Amazon
¿Quién la usa?
La MySQL de las bases de datos NoSQL
Sistema de almacenamiento basado en documentos
Muy buena documentación
Muy rápida
Soporte nativo de tipos de datos y consultas geográficas
Ventajas
Proporcionan muy buen rendimiento sin configuraciones complejas
Prototipado/desarrollo rápido de aplicaciones
Cuando la capa de datos es pequeña/mediana simplifican el almacenamiento de datos
Se integra muy bien con OOP (Object Oriented Programming)
Características
Los documentos MongoDB son objetos JSON (BSON)
Lenguaje de consulta en Javascript
Soporte ACID reciente
No existe integridad referencial
(hay que manejarla a nivel de aplicación)
... y lo más importante de todo
NO hay que definir ningún schema
... eso quiere decir ...
que los documentos de una colección pueden contener diferentes campos
"acepta lo que la eches"
...si algo de lo anterior os preocupa...
os recomiendo usar una base de datos SQL
MongoDB?
SQL?
¿Qué pastilla elijes?
¿Empezamos?
Conceptos clave
SQL | MongoDB | OOP |
---|---|---|
Database | Database | - |
Table | Collection | Class |
Row | Document | Instance |
Column | Field | Property |
¿Qué es un objeto JSON?
Significa JavaScript Object Notation
Tiene un uso muy extendido en el mundo del desarrollo
{
"name": "Manolo",
"surname: "Muñoz",
"emails": [
"manolo@example.com",
"inventado@ejemplo.com"
],
"age": 68,
"height": 1.72
"active": true,
"address": {
"street": "C. Sin nombre"
"number": "S/N",
"postalCode": "41269"
}
}
¿Qué son los ids de mongo?
The 12-byte ObjectId value consists of:
-
a 4-byte value representing the seconds since the Unix epoch,
-
a 5-byte random value, and
-
a 3-byte counter, starting with a random value.
Explicación oficial
Esto quiere decir, que son identificadores únicos universales que MongoDB maneja de forma muy eficiente
...y, ¿por qué no son valores enteros autoincrementales?
Por escalabilidad
Uno de los principales motivos por los que existe MongoDB es por la escalabilidad que permite
Pasemos a hablar de consultas
¿Cómo creamos una collection?
CREATE TABLE people (
id INT NOT NULL AUTO_INCREMENT,
user_id Varchar(30),
age Number,
status char(1),
PRIMARY KEY (id)
)
db.createCollection("people")
SQL
MongoDB
¿Cómo insertamos un document?
INSERT INTO people(user_id, age, status)
VALUES ("bcd001", 45, "A")
db.people.insertOne({
user_id: "bcd001",
age: 45,
status: "A" })
SQL
MongoDB
¿Cómo consultamos?
SELECT user_id, status
FROM people
WHERE status = "A"
db.people.find(
{ status: "A" },
{ user_id: 1, status: 1, _id: 0 }
)
SQL
MongoDB
¿Cómo actualizamos un documento?
UPDATE people
SET status = "C"
WHERE age > 25
db.people.updateMany(
{ age: { $gt: 25 } },
{ $set: { status: "C" } }
)
SQL
MongoDB
¿Cómo borramos un
documento?
DELETE FROM people
WHERE status = "D"
db.people.deleteMany( { status: "D" } )
SQL
MongoDB
Consulta geoespacial
en SQL
SELECT id,
name,
lat,
lng,
( 3959 *
Acos(Cos(Radians(37)) *
Cos(Radians(lat)) *
Cos(Radians(lng) - Radians(-122.517349)) + Sin(Radians(37.780182)) *
Sin(Radians(lat)))
)
AS distance
FROM places
HAVING distance < 10000 -- meters
ORDER BY distance
LIMIT 0, 50
db.places.find({
location: {
$nearSphere: {
$geometry: {
type : "Point",
coordinates : [ <lng>, <lat> ]
},
$minDistance: <distance in meters>,
$maxDistance: <distance in meters>
}
}
)
Consulta geoespacial
en MongoDB
Y ahora vamos a hablar de referencias
entre documentos
Son muy similares a SQL
original_id = ObjectId() // Genera un id mongo
db.places.insert({
"_id": original_id, // Lo definimos para este documento
"name": "Broadway Center"
})
db.people.insert({
"name": "Erin",
"place_id": original_id, // Lo referenciamos desde otro documento
"url": "bc.example.net"
})
¡Tenemos otra opción!
db.people.insert({
"name": "Erin",
"place": {
"name": "Broadway Center"
},
"url": "bc.example.net"
})
Embedded documents
Referencing vs Embedding
¿Cuándo uso referencias?
- Documentos que vayan a ser referenciados por varios documentos (roles de usuario).
- Colecciones que puedan crecer mucho (comentarios de un post).
- Cuando la profundidad de un objeto es grande (> 3/4 niveles).
- Cuando se quiera hacer consultas complejas con dicho objeto.
¿Cuándo uso documentos embebidos?
- Si el objeto solo va a ser utilizado por el objeto padre.
- Si el objeto padre tiene referencias a pocos objetos hijos que solo usa él.
Relaciones entre objetos
One to one
address_id = ObjectId()
db.address.insert({
"_id": address_id,
"street": "C. Sin nombre"
})
db.people.insert({
"name": "Manolo",
"address": address_id
})
db.people.insert({
"name": "Manolo",
"address": {
"street": "C. Sin nombre"
}
})
Referencing
Embedding
One to Many /
Many to One
comment_id = ObjectId()
db.comment.insert({
"_id": comment_id,
"name": "Anonymous",
"text": "Me ha gustado mucho"
})
db.post.insert({
"title": "Mi primer post",
"body": "Lorem ipsum",
"comments": [comment_id]
})
db.post.insert({
"title": "Mi primer post",
"body": "Lorem ipsum",
"comments": [{
"name": "Anonymous",
"text": "Me ha gustado mucho"
}]
})
Es mejor no hacer referencias circulares
Referencing
Embedding
Hablemos de ODMs
(Object Document Mapper)
Mongoose
El ODM "de facto" en Node.js
Simplifican enormemente el desarrollo
Permite definir el schema de una colección
Gestiona automáticamente uniones entre documentos que se referencian
Hooks
Soporta nativamente timestamps
Plugins
Validación de documentos
Referencias
Libros
Cursos
¿Preguntas?
¡Gracias!
Introducción a las bases de datos NoSQL feat. MongoDB
By Alfonso Fernández
Introducción a las bases de datos NoSQL feat. MongoDB
- 1,136