Tema 6 - Modelo Relacional

Estática (relaciones en intensión y extensión)


📖
Definiciones Básicas
  • Relación: estructura básica del modelo. Se representa mediante una tabla.
  • Atributo: Representa las propiedades de la relación. Se representa mediante una columna. (El Nº de atributos representa el grado)
  • Dominio: Es el conjunto válido de valores que toma un atributo
  • Tupla: Es una ocurrencia de la relación, se representa mediante una fila (El Nº de tuplas representa la cardinalidad)
  • Grado: Número de atributos de una relación (número de columnas de una tabla)
  • Cardinalidad: Número de tuplas de una tabla (número de filas de una tabla)

Estructura del Modelo Relacional

📖
Tipos de esquemas de relación
Intensión
Se compone únicamente del nombre (R)(R) y los atributos (A)(A) de la relación asociados a un dominio (D)(D) de valores.
R(A1:D1,A2:D2,...,An:Dn)R(A_1:D_1, A_2:D_2,...,A_n:D_n)
💡
La relación de intensión representa la cabecera de una tabla (nombres de las columnas), sin valores concretos
Extensión
Se compone del nombre (r(R))(r(R)), atributos (A)(A) y tuplas (t)(t). Donde cada una de estas tuplas contiene un valor (V)(V) para cada uno de los atributos de la relación
r(R)=tj{(A1:V1j,A2:V2j,...A1:Vnj):VnjDi}r(R) = t_j \{(A_1:V_{1j}, A_2:V_{2j}, ... A_1:V_{nj}):V_{nj}\in D_i\}
Explicación de la función
  • r(R)r(R) → Relación de estensión
  • tj{<campos>}t_j\{<campos>\} → Tupla genérica (fila jj) y la definición de sus campos
  • VijDiV_{ij} \in D_i → El valor ii de la fila/tupla jj debe pertenecer al dominio DiD_i (dominio del atributo (columna) ii)
  • An:VnjA_n:V_{nj} → El artributo nn toma el valor nn de la fila jj para la tupla actual
 
💡
La relación de extensión representa la tabla (entera), con valores concretos
💡
En adelante nos referiremos como tabla, relación o entidad a la relación de intensión

Representación del Modelo Relacional

📖
Una entidad representa un elemento que se va a relacionar con otro(s), se escriben Mayúsculas, contiene las claves, entre paréntesis.
💡
Al igual que las relaciones, se representa mediante una tabla

Características de una relación/entidad

🗝️
Claves de una relación
Las diferentes claves de una relación se aplican a uno o varios atributos de la relación y se usan para expresar que atributos tienen un significado especial para la relación
 
  • Candidata: Es el conjunto no vacío de atributos que identifica unívoca y mínimamente cada tupla de una relación. Estas son claves que toman valores irrepetibles respecto del resto de tuplas.
  • Primaria: Es la clave candidata que elige el usuario para identificar las tuplas de la relación.
  • Clave Alternativa (unique): Aquella clave candidata que no haya sido elegida como clave primaria. Es el identificador Alternativo de una entidad.
  • Clave Ajena (foreign key): La clave ajena es un atributos cuyo valor pertenece a otra entidad, sirve para relacionar dos entidades.
 
🚯
Opciones de borrado (B:) y Modificación(M:) de una Clave Ajena
Las opciones de borrado/modificado hacen referencia al criterio que debemos de seguir cuando borramos o modificamos una tupla de la tabla cuyos atributos son usados como claves ajenas en otras tablas
  • Restringido (R) → No se puede borrar/modificar si algún valor de la tupla aparece en otra tabla como clave ajena
  • En Cascada (C) → Si se borra/modifica algún valor de la tupla, ha de hacerse también la misma operación en aquellas tablas que utilizen dicho valor como clave ajena
  • Puesta a Nulos (N) → Si se borra/modifica algún valor de la tupla, se deberá poner como valor nulo en el resto de tablas dicho valor donde este aparecía como clave ajena
  • Puesta a Por Defecto (D) → Si se borra/modifica algún valor de la tupla, se deberá poner como valor, el valor por defecto del atributo correspondiente, en el resto de tablas dicho valor donde este aparecía como clave ajena
🤖
Restricciones de verificación
CHECK
Esta restricción permite establecer una condición para la relación actual. Esta condición será comprobada antes de toda operación de inserción, borrado o modificación. Si la verificación falla, la operación será cancelada.
Ejemplo
Por ejemplo, para la relación EMPLEADOS podría definirse una restricción que comprobara que el sueldo de un empleado siempre ha de ser mayor o igual al salario mínimo (600 euros). Así, si se va a insertar un empleado con un sueldo de 300 euros, la operación se rechazaría
ASSERT
A diferencia de los CHECKS, las aserciones se aplican sobre más de una relación
ℹ️
Otras propiedades de los atributos
  • Admite Nulos: Representa un atributo opcional del modelo E/R, se identifica con *
  • No Admite nulos: Las claves son así por defecto pero aun así podemoas marcar un atributos con NN para explicitar esta característica

Representación de una relación/entidad

🖼️
Representación de las características de una relación intensión
  • Claves primarias → subrayado\text{\small{\underline{subrayado}}}
  • Claves alternativas → negrita
  • Claves ajenas → cursiva o subrayado discontinuo\begin{smallmatrix} subrayado\ discontinuo\\ ------------- \end{smallmatrix}
  • Atributos opcionales o que admiten valores nulos → *
  • Atributos obligatorios (por defecto) → NN
Ejemplo de la representación de claves y características de los atributos
Ejemplo de la representación de claves y características de los atributos

Restricciones Inherentes

📋
Características de una relación derivadas de la definición de relación
  • No puede haber tuplas dupliacadas (idénticas)
  • El orden de las tuplas es irrelevante (orden de las filas)
  • El orden de los atributos (orden de las columnas)
  • La tabla es de 2 dimensiones, solo hay filas y columnas por lo que por cada cruce de estas solo puede haber un valor
📖
Regla de Integridad de la entidad: Ningún atributo que forme parte de la clave primaria puede tomar nulo.
📖
Regla de Integridad Referencial: si un atributo pertenece a la clave primaria de una relación, tiene que mantener su valor en cualquier lugar en el que sea referenciada (otra entidad o una interrelación)
📋
Otras restricciones semánticas:
  • Verificación (check): comprueba en toda operación si un predicado es cierto o falso, si no es cierto, rechaza la operación
  • Aserción (assertion): Funciona de la misma forma que el check, pero sobre varios elementos de la tabla. Tiene un nombre identificador (tiene vida por si mismo)
  • Disparador (trigger): Se establece una condición que cuando se cumple, ejecuta un procedimiento determinado por el usuario

Las 12 Reglas de Codd

📖
El creador del Modelo Relacional definió las siguientes reglas
Regla 0.- Regla básica:
Cualquier sistema que se anuncie como SGBD relacionales debe ser capaz de gestionar por completo las BD utilizando sus capacidades relacionales
 
El SGDB no debe recurrir a operaciones no relacionales para completar sus capacidades de gestión de datos (definición y manipulación)
 
Regla 1.- Representación de la información
Toda información almacenada en una base de datos relacional debe representarse explícitamente a nivel lógico, y de manera única, por medio de valores en tablas. Podríamos decir que éste es el principio básico del modelo relacional.
 
Regla 2.- Acceso garantizado:
Todo dato debe ser accesible mediante una combinación de un nombre de tabla, un valor de su clave y el nombre de una columna. Es una forma de insistir en la obligatoriedad de la clave primaria.
 
Regla 3.- Tratamiento sistemático de valores nulos:
Los valores nulos, información desconocida o inaplicable, han de ser tratados sistemáticamente por el sistema, el cual ha de ofrecer las facilidades necesarias para su tratamiento.
 
Regla 4.- Catálogo activo en línea basado en el modelo relacional:
La representación de la metainformación (descripción de la base de datos) debe ser igual a la de los otros datos y su acceso debe poder realizarse por medio del mismo lenguaje relacional que se utiliza para los demás datos; es decir, el modelo de datos para la metainformación debe ser también el relacional.
 
La configuración/estructura de las tablas y sus atributos gestionados en un SGBD se almacenarán igualmente usando el mismo modelo relacional que los datos de una tabla cualquiera
 
Regla 5.- Sublenguaje de datos completo:
Debe existir un lenguaje que permita un completo manejo de la base de datos (definición de datos, definición de vistas, manipulación de datos, restricciones de integridad, autorizaciones y gestión de transacciones).
 
Lenguage utilizado comúnmente → SQL
 
Regla 6.- Actualización de vistas:
Toda vista teóricamente actualizable debe poder ser actualizada por el sistema.
 
Regla 7.- Inserciones, modificaciones y eliminaciones de alto nivel:
Todas las operaciones de manipulación de datos (consulta, inserción, modificación y borrado) deben operar sobre conjuntos de filas (lenguaje no navegacional).
 
Los sistemas existentes hasta el momento en el que surge el modelo relacional actuaban registro a registro obligando al programador de una base de datos a navegar por la misma.
 
Regla 8.- Independencia física de los datos:
El acceso lógico a los datos debe mantenerse incluso cuando cambien los métodos de acceso o la forma de almacenamiento.
 
La forma en la que se accede a los datos no debe alterarse aún cuando se altera la forma en la que se almacenan los datos
 
Regla 9.- Independencia lógica de los datos:
Los programas de aplicación no deben verse afectados por cambios realizados en las tablas que estén permitidos teóricamente y que preserven la información.
 
Regla 10.- Independencia de la integridad
Las reglas de integridad de una base de datos deben ser definibles por medio del sublenguaje de datos relacional y habrán de almacenarse en el catálogo de la base de datos (metabase), no en los programas de aplicación.
 
Dichas reglas de integridad será almacenados como metainformacón, por lo que deberán ser almacenados en el esquema de la BD al que se hace referencia en la Regla 4
 
Las características de una tabla, como sus atributos y sus restricciones deberán poder ser modificadas por el usuario a través de un lenguaje destinado para ello
 
Regla 11.- Independencia de la distribución:
Debe existir un sublenguaje de datos que pueda soportar bases de datos distribuidas sin alterar los programas de aplicación cuando se distribuyan los datos por primera vez o se redistribuyan éstos posteriormente.
 
Regla 12.- Regla de la no subversión:
Si un SGBD soporta un lenguaje de bajo nivel que permite el acceso fila a fila, éste no puede utilizarse para saltarse las reglas de integridad expresadas por medio del lenguaje de más alto nivel.
 
El SGBD debe servir los datos como si estos estuvieran en una única máquina, aunque estos estén distribuidos entre diferentes máquinas
 

Dinámica (álgebra relacional)


ℹ️
La dinámica del modelo relacional permite la transformación entre estados de la BD que se realiza aplicando un conjunto de operaciones para obtener un estado distinto

Álgebra Relacional

📖
Operaciones Primitivas
Operadores Unarios: Se aplican a una sola relación
Proyección (π)(\pi) Selecciona una columna
Este operación devuelve como resultado una relación con solo las columnas seleccionadas
Sintaxis del operador
πattr1,attr2myTable\large {\pi}_{\scriptsize{attr1, attr2}}\small\text{myTable}
Ejemplo de la operación en SQL
SELECT DISTINCT attr1, attr2 FROM myTable

 
Selección (σ)(\sigma) → Selecciona una fila según un criterio definido
Este operación devuelve como resultado una relación filas/tuplas que cumplen una condición concreta
Sintaxis del operador
σattr1="value1"myTable\large {\sigma}_{\scriptsize{attr1="value1"}}\small\text{myTable}
Ejemplo de la operación en SQL
SELECT * FROM myTable

 
Operadores Binarios: Se aplica sobre dos relaciones
Unión ()(\cup) Juntar las tuplas de dos tablas compatibles entre sí
Este operación devuelve como resultado una relación juntando todas las tuplas de estas dos en una tablas que comparter los mismos atributos (eliminando las tuplas repetidas)
Sintaxis del operador
myTable1  myTable2\text {myTable1}\ \cup\ \text{myTable2}
Ejemplo de la operación en SQL
SELECT attrX, attrY, attrZ FROM myTable1
UNION
SELECT attrX, attrY, attrZ FROM myTable2;

 
Diferencia ()(-)Se toman las tuplas de una tabla sin las tuplas que sean iguales a las de la otra tabla
Este operación devuelve como resultado una relación a partir de las tuplas de una tabla myTable1 pero le quita las tuplas que sean identicas a alguna tupla de la tabla myTable2 Siempre y cuando estas tablas sean compatibles
Sintaxis del operador
myTable1  myTable2\text {myTable1}\ -\ \text{myTable2}
Ejemplo de la operación en SQL
# MySQL & PostgreSQL
SELECT attrX, attrY, attrZ FROM tabla1
EXCEPT
SELECT attrX, attrY, attrZ FROM tabla2;

# Oracle
SELECT attrX, attrY, attrZ FROM tabla1
MINUS
SELECT attrX, attrY, attrZ FROM tabla2;

 
Producto cartesiano (×)(\times) Multiplicar todos los valores por todos
Este operación devuelve como resultado una relación con los atributos tanto de la primera tabla como de la segunda. Las tuplas se construyen calculando todas las combinaciones posibles entre las tuplas de la primera tabla y las de la segunda (parecido a la propiedad distributiva del producto de sumas en aritmética)
Sintaxis del operador
myTable1 × myTable2\text {myTable1}\ \times\ \text{myTable2}
Ejemplo de la operación en SQL
SELECT myTable1.*, myTable2.* 
# Utilizamos `<tabla>.<cols>` para hacer una proyección
# de dichas columnas antes de hacer el producto cartesiano
FROM myTable1
CROSS JOIN myTable2;

 
💡
Dos relaciones son compatibles entre sí si:
  • Tienen el mismo grado
  • Se puede hacer corresponder a cada atributo de una tabla, otro atributo de la otra

notion image
📖
Operaciones derivadas
Join θ\theta / * Une dos tablas basándose en la clave ajena que tengan ambas
Este operación devuelve como resultado una relación con los atributos tanto de la primera tabla como de la segunda. Las tuplas de construyen uniendo cada tupla de la primera tabla, con las tuplas de la segunda tabla que contengan, en un atributo concreto de ambas, el mismo valor
💡
La condición (columna de referencia) se puede omitir si esta se llama igual en ambas tablas
Este operador es equivalente a hacer: π(σmyTable1.attrX=myTable2.attrXmyTable1×myTable2)\pi_*(\sigma_{\tiny{myTable1.attrX = myTable2.attrX}}myTable1 \times myTable2)
Sintaxis del operador
myTable1  myTable2myTable1.attrX=myTable2.attrX\begin{matrix} \text {myTable1}\ *\ \text{myTable2}\\ \scriptsize{myTable1.attrX = myTable2.attrX} \end{matrix}
Ejemplo de la operación en SQL
# Sintaxis antigua (INNER JOIN implicito)
SELECT *
FROM myTable1, myTable2
WHERE myTable1.attrX=mytable2.attrX
# Los atributos pueden tener distinto nombre mientras sus
# valores pertenezcan al mismo dominio

# Sintaxis actual
SELECT *
FROM myTable1
INNER JOIN myTable2 ON myTable1.attrX = myTable2.attrX;

 
Intersección \capCoge los valores iguales en dos tablas
Este operación devuelve como resultado una relación a partir de dos tablas compatibles entre sí, con únicamente las tuplas que aparecen en ambas tablas (las tuplas deben ser identicas).
 
Este operador es equivalente a la expresión: R1(R1R2)R1 - (R1-R2)
Sintaxis del operador
myTable1  myTable2\text {myTable1}\ \cap\ \text{myTable2}
Ejemplo de la operación en SQL
SELECT attrX, attrY, attrZ FROM myTable1
INTERSECT
SELECT attrX, attrY, attrZ FROM myTable1;

 
División :Selecciona a los que tienen todo el divisor
Este operación devuelve como resultado una relación a partir de dos tablas. La primera tabla (dividendo) contendrá un número kk de atributos mientras que la segunda tabla (divisor) solo contendrá un atributo, equivalente con uno de los atributos de la primera tabla.
 
Consite en encontrar todas las tuplas que en la columna en común estarían relacionadas con todas los valores de la tabla del divisor
💡
Si hicieramos un join entre el dividendo y el divisor, y agrupamos según todos los atributos menos el atributo común, nos queda un grupo de nn tuplas que es igual que el de la tabla divisor. Aquellos grupos con el count(x) igual que el numero inicial de tuplas del divisor, sería parte del resultado
 
Este operador es equivalente a la expresión: πC(R1)πC(R2×πC(R1)R1)\pi_C(R1) - \pi_C(R2 \times \pi_C(R1) - R1)
Sintaxis del operador
myTable1 : myTable2\text {myTable1}\ :\ \text{myTable2}
Ejemplo de la operación en SQL

 
Group by ...GroupBy\sqcap...GroupBy Agrupa una tabla en base al valor de un atributo concreto y realiza un calculo sobre cada uno de los grupos resultantes
Este operación devuelve como resultado una relación desde cero con un atributo que será el atributo sobre el que hemos agrupado. Como valores tendremos los valores sobre los que se han podido hacer grupos. Adicionalmente podemos añadir una columna extra conocidad como functión de agregación
 
💡
Esta operación no devuelve los grupos como tal, sino los valores del atributo sobre el cual se han podido hacer grupos, y un atributo correspondiente con el resultado de la función de agregación que se ha calculado sobre los miembros de ese grupo
Funciones de agregación
  • COUNT(*) → Cuenta cuantas tuplas hay en cada grupo
  • AVG(attrX) → Calcula la media de los valores de la columna attrX
  • SUM(attrX) → Calcula el sumatorio de los valores de la columna attrX
  • MAX(attrX) → Busca el valor máximo entre los valores de la columna attrX
  • MIN(attrX) → Busca el valor mínimo entre los valores de la columna attrX
 
Sintaxis del operador
someFunc(param)GroupByattr\large{\sqcap}_{\text{\scriptsize{someFunc(param)}}}\small{GroupBy_{attr}}
Ejemplo de la operación en SQL
# Contar, tras agrupar por `attrX`,
# cuantas tuplas con valores diferentes hay en cada grupo

SELECT COUNT(*), attrX
FROM myTable1
GROUP BY attrX

# >>> Construye una tabla con: (resultado_del_count, attrX)
# donde `attrX` representa a cada grupo, y resultado_del_count
# es el resultado del valor de la función de agregación
# calculada en cada grupo