Bases de Datos

Servidor de Aplicación

Servidor de Base de datos

Soluciones

Bases de datos

Se especializan en realizar operaciones de lectura/escritura muy rápidamente desde disco.

Para lograrlo almacenan los datos siguiendo un esquema que se define previamente para realizar consultas fácilmente.

 

Existen 2 tipos: SQL y NoSQL. Las SQL (Structured Query Language) usan una estructura de tablas y álgebra relacional para hacer operaciones sobre la base de datos.
Corren como un servidor; esperando peticiones en una dirección y un puerto específico.

 

Tablas

Campos

Registros

Bases de datos

Un servidor puede contener varias bases de datos.
Una base de datos puede contener varias tablas.
Una tabla puede contener varios registros.

 

Schema

Indica qué tablas o relaciones componen la base de datos, así como los campos incluidos en cada tabla

Queries

Se realizan queries usando SQL para recuperar datos o modificarlos. Por ejemplo: Recuperar solo el nombre de los clientes que se llamen “Jaimito”.

SELECT first_name, last_name
FROM player
WHERE first_name='Jaimito'

PostgreSQL

- Utiliza SQL.

- Open Source.

- Integración con diversas plataformas incluyendo Heroku.

- 15 de desarrollo.

- Disponibilidad para múltiples sistemas.

ValentinaDB

- Cliente SQL para hacer operaciones complejas sobre una base de datos.

- Interfaz gráfica fácil de usar

- Disponibilidad para varios sistemas operativos.

Llaves (ID)

Cada registro de una base de datos tiene una llave o identificador único con el que se puede acceder de manera eficiente.

Relaciones

No todos los datos se almacenan en una misma tabla, por el contrario existen diferentes tablas interrelacionadas de tal forma que se pueden realizar queries eficientemente sobre ellas.

 

Se almacena la llave en la tabla propia, en lugar de copiar todos los datos; a esto se le llama una llave foránea.

Ejercicio

Completar las secciones 1 - 7 del tutorial de PostgreSQL utilizando ValentinaDB.

Recuperar datos (SELECT)

Recupera un conjunto de columnas de una Tabla.

SELECT column_1,
       column_2,
       ...

FROM table_name

Filtrar datos

Se puede especificar al query que solo recupere los datos que cumplan con una restricción, la más común es where: hace que el query compare una columna de cada registro de la base de datos con un valor arbitrario; en caso de coincidir regresa en el conjunto de datos solicitado.

SELECT last_name, first_name
FROM player
WHERE first_name = 'Jaimito' AND last_name = 'Perez';

Joins

Permiten combinar la información de 2 tablas para responder preguntas más complejas. Comparan una llave foránea en una tabla con la llave primaria correspondiente en otra tabla.

 

Inner Join

SELECT
  player.email, 
  "first_name", 
  "last_name", 
  "username", 
  "level", 
  "score"
FROM
  "public"."player" AS player
INNER JOIN
  "public"."score" AS score
ON
  player.email = score.email;

Resultado

Crear Tablas (CREATE TABLE)

CREATE TABLE "public"."player" ( 
  "email" Text NOT NULL,
  "first_name" Text,
  "last_name" Text,
  "username" Text NOT NULL,
  PRIMARY KEY ("email"),
  CONSTRAINT "unique_email" UNIQUE( "email" )
);
CREATE TABLE level ( 
  "level_id" SERIAL PRIMARY KEY,
  "name" VARCHAR (50) NOT NULL,
  "description" TEXT
);

Insertar Datos (INSERT)

INSERT INTO "score" ("email", "level", "score") 
VALUES 
  ('manuela.recio@upb.edu.co', 4, 350),
  ('juan.riosq@upb.edu.co', 4, 200);

Alterar información (UPDATE)

UPDATE "player" 
SET
  "first_name" = 'Juan',
  "last_name" = 'Nicholls'
WHERE
  "email" = 'jdnichollsc@hotmail.com';

Eliminar información (DELETE)

DELETE FROM "score" 
WHERE
  email = 'jdnichollsc@hotmail.com';

Ejercicio

Desarrolle la base de datos para soportar el ejercicio del leaderboard.

 

Integración con Node.js

Para acceder a la base de datos desde Node.js se utiliza una librería de Postgres para Node. Vamos a usar pg.

const { Client } = require('pg');
const connectionString = 'postgresql://dbuser:password@database.server.com:3211/mydb'

const client = new Client({
  connectionString: connectionString,
})
client.connect()

client.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  client.end()
})

Conexiones

Construir una conexión tiene un delay de 20-30ms, haciendo que la latencia para responder las peticiones aumente. Es preferible reutilizar las conexiones.

Pool

const { Pool } = require('pg')
const connectionString = 'postgresql://dbuser:password@database.server.com:3211/mydb'

const pool = new Pool({
  connectionString: connectionString,
})

pool.query('SELECT * FROM users WHERE id = $1', [1])
.then(res => {
  console.log('user:', res.rows[0])

  //code code code
})
.catch(e => setImmediate(() => { throw e }))

Conexiones

  • Cada conexión abierta ocupa memoria.
  • La base de datos puede ejecutar una operación por cada conexión de manera concurrente.
  • A veces las conexiones se degradan y expiran, es común tener que crear más cuando empiezan a fallar.
  • Para liberar memoria y solucionar otros problemas con el servidor, es común reiniciar.

 

Referencias

Bases de Datos

By J.D Nicholls

Bases de Datos

  • 1,668