El modelo relacional ( MR ) es un enfoque para gestionar datos utilizando una estructura y un lenguaje coherentes con la lógica de predicados de primer orden , descrita por primera vez en 1969 por el informático inglés Edgar F. Codd , [1] [2] donde todos los datos se representan en términos de tuplas , agrupadas en relaciones . Una base de datos organizada en términos del modelo relacional es una base de datos relacional .
El propósito del modelo relacional es proporcionar un método declarativo para especificar datos y consultas: los usuarios indican directamente qué información contiene la base de datos y qué información desean de ella, y dejan que el software del sistema de gestión de bases de datos se encargue de describir las estructuras de datos para almacenar los datos y los procedimientos de recuperación para responder a las consultas.
La mayoría de las bases de datos relacionales utilizan el lenguaje de consulta y definición de datos SQL ; estos sistemas implementan lo que puede considerarse una aproximación de ingeniería al modelo relacional. Una tabla en un esquema de base de datos SQL corresponde a una variable de predicado; el contenido de una tabla a una relación; las restricciones clave, otras restricciones y las consultas SQL corresponden a predicados. Sin embargo, las bases de datos SQL se desvían del modelo relacional en muchos detalles, y Codd argumentó ferozmente contra las desviaciones que comprometen los principios originales. [3]
El modelo relacional fue desarrollado por Edgar F. Codd como un modelo general de datos y posteriormente promovido por Chris Date y Hugh Darwen, entre otros. En su libro de 1995 El tercer manifiesto , Date y Darwen intentan demostrar cómo el modelo relacional puede dar cabida a ciertas características "deseadas" de la orientación a objetos . [4]
Algunos años después de la publicación de su modelo de 1970, Codd propuso una versión lógica de tres valores (Verdadero, Falso, Faltante/ NULL ) para lidiar con la información faltante, y en su The Relational Model for Database Management Version 2 (1990) fue un paso más allá con una versión lógica de cuatro valores (Verdadero, Falso, Faltante pero Aplicable, Faltante pero Inaplicable). [5]
Una relación consta de un encabezado y un cuerpo . El encabezado define un conjunto de atributos , cada uno con un nombre y un tipo de datos (a veces llamado dominio ). El número de atributos en este conjunto es el grado o aridad de la relación . El cuerpo es un conjunto de tuplas . Una tupla es una colección de n valores , donde n es el grado de la relación y cada valor en la tupla corresponde a un atributo único. [6] El número de tuplas en este conjunto es la cardinalidad de la relación . [7] : 17–22
Las relaciones se representan mediante variables relacionales o relvars , que pueden reasignarse. [7] : 22–24 Una base de datos es una colección de relvars. [7] : 112–113
En este modelo, las bases de datos siguen el principio de información : en un momento dado, toda la información en la base de datos está representada únicamente por valores dentro de tuplas, correspondientes a atributos, en relaciones identificadas por relvars. [7] : 111
Una base de datos puede definir expresiones booleanas arbitrarias como restricciones . Si todas las restricciones se evalúan como verdaderas , la base de datos es consistente ; de lo contrario, es inconsistente . Si un cambio en las variables rel de una base de datos dejara la base de datos en un estado inconsistente, ese cambio es ilegal y no debe tener éxito. [7] : 91
En general, las restricciones se expresan utilizando operadores de comparación relacional, de los cuales sólo uno, "es subconjunto de" (⊆), es teóricamente suficiente. [ cita requerida ]
Dos casos especiales de restricciones se expresan como claves y claves externas :
Una clave candidata , o simplemente una clave , es el subconjunto más pequeño de atributos que se garantiza que diferencian de forma única cada tupla de una relación. Dado que cada tupla de una relación debe ser única, cada relación tiene necesariamente una clave, que puede ser su conjunto completo de atributos. Una relación puede tener múltiples claves, ya que puede haber múltiples formas de diferenciar de forma única cada tupla. [7] : 31–33
Un atributo puede ser único entre tuplas sin ser una clave. Por ejemplo, una relación que describe a los empleados de una empresa puede tener dos atributos: ID y Nombre. Incluso si ningún empleado comparte actualmente un nombre, si es posible contratar eventualmente a un nuevo empleado con el mismo nombre que un empleado actual, el subconjunto de atributos {Nombre} no es una clave. Por el contrario, si el subconjunto {ID} es una clave, esto significa no solo que ningún empleado comparte actualmente un ID, sino que ningún empleado compartirá nunca un ID. [7] : 31–33
Una clave externa es un subconjunto de atributos {A} en una relación R 1 que corresponde con una clave de otra relación R 2 , con la propiedad de que la proyección de R 1 sobre {A} es un subconjunto de la proyección de R 2 sobre {A} . En otras palabras, si una tupla en R 1 contiene valores para una clave externa, debe haber una tupla correspondiente en R 2 que contenga los mismos valores para la clave correspondiente. [7] : 34
Los usuarios (o programas) solicitan datos de una base de datos relacional enviándole una consulta . En respuesta a la consulta, la base de datos devuelve un conjunto de resultados.
A menudo, los datos de varias tablas se combinan en una sola mediante una operación de unión . En teoría, esto se hace tomando todas las combinaciones posibles de filas (el producto cartesiano ) y luego filtrando todo excepto la respuesta.
Existen varias operaciones relacionales además de la operación join. Entre ellas se encuentran project (el proceso de eliminar algunas de las columnas), restrict (el proceso de eliminar algunas de las filas), union (una forma de combinar dos tablas con estructuras similares), difference (que enumera las filas de una tabla que no se encuentran en la otra), intersect (que enumera las filas que se encuentran en ambas tablas) y product (mencionada anteriormente, que combina cada fila de una tabla con cada fila de la otra). Según las fuentes que consulte, existen otros operadores, muchos de los cuales se pueden definir en términos de los que se enumeran anteriormente. Entre ellos se incluyen semijoin, operadores externos como external join y external union, y varias formas de división. También hay operadores para cambiar el nombre de las columnas, operadores de resumen o agregación y, si permite valores de relación como atributos (atributo con valor de relación), operadores como group y ungroup.
La flexibilidad de las bases de datos relacionales permite a los programadores escribir consultas que no habían previsto los diseñadores de bases de datos. Como resultado, las bases de datos relacionales pueden ser utilizadas por múltiples aplicaciones de maneras que los diseñadores originales no previeron, lo que es especialmente importante para bases de datos que podrían usarse durante mucho tiempo (quizás varias décadas). Esto ha hecho que la idea y la implementación de bases de datos relacionales sean muy populares entre las empresas.
Las relaciones se clasifican en función de los tipos de anomalías a las que son vulnerables. Una base de datos que se encuentra en la primera forma normal es vulnerable a todos los tipos de anomalías, mientras que una base de datos que se encuentra en la forma normal de dominio/clave no tiene anomalías de modificación. Las formas normales son jerárquicas por naturaleza. Es decir, el nivel más bajo es la primera forma normal y la base de datos no puede cumplir los requisitos de las formas normales de nivel superior sin haber cumplido primero todos los requisitos de las formas normales menores. [8]
El modelo relacional es un sistema formal . Los atributos de una relación definen un conjunto de proposiciones lógicas . Cada proposición puede expresarse como una tupla. El cuerpo de una relación es un subconjunto de estas tuplas, que representan qué proposiciones son verdaderas. Las restricciones representan proposiciones adicionales que también deben ser verdaderas. El álgebra relacional es un conjunto de reglas lógicas que pueden inferir conclusiones válidas a partir de estas proposiciones. [7] : 95–101
La definición de una tupla permite una tupla vacía única sin valores, correspondiente al conjunto vacío de atributos. Si una relación tiene un grado de 0 (es decir, su encabezado no contiene atributos), puede tener una cardinalidad de 0 (un cuerpo que no contiene tuplas) o una cardinalidad de 1 (un cuerpo que contiene la única tupla vacía). Estas relaciones representan valores de verdad booleanos . La relación con grado 0 y cardinalidad 0 es False , mientras que la relación con grado 0 y cardinalidad 1 es True . [7] : 221–223
Si una relación de Empleados contiene los atributos {Nombre, ID} , entonces la tupla {Alice, 1} representa la proposición: "Existe un empleado llamado Alice con ID 1 ". Esta proposición puede ser verdadera o falsa. Si esta tupla existe en el cuerpo de la relación, la proposición es verdadera (existe dicho empleado). Si esta tupla no está en el cuerpo de la relación, la proposición es falsa (no existe dicho empleado). [7] : 96–97
Además, si {ID} es una clave, entonces una relación que contenga las tuplas {Alice, 1} y {Bob, 1} representaría la siguiente contradicción :
Según el principio de explosión , esta contradicción permitiría al sistema demostrar que cualquier proposición arbitraria es verdadera. La base de datos debe aplicar la restricción de clave para evitarlo. [7] : 104
Un ejemplo idealizado, muy simple, de una descripción de algunas relvars ( variables de relación ) y sus atributos:
En este diseño tenemos tres variables rel: Cliente, Pedido y Factura. Los atributos en negrita y subrayados son claves candidatas . Los atributos que no están en negrita y subrayados son claves externas .
Generalmente se elige una clave candidata para llamarla clave principal y se la utiliza con preferencia sobre las otras claves candidatas, que luego se denominan claves alternativas .
Una clave candidata es un identificador único que obliga a que no se duplique ninguna tupla ; esto convertiría la relación en otra cosa, es decir, en un conjunto , al violar la definición básica de un conjunto . Tanto las claves externas como las superclaves (que incluyen las claves candidatas) pueden ser compuestas, es decir, pueden estar formadas por varios atributos. A continuación se muestra una representación tabular de una relación de nuestro ejemplo de relvar Cliente; una relación puede considerarse como un valor que puede atribuirse a un relvar.
Si intentáramos insertar un nuevo cliente con el ID 123 , esto violaría el diseño de la variable relvar ya que el ID del cliente es una clave principal y ya tenemos un cliente 123. El DBMS debe rechazar una transacción como esta que haría que la base de datos fuera inconsistente por una violación de una restricción de integridad . Sin embargo, es posible insertar otro cliente llamado Alice , siempre que este nuevo cliente tenga un ID único, ya que el campo Nombre no es parte de la clave principal.
Las claves externas son restricciones de integridad que imponen que el valor del conjunto de atributos se extraiga de una clave candidata en otra relación . Por ejemplo, en la relación Pedido, el atributo ID de cliente es una clave externa. Una unión es la operación que extrae información de varias relaciones a la vez. Al unir relvars del ejemplo anterior, podríamos consultar la base de datos para todos los Clientes, Pedidos y Facturas. Si solo quisiéramos las tuplas para un cliente específico, lo especificaríamos usando una condición de restricción. Si quisiéramos recuperar todos los Pedidos para el Cliente 123 , podríamos consultar la base de datos para devolver cada fila en la tabla Pedido con ID de cliente 123 .
Hay una falla en el diseño de nuestra base de datos anterior. La variable relvar Factura contiene un atributo ID de pedido. Por lo tanto, cada tupla en la variable relvar Factura tendrá un ID de pedido, lo que implica que hay exactamente un pedido para cada factura. Pero en realidad, se puede crear una factura para muchos pedidos, o incluso para ningún pedido en particular. Además, la variable relvar Pedido contiene un atributo ID de factura, lo que implica que cada pedido tiene una factura correspondiente. Pero nuevamente, esto no siempre es cierto en el mundo real. Un pedido a veces se paga a través de varias facturas y, a veces, se paga sin factura. En otras palabras, puede haber muchas facturas por pedido y muchos pedidos por factura. Esta es una relación de muchos a muchos entre Pedido y Factura (también llamada relación no específica ). Para representar esta relación en la base de datos, se debe introducir una nueva variable relvar cuya función sea especificar la correspondencia entre pedidos y facturas:
Factura de pedido ( ID de pedido , ID de factura )
Ahora, la variable rel de pedido tiene una relación de uno a muchos con la tabla OrderInvoice, al igual que la variable rel de factura. Si queremos recuperar cada factura de un pedido en particular, podemos consultar todos los pedidos en los que el ID de pedido en la relación de pedido sea igual al ID de pedido en OrderInvoice, y en los que el ID de factura en OrderInvoice sea igual al ID de factura en Invoice.
Un tipo de datos en una base de datos relacional puede ser el conjunto de números enteros, el conjunto de cadenas de caracteres, el conjunto de fechas, etc. El modelo relacional no dicta qué tipos se deben admitir.
Los atributos se representan comúnmente como columnas , las tuplas como filas y las relaciones como tablas . Una tabla se especifica como una lista de definiciones de columnas, cada una de las cuales especifica un nombre de columna único y el tipo de valores permitidos para esa columna. Un valor de atributo es la entrada en una columna y fila específicas.
Una variable de relación ( relvar ) de una base de datos se conoce comúnmente como tabla base . El encabezado de su valor asignado en cualquier momento es el especificado en la declaración de la tabla y su cuerpo es el que le haya sido asignado más recientemente por un operador de actualización (normalmente, INSERT, UPDATE o DELETE). El encabezado y el cuerpo de la tabla resultante de la evaluación de una consulta están determinados por las definiciones de los operadores utilizados en esa consulta.
SQL, que en un principio se promovió como el lenguaje estándar para bases de datos relacionales , se desvía del modelo relacional en varios puntos. El estándar SQL ISO actual no menciona el modelo relacional ni utiliza términos o conceptos relacionales. [ cita requerida ]
Según el modelo relacional, los atributos y tuplas de una relación son conjuntos matemáticos , lo que significa que no están ordenados y son únicos. En una tabla SQL, ni las filas ni las columnas son conjuntos propios. Una tabla puede contener filas y columnas duplicadas, y las columnas de una tabla están ordenadas explícitamente. SQL utiliza un valor Nulo para indicar datos faltantes, que no tiene análogo en el modelo relacional. Debido a que una fila puede representar información desconocida, SQL no se adhiere al Principio de información del modelo relacional . [7] : 153–155, 162
Los conceptos básicos del modelo relacional son los nombres de las relaciones y los nombres de los atributos . Los representaremos como cadenas como "Persona" y "nombre" y normalmente utilizaremos las variables y para abarcarlas. Otro concepto básico es el conjunto de valores atómicos que contiene valores como números y cadenas.
Nuestra primera definición se refiere a la noción de tupla , que formaliza la noción de fila o registro en una tabla:
La siguiente definición define la relación que formaliza el contenido de una tabla tal como se define en el modelo relacional.
Esta relación se corresponde estrechamente con lo que se suele llamar la extensión de un predicado en la lógica de primer orden, excepto que aquí identificamos los lugares en el predicado con nombres de atributos. Por lo general, en el modelo relacional, se dice que un esquema de base de datos consta de un conjunto de nombres de relaciones, los encabezados que están asociados con estos nombres y las restricciones que deben cumplirse para cada instancia del esquema de base de datos.
Uno de los tipos de restricciones de relación más simples e importantes es la restricción de clave . Nos dice que en cada instancia de un determinado esquema relacional las tuplas pueden identificarse por sus valores para determinados atributos.
Una superclave es un conjunto de encabezados de columnas para los cuales los valores de esas columnas concatenados son únicos en todas las filas. Formalmente:
Una clave candidata es una superclave que no puede subdividirse aún más para formar otra superclave.
La dependencia funcional es la propiedad de que un valor de una tupla puede derivarse de otro valor de esa tupla.
El algoritmo deriva claves candidatas a partir de dependencias funcionales como entrada: un conjunto S de FD que contienen solo subconjuntos de un encabezado H como salida: el conjunto C de superclaves que se mantienen como claves candidatas en todos los universos de relación sobre H en los que se cumplen todos los FD en S C := ∅ // encontró claves candidatas Q := { H } // superclaves que contienen claves candidatas mientras Q <> ∅ sea K algún elemento de Q Q := Q – { K } mínimo := verdadero para cada X->Y en S hacer K' := ( K – Y ) ∪ X // derivar nueva superclave si K' ⊂ K entonces mínimo := falso Q := Q ∪ { K' } fin si fin para si es mínimo y no hay un subconjunto de K en C entonces eliminar todos los superconjuntos de K de C C := C ∪ { K } fin si fin mientras
Otros modelos incluyen el modelo jerárquico y el modelo de red . Algunos sistemas que utilizan estas arquitecturas antiguas todavía se utilizan hoy en día en centros de datos con necesidades de gran volumen de datos, o donde los sistemas existentes son tan complejos y abstractos que resultaría prohibitivo en términos de costos migrar a sistemas que emplean el modelo relacional. También cabe destacar las nuevas bases de datos orientadas a objetos [9] y Datalog [10] .
Datalog es un lenguaje de definición de bases de datos que combina una visión relacional de los datos, como en el modelo relacional, con una visión lógica, como en la programación lógica . Mientras que las bases de datos relacionales utilizan un cálculo relacional o álgebra relacional, con operaciones relacionales , como unión , intersección , diferencia de conjuntos y producto cartesiano para especificar consultas, Datalog utiliza conectores lógicos, como if , or , and y not para definir relaciones como parte de la base de datos en sí.
A diferencia del modelo relacional, que no puede expresar consultas recursivas sin introducir un operador de punto mínimo fijo, [11] las relaciones recursivas se pueden definir en Datalog, sin introducir ningún operador o conectivo lógico nuevo.