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