2. Bases de datos relacionales#

2.1. Diseño de esquemas de bases de datos#

Hasta ahora hemos comparado una base de datos con una hoja de cálculo. Sin embargo, las bases de datos son más complejas en estructura ya que incluyen relaciones entre tablas. Para representar estas relaciones, se suele utilizar gráficos llamados diagrama entidad-relación (ERD) y Modelo lógico de datos (LDM).

Diagrama entidad relación (ERD):#

Es una forma de representar las relaciones que existen entre entidades. 🤣

Normalmente se representan con símbolos:

Y conectamos con líneas que representan las relaciones. Las relaciones pueden ser de varios tipos (también llamados cardinalidad):


Veamos un ejemplo:




Ejercicio:
¿Cómo diagramaría los siguientes casos?

  • Una base de facturación/venta.

  • Librería.

  • Netflix.

Modelo lógico de datos (LDM):#

Es una forma de representar las tablas que componen una base de datos y sus relaciones. Dos buenos ejemplos los podemos encontrar en https://www.sql-practice.com/

2.2. Condicionales y operadores en SQL#

Antes de escribir consultas de varias tablas en SQL vamos a repasar un poco de lógica matemática y teoría de conjuntos.

Lógica matemática#

Una proposición es una expresión que puede ser verdadera o falsa. Por ejemplo:

  • 2 + 2 = 4

  • 2 + 2 = 5

  • 3 > 2

  • Estoy en clase de SQL

  • Estoy en clase de Python

Las proposiciones se pueden combinar con operadores lógicos para formar nuevas proposiciones. Los operadores lógicos más comunes son:

  • AND, y, &, conjunción: Devuelve verdadero si se cumplen todas las condiciones.

  • OR, o, |, disyunción : Devuelve verdadero si se cumple alguna de las condiciones.

  • NOT, no, ~, negación: Devuelve verdadero si no se cumple la condición.

Para los operadores se puede obtener una tabla de verdad:

A

B

A AND B

A OR B

NOT A

NOT B

True

True

True

True

False

False

True

False

False

True

False

True

False

True

False

True

True

False

False

False

False

False

True

True

Veamos un ejercicio: Asumamos que no sabemos nada de maría ¿Cuál de los siguientes enunciados es más posible que sea verdad?

  • María es baterista en una banda de heavy metal o trabaja en un banco.

  • María es contadora y trabaja en un banco.

Teoría de conjuntos#

La lógica matemática se va muy de la mano con la teoría de conjuntos.
Un conjunto es una colección de elementos. Por ejemplo:

  • El conjunto de todos los números naturales.

  • El conjunto de todos los productos de una empresa.

  • El conjunto de todos los clientes de una empresa.

  • El conjunto de todos los alumnos de la UDLA.

  • El conjunto de materias que se imparten en la UDLA.

  • El conjunto de todos los alumnos de la UDLA que están en clase de programación.

Los conjuntos se pueden combinar con operadores para formar nuevos conjuntos. Los operadores más comunes son:

  • UNION, unión: Devuelve un conjunto con todos los elementos de los conjuntos que se están uniendo.

    • A ∪ B = {x | x ∈ A ∨ x ∈ B}

  • INTERSECT, intersección: Devuelve un conjunto con los elementos que están en ambos conjuntos.

    • A ∩ B = {x | x ∈ A ∧ x ∈ B}

  • COMPLEMENT, complemento: Devuelve un conjunto con los elementos que NO están en el conjunto.

    • A’ = {x | x ∉ A}

  • EXCEPT, diferencia: Devuelve un conjunto con los elementos que están en el primer conjunto pero no en el segundo.

    • A - B = {x | x ∈ A ∧ x ∉ B}

Se suelen representar con diagramas de Venn:

from matplotlib_venn import venn2, venn2_circles, venn2_unweighted
from matplotlib_venn import venn3, venn3_circles
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
%matplotlib inline
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 1
----> 1 from matplotlib_venn import venn2, venn2_circles, venn2_unweighted
      2 from matplotlib_venn import venn3, venn3_circles
      3 from matplotlib import pyplot as plt

ModuleNotFoundError: No module named 'matplotlib_venn'

Dos conjuntos A y B pueden tener elementos en común:

set1 = (10, 5, 5)
venn2(subsets=set1, set_labels=('A', 'B'))
venn2_circles(subsets=set1, linestyle="dotted", linewidth=1)
plt.show()
_images/240618fd58029d09ee8725929526f7c3a5d6c9ce833adbb289bd573af6ca57f6.png

O no:

set1 = (10, 5, 0)
venn2(subsets=set1, set_labels=('A', 'B'))
venn2_circles(subsets=set1, linestyle="dotted", linewidth=1)
plt.show()
_images/1a3f2159f6806360a484e3f931474ce4408b36d0f4d6322d0966bb9fe41242b0.png

También puede suceder que un conjunto esté contenido dentro de otro, en cuyo caso se dice que el conjunto contenido es un subconjunto del conjunto contenedor. En el siguiente ejemplo, el conjunto A es un subconjunto del conjunto B.

set1 = (10, 0, 5)
venn2(subsets=set1, set_labels=('A', 'B'))
venn2_circles(subsets=set1, linestyle="dotted", linewidth=1)
plt.show()
_images/9178475c47b9b378cc3b313e1a7f43100d6d8831c41d17eac7ceaf1839c3e75d.png

Antes de realizar cualquier consulta es importante visualizar los datos de ésta forma para entender que es lo que se quiere obtener.

Hagamos algunos ejemplos: ¿Cómo representaría los siguientes conjuntos?

  • Productos de Toyota y listado de productos de Coca-Cola.

  • Inventario del supermaxi condado o inventario de de supermaxi 6 de diciembre.

  • Alumnos de la UDLA y alumnos de la materia de programación.

  • Alumnos de la UDLA y registro civil ecuatoriano.

  • Alumnos de marketing la UDLA que no han tomado la clase de programación.

2.3. Uniones e intersecciones (join, append)#

Es posible combinar tablas en SQL usando los operadores de conjuntos. Ésto se hace usando las cláusulas JOIN y UNION.

UNION#

También llamado append. Devuelve un conjunto con todos los elementos de los conjuntos que se están uniendo. Usualmente se utilizan para unir tablas con la misma estructura.

Por ejemplo, utilizando el ejemplo de la base hospital.db, si quisiéramos obtener un listado de todos los pacientes y doctores podríamos hacer lo siguiente:

SELECT 
    CONCAT(first_name,' ',last_name) AS Nombre,
    "Paciente" AS Cargo
FROM patients
UNION
SELECT
    CONCAT(first_name,' ',last_name) AS Nombre,
    "Doctor" AS Cargo
FROM doctors

En éste caso parte de la estructura de la tabla es similar, por lo que podemos unir los resultados de ambas consultas.

JOIN#

También llamado merge o concatenate. Devuelve variables que están en diferentes tablas. Usualmente se utilizan para unir tablas con diferente estructura.

Siempre se requiere especificar la condición de la union.

Existen diferentes tipos de JOINS dependiendo de la relación que se quiera obtener:


Gráficamente se verían de las siguiente forma:


Tomado de: DataSchool

Veamos algunos ejemplos utilizando la base de datos hospital.db.

Obtengamos el nombre de la provincia en la tabla pacientes:

SELECT 
    A.*,
    B.province_name
FROM patients AS A
LEFT JOIN province_names AS B ON A.province_id = B.province_id

Taller#

Ahora vamos a pasar a usar una base más compleja, la base de datos nordwind.db.

Han sido nombrados CEO de la empresa NordWind. El directorio de la empresa le pide que realice una presentación de su plan de acción de corto plazo para familiarizarse con el negocio.

  • Su primera tarea es preparar una agenda de reuniones con el equipo a su cargo ¿Con quienes se debería reunir y en que orden?

  • Segundo, deberá reunirse con los clientes más importantes ¿Quienes son y cómo priorizaría las reuniones?

  • Tercero, deberá reunirse con los proveedores más importantes ¿Quienes son y cómo priorizaría las reuniones?

  • Cuarto, deberá proponer al menos una estrategia de ventas ¿En qué productos se enfocaría y por qué?

  • Quinto, deberá proponer al menos una estrategia de operaciones ¿Tenemos productos con problemas de inventario, cómo lo solucionamos?

  • Por último, para la milla extra podrá proponer cualquier otro asunto que considere importante.

El directorio le ha dado 10 minutos para presentar su plan de acción, más de eso y seguramente tendrá una penalización en su evaluación de desempeño anual.

Además, debera generar un archivo con todas las consultas SQL en caso de que un auditor quiera revisar su trabajo.