Alfonso Fernández
8 marzo 2019
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
"Aquellas bases de datos que no solo usan SQL como lenguaje de consulta"
Existen muchas relaciones entre los datos
Se necesitan sacar informes complejos
Redis
Firebase
DynamoDB
MongoDB
Utiliza un sistema de almacenamiento clave-valor
Es un sistema efímero, solo guarda datos en memoria
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
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
Apps / juegos
móviles
Apps web
sin backend
Es administrada.
No hay que instalar, mantener o aprovisionar servidores.
Acoplas tu aplicación a los servicios de AWS
Es la base de datos NoSQL de Amazon
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
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)
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)
NO hay que definir ningún schema
que los documentos de una colección pueden contener diferentes campos
SQL | MongoDB | OOP |
---|---|---|
Database | Database | - |
Table | Collection | Class |
Row | Document | Instance |
Column | Field | Property |
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"
}
}
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
Por escalabilidad
Uno de los principales motivos por los que existe MongoDB es por la escalabilidad que permite
CREATE TABLE people (
id INT NOT NULL AUTO_INCREMENT,
user_id Varchar(30),
age Number,
status char(1),
PRIMARY KEY (id)
)
db.createCollection("people")
INSERT INTO people(user_id, age, status)
VALUES ("bcd001", 45, "A")
db.people.insertOne({
user_id: "bcd001",
age: 45,
status: "A" })
SELECT user_id, status
FROM people
WHERE status = "A"
db.people.find(
{ status: "A" },
{ user_id: 1, status: 1, _id: 0 }
)
UPDATE people
SET status = "C"
WHERE age > 25
db.people.updateMany(
{ age: { $gt: 25 } },
{ $set: { status: "C" } }
)
DELETE FROM people
WHERE status = "D"
db.people.deleteMany( { status: "D" } )
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>
}
}
)
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"
})
db.people.insert({
"name": "Erin",
"place": {
"name": "Broadway Center"
},
"url": "bc.example.net"
})
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"
}
})
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
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