Esta es una vista previa del archivo. Inicie sesión para ver el archivo original
0-presentacion-EDAT-121.pdf Estructuras de Datos Curso 2019 / 20 Profesores: Teoría: Francisco de Borja Rodríguez, Pablo Castells, Roberto Marabini, Prácticas: Julia Díaz, Álvaro del Val, Rodrigo Castro, Simone Santini, Roberto Marabini Escuela Politécnica Superior Universidad Autónoma de Madrid 2 Datos generales de la asignatura Profesor del grupo 121 – Francisco de Borja Rodríguez Ortiz – Despacho B-328 – Tutorías: por cita a petición del estudiante Profesores de la asignatura – Teoría: Pablo Castells, Francisco de Borja Rodríguez, Robereto Marabini – Prácticas: Roberto Marabini, Julia Díaz, Álvaro del Val, Rodrigo Castro, Simone Santini – Coordinador asignatura: Pablo Castells – Horario Teoría ( Grupo 121) – Martes 09h a 10h – Miércoles 09h a 11h Horario Prácticas (Grupos EDAT-1211, EDAT-1212 y EDAT-1213) – Viernes 09h a 11h y viernes de 11h a 13h Prueba final – Viernes 10 de enero 2020, 15 horas 3 Datos generales de la asignatura Leer la guía de la asignatura https://secretaria- virtual.uam.es/doa/consultaPublica/look[conpub]BuscarPubGui aDocAs?entradaPublica=true%20&idiomaPais=es.ES&_anoAc ademico=2019&_centro=350&_planEstudio=473 https://secretaria-virtual.uam.es/doa/consultaPublica/look%5bconpub%5dBuscarPubGuiaDocAs?entradaPublica=true%20&idiomaPais=es.ES&_anoAcademico=2019&_centro=350&_planEstudio=473 4 ¿Dé qué trata la asignatura? Un primer curso de introducción a bases de datos, tanto a un nivel lógico como a un nivel de implementación 5 ¿Qué es una base de datos? 6 ¿Qué es una base de datos? Es un sistema informático que permite, organiza y administra el acceso a datos de una forma eficaz. Una fuente de información estructurada almacenada en memoria secundaria Habitualmente masiva en volumen de datos, variedad y complejidad de las estructuras Gestionada mediante tecnologías con un alto nivel de generalidad, desarrolladas y estandarizadas al efecto En la asignatura estudiaremos: – Tecnologías de gestión de bases de datos –SQL y nociones prácticas – Una introducción a las metodologías de diseño –modelo E/R – La base formal sobre la que se asientan las tecnologías de bases de datos –modelo relacional, formas normales, cálculo y álgebra relacional – La implementación de tecnologías de gestión de bases de datos –registros, índices, árboles B. etc.. 7 Tipos de modelo de Bases de Datos BDs Jerarquicas (estructura de árbol): Adabas, GT.M, IMS, Focus BDs de Red (un nodo puede tener varios padres) BDs Transacionales (envio y recepción de datos a grandes velocidades) BDs Relacionales (uso de relaciones). BDs Multidimensionales BDs Orientadas a objetos BDs Documentales BDs Deductivas TODAS se manejan mediante un sistema de gestión de Bases de Datos: En e el caso de BDs Relacionles usaremos principalmente PostgreSQL que es un SGBD relacional orientado a objetos y libre. 8 Supongamos que vamos a desarrollar una aplicación para escuchar música, con redes sociales Queremos manejar información sobre: canciones, artistas, álbumes, usuarios, grupos, eventos, registro de accesos a canciones… Esta información: – Tiene estructura: p.e. un usuario tiene propiedades (nombre, nick, email, etc.) y relaciones (amigos, artistas favoritos, escuchas a canciones, etc.) – Tiene que almacenarse de forma persistente Almacenamiento en disco – Se tiene que poder inferir información de la almacenada y crear nueva información – Puede ser masiva: millones de usuarios, millones de canciones, miles de millones de registros de escuchas Inviable carga completa en RAM Acceso continuo a disco en tiempo de ejecución Un ejemplo 9 Para la aplicación necesitamos: – Acceso (consulta) eficiente a los datos: mostrar a un usuario su lista de amigos, la información de una canción, etc. – Actualización eficiente de datos: añadir amigos, guardar un log de escuchas, etc. – Acceso concurrente, robustez, seguridad… Solución: guardar todos los datos en fichero(s) en disco y programar la funcionalidad de acceso – No perder la estructura de los datos – El acceso a memoria secundaria es muy costoso – El problema requiere soluciones elaboradas no triviales (las estudiaremos!) En rigor esto ya se podría considerar una base de datos! Un ejemplo 10 La dificultad y complejidad de un desarrollo desde cero son considerables, y por otro lado… Una buena parte del problema a resolver se repite en muchos dominios: gestión de personal, gestión de inventarios, gestión universitaria, bibliotecas, reserva de viajes, banca, finanzas, contabilidad, competiciones deportivas, correo electrónico, buscadores web… Por tanto hay ciertos aspectos comunes: – Diseño de las estructuras: tabular – Almacenamiento físico – Consulta y actualización – Integridad, robustez, concurrencia, seguridad… Tecnología de bases de datos – Lenguaje estándar de creación, consultas y actualización: SQL – Motores de ejecución eficiente de las sentencias SQL – Interfaz de usuario – Interfaz de programación (ODBC, JDBC, PHP) – Metodologías de diseño: modelo Entidad / Relación – Paradigmas: modelo relacional, formas normales, cálculo y álgebra Lo estudiaremos (implementación) SGBDHerramientas Método y teoría 11 Programador aplicación Software aplicación Interfaz de usuarioUsuario final Lógica de la aplicación Archivos de datos Memoria externa Acceso y gestión de datos Arquitectura ad hoc (se ha creado especialmente para esta situación concreta, por tanto, no generalizable ni utilizable para otros propósitos) 12 Programador aplicación Software aplicación Entorno / herramientas de administración Navicat SQLYog etc. Administrador SGBD Almacenamiento Consultas Actualización Bases de datos Lógica de la aplicación Sentencias SQL Interfaz de usuario Usuario final ODBC, JDBC, PHP… API BD Arquitectura BD 13 La dificultad y complejidad de un desarrollo desde cero son considerables, y por otro lado… Una buena parte del problema a resolver se repite en muchos dominios: gestión de personal, gestión de inventarios, gestión universitaria, bibliotecas, reserva de viajes, banca, finanzas, contabilidad, competiciones deportivas, correo electrónico, buscadores web… – Diseño de las estructuras: tabular – Almacenamiento físico – Consulta y actualización – Integridad, robustez, concurrencia, seguridad… Tecnología de bases de datos – Lenguaje estándar de creación, consultas y actualización: SQL – Motores de ejecución eficiente de las sentencias SQL – Interfaz de usuario – Interfaz de programación (ODBC, JDBC, PHP) – Metodologías de diseño: modelo Entidad / Relación – Paradigmas: modelo relacional, formas normales, cálculo y álgebra Lo estudiaremos (implementación) SGBDHerramientas Método y teoría 14 La dificultad y complejidad de un desarrollo desde cero son considerables, y por otro lado… Una buena parte del problema a resolver se repite en muchos dominios: gestión de personal, gestión de inventarios, gestión universitaria, bibliotecas, reserva de viajes, banca, finanzas, contabilidad, competiciones deportivas, correo electrónico, buscadores web… – Diseño de las estructuras: tabular – Almacenamiento físico – Consulta y actualización – Integridad, robustez, concurrencia, seguridad… Tecnología de bases de datos – Lenguaje estándar de creación, consultas y actualización: SQL – Motores de ejecución eficiente de las sentencias SQL – Interfaz de usuario – Interfaz de programación (ODBC, JDBC, PHP) – Metodologías de diseño: modelo Entidad / Relación – Paradigmas: modelo relacional, formas normales, cálculo y álgebra Lo estudiaremos (implementación) SGBDHerramientas Método y teoría 15 Modelo Entidad / Relación Modelo relacionalformas normales SQL Implementación Consultas cálculo y álgebra Modelo Entidad / Relación Modelo relacional formas normales SQLConsultas cálculo y álgebra Implementación Temario Introducción y fundamentos Introducción a SQL Modelo Entidad / Relación Modelo relacional Diseño relacional: formas normales Consultas: cálculo y álgebra relacional Implementación de bases de datos – Estructura física: campos y registros – Indexación: índices simples, árboles B, hashing – Compresión 16 Introducción y fundamentos Introducción a SQL Modelo Entidad / Relación Modelo relacional Diseño relacional: formas normales Consultas: cálculo y álgebra relacional Implementación de bases de datos – Estructura física: campos y registros – Indexación: índices simples, árboles B, hashing – Compresión Temario 17 Nivel práctico Uso / administración básica de BDs Análisis, diseño y creación de BDs Manipulación de BDs, consultas Manejo de SQL Nivel conceptual Comprensión de los principios y formalismos sobre los que se asientan las tecnologías de BDs Nivel técnico Conocimiento de las técnicas de implementación interna de un SGBD Objetivos 18 Bibliografía Fundamentos de sistemas de bases de datos. Ramez Elmasri, Shamkant Navathe. Pearson Addison Wesley, 2007. INF/681.31.65/ELM. Database Management Systems. Raghu Ramakrishnan, Johannes Gehrke. McGraw-Hill, 2003. INF/C6160/RAM. Database Systems: The Complete Book. Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer Widom. Prentice Hall, 2008. Fundamentos de diseño de bases de datos. Abraham Silberschatz. McGraw-Hill, 2007. INF/681.31.65/SIL. Estructuras de archivos: un conjunto de herramientas conceptuales. Michael J. Folk, Bill Zoellick. Addison-Wesley, 1992. INF/681.3.01/FOL. 19 Relación con otras asignaturas Programación I y II, Análisis de algoritmos – Programación y desarrollo de software técnicas específicas para almacenamiento y acceso a datos estructurados masivos en disco – Algoritmia en RAM revisión para datos en disco Análisis y Diseño de Software – Modelado de datos: UML Sistemas Informáticos I – Optimizacíon de consultas, interfaces de programación – Bases de datos distribuidas – Transacciones Ingeniería del Software – Análisis y diseño de aplicaciones 20 60% Teoría ≥ 5 para hacer media Examen final (10 enero) Ejer-cicios Evaluación Prueba intermedia liberatoria (≥ 6) – La nota del parcial liberado se traslada a la nota del examen final, escalada a la puntuación de la parte correspondiente – El parcial cubrirá un 40-60% de la materia Ejercicios – Entrega de ~25 ejercicios (ver en Moodle) – 2 entregas a lo largo del curso – La entrega se realizará en pdf vía Moodle Convalidación de prácticas: escribir a Roberto Marabini (≥ 7, ≥ 3 teoría) Prueba intermedia (20 nov) Liberatorio con ≥ 6 90% 10% 40% Prácticas ≥ 5 (cada práctica ≥ 4) para hacer media Sólo si sube la nota 21 Grupos de Laboratorio Apuntarse en Moodle (hacer una elección del grupo). Las practicas comienzan el 20 de septiembre. 1-intro-EDAT-121.pdf Introducción (Cap 1 y 2 - Elmasri 5ª edición) 2 Que es una BD Una BD es un sistema informático que permite, organiza y administra el acceso a datos de una manera eficiente. Es una tecnología informática que permite de una manera eficaz manejar información estructurada y masiva en almacenamiento persistente. En definitiva es un – conjunto de datos relacionados entre si y – las técnicas para manipular los mismos. Manipular en el sentido amplio. Los datos de una BD, son (i)hechos con un significado que (ii)permiten registrarse. 3 ¿Qué propiedades tienen las BDs? Las BDs representan algún aspecto del mundo real que se suele denominar universo del discurso. Están formadas por un conjunto de datos lógicamente coherentes y con cierto orden (no es una colección aleatoria de datos). Normalmente tienen un propósito específico: – Cuando una BD se construye y rellena es siempre con un propósito específico. – Va dirigida a un grupo de usuarios y la BD dispone de una serie de aplicaciones que usaran esos usuarios Por ejemplo IMDB es una BD dirigida a personas interesadas en el cine que tiene una serie de aplicaciones que te permite buscar información relacionada (al menos para los usuarios finales). 4 ¿Qué es un SGBD? Que un sistema de gestión de BD. En definitiva es el conjunto de programas que permiten a los usuarios mantener y crear una BD (ya sea a nivel de usuario final o como administrador) Un SGBD facilita la definición, construcción y manipulación de una BD. Definir es especificar ( la definición de una BD se almacena en forma de catálogo o diccionario de la BD, son los metadatos). Se pueden definir: – Tipos de datos – Estructuras de datos – Restricciones de datos La construcción consiste en guardar los datos en un medio de almacenamiento. 5 ¿Qué es un SGBD? La manipulación consiste en: – Consultar la BD para obtener información o datos. – Actualizar la BD para reflejar cambios de la misma. – Generar informes (un informe en una BD es un documento de texto generalmente que muestra los datos de una BD del modo que se especifique). Otras funciones no menos importantes de un SGBD son todos protocolos que se realizan en una BD para ser protegida: – Respecto al mal funcionamiento de HW/SW. – Respecto a la seguridad y privacidad de los propios datos que forman la BD. 6 ¿Qué es un sistema de Bases de Datos? Sistema de Bases de Datos = BD + SGBD (o DBMS en inglés) 7 Entorno simplificado de un sistema de base de datos Software DBMS Software para procesar Consultas/Programas Software para acceder a Los datos almacenados Definición de la base de datos Almacenada (metadatos) Base de datos almacenada (metadatos) Programas de Aplicación/Consultas Sistema de Bases de Datos Usuarios/Programadores 8 Un primer ejemplo Base de datos que almacena la información de estudiantes y cursos Tipos de datos: estudiantes, identificadores de estudiantes, cursos, profesores, calificaciones,… Estructuras: – Los estudiantes tienen un número, nombre, departamento,… – Los cursos tienen nombre del curso, número, horas, … – Los informes de calificaciones tienen número de estudiante, curso, nota, … – Relaciones: muy variadas – Los estudiantes tienen un número asociado, clase, especialidad, los cursos tienen título del mismo, identificador del curso, … Funcionalidades: – Buscar numero de matriculados en un curso, expedientes de estudiantes, informes de calificaciones,… – Ver / añadir estudiantes, cursos, … 9 BD que almacena estudiantes y cursos Nombre NumEstudiante Clase Especialidad Luis 17 1 CS Carlos 8 2 CS ESTUDIANTE NombreCurso NumeroCurso Horas Departamento Introducción a la computación CC1310 4 CC Estructura de datos CC3320 4 CC Matemática discreta MAT2410 3 MAT Bases de datos CC3380 3 CC CURSO IDSeccion NumCurso Semestre Año Profesor 85 MAT2410 Otoño 04 Pedro 92 CC1310 Otoño 04 Ana 102 CC3320 Primavera 05 Elisa 112 MAT2410 Otoño 05 Antonio 119 CC1310 Otoño 05 Juan 135 CC3380 Otoño 05 Enrique SECCION 10 BD que almacena estudiantes y cursos NumEstudiante IDSeccion Nota 17 112 B 17 119 C 8 85 A 8 92 A 8 102 B 8 135 A INFORME_CALIF NumCurso NumPrerrequisitos CC3380 CC3320 CC3380 MAT2410 CC3320 CC1310 PRERREQUISITO 11 Un primer ejemplo: construcción Observar la relación entre los registros: por ejemplo Luis en estudiantes esta relacionado con dos registros en informe de calificaciones. Fases para la creación del sistema de BD: – Definición de requisitos y análisis: se documentan y transforman en un diseño conceptual. El diseño conceptual se puede representar y manipular mediante herramientas computarizadas. Así la implementación de la BD se puede mantener, modificar y transformar fácilmente (por ejemplo el más sencillo es modelo E-R). – El diseño conceptual después se convierte en un diseño lógico que se puede expresar en un modelo de datos implementado en el un SGBD comercial. El más conocido y que más se utiliza es el modelo relacional que esta basado en relaciones entre datos como su nombre indica. – Finalmente está el modelo físico donde se proporcionan especificaciones simplemente para el almacenamiento y acceso de la BD (nivel de implementación). 12 Diferencias entre ficheros y una BD Un sistema de ficheros como tal permite el acceso a los datos que se encuentran en los ficheros. Para ser una BD el sistema necesita algo más: – Un modelo de datos físico: La disposición de los datos en el disco que permita la indexación y acceso rápido a todos los datos. – Un modelo de datos lógico: nos permite el acceso a datos a nivel alto, preocupándonos de cómo los datos tienen que estar organizados para describir el dominio que estamos modelando, y sin preocuparnos de cómo se organizan los datos a nivel físico. – Lenguaje de consulta: lenguaje de alto nivel que nos permite hacer consultas de los datos representados mediante el modelo lógico. Generalmente es un lenguaje declarativo y no procedural. Este lenguaje utiliza de manera automática los algoritmos óptimos y oportunos para acceder a los datos del modelo físico. 13 Desacople del modelo lógico y físico Un hecho muy importante que produjo el desarrollo de las BDs es que las características del modelo lógico y físico se desacoplaran y se comunicaran por un lenguaje de consulta. Se dio por primera vez en 1970 con la introducción del modelo relacional de Cood (A Relational Model of Data for Large Shared Data Banks", in Communications of the ACM, 1970) . Esta separación es muy importante (divide y vencerás), ya que el problema de acceso a datos se divide en: – Estudio de algoritmos eficientes para almacenamiento de datos en disco y su acceso optimizado (modelo físico). – Y el diseño de las aplicaciones se centra en generar un buen modelo de datos a alto nivel (modelo lógico). Esta separación de actividades asegura el gran éxito de las BDs en todos los campos. http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf 14 Características de la metodología de BD vs ficheros En programación con ficheros tradicional cada usuario define e implementa los archivos necesarios para una aplicación concreta: – Por ejemplo un usuario de la oficina de modificación de notas y un usuario de la oficina de contabilidad utilizan datos comunes, pero cada uno utiliza los que tiene en ese momento. – Así los datos de las dos oficinas están relacionados y repetidos en muchos casos. – Además ambas oficinas deben mantener datos comunes y se tienen que pasar información. En una BD esto no pasa, los datos están centralizados, hay un único almacén de datos. 15 Características de las BDs vs ficheros Naturaleza autodescriptiva del sistema de BD: – Se almacena en el catálogo del SGBD (metadatos) – El SW de SGBD puede acceder a diferentes BD’s solo mirando los catálogos. – Así un ejemplo ilustrativo de una parte del catálogo para la BD estudiantes está en la siguiente figura. Aislamiento entre programas, datos y abstracción de los datos: – Generalmente en el enfoque de ficheros si se introducen cambios en un fichero cambia el programa que accede a los mismos (ver figura con registros de estudiantes). – En una BD si queremos un nuevo campo (ej. fecha de nacimiento del estudiante), lo añadimos, se añade al catálogo, actualizamos la BD y todos los programas de acceso a datos siguen funcionando. 16 Ejemplo de catalogo de la BD NombreRelacion NumDeColumnas ESTUDIANTE 4 CURSO 4 SECCIÓN 5 INFORME_CALIF 3 PRERREQUISITO 2 Relaciones 17 Ejemplo de catalogo de la BD Columnas NombreColumna TipoDatos PerteneceARelacion Nombre Carácter (30) ESTUDIANTE NumEstudiante Carácter (4) ESTUDIANTE Clase Entero (1) ESTUDIANTE Especialidad TipoEspecialidad ESTUDIANTE NombreCurso Carácter (10) CURSO NumCurso XXXXNNNN CURSO *********************** ***************** ***************** *********************** ***************** ***************** *********************** ***************** ***************** *********************** ***************** ***************** NumPrerrequisitos XXXXNNNN PRERREQUISITO 18 Ejemplo de almacenamiento de un registro de ESTUDIANTE basado en anterior catalogo de BD Nombre del elemento de datos Posición inicial en el registro Longitud en caracteres (bytes) Nombre 1 30 NumEstudiante 31 4 Clase 35 1 Especialidad 36 4 19 Características de las BDs vs ficheros Soporte de varias vistas de datos: – Cada usuario puede necesitar una perspectiva de la BD. – Una vista es un subconjunto de la BD, o puede contener datos virtuales derivados de BD que no están explícitamente almacenados. Todo esto es transparente al usuario. – Así un ejemplo ilustrativo de una parte del catálogo para la BD estudiantes está en la siguiente figura. Compartición de datos y procesamiento de transacciones multiusuario. – Las BDs son concurrentes y tienen control de concurrencia: que varios usuarios que actualicen los mismos datos lo hagan de manera controlada (ej, reserva de asientos de vuelo). 20 Soporte de varias vistas de la BD NombreEstudiante CertificadosEstudiante NumCurso Nota Semestre Año IDSeccion Luis CC1310 C Otoño 05 119 MAT2410 B Otoño 05 112 Carlos MAT2410 A Otoño 04 85 CC1310 A Otoño 04 92 CC3320 B Privamera 05 102 CC3380 A Otoño 05 135 Certificado NombreCurso NumCurso Prerrequisitos Base de Datos CC3380 CC3320 MAR2410 Estructura de Datos CC3320 CC1310 Prerrequisito_curso 21 Roles en el uso de una base de datos Usuarios finales – Interactúan con aplicaciones que acceden a la BD Usuarios avanzados – Interactúan con la BD en SQL Programadores de aplicación – Interactúan con la BD escribiendo programas Diseñadores – Definen el diseño de la BD Administradores – Mantienen el diseño de la BD – Gestionan usuarios y permisos de acceso – Gestionan necesidades de actualización Desarrolladores de herramientas SGBD – Implementan la capa inferior de acceso físico a los datos – Desarrollan el software y herramientas que dan servicio a todo lo anterior 22 Problemas de los sistemas de ficheros Redundancia e inconsistencia de datos: la misma información puede estar duplicada en diferentes archivos como hemos visto antes. Dificultad en el acceso de los datos: – Hay que escribir un programa de acceso para cada consulta. – Los programas son difíciles de escribir ya que la información esta en varios ficheros y si se añaden nuevos campos hay que cambiar el programa. Problemas con la integridad: las restricciones de integridad son propiedades que deben satisfacer los datos y si estos están distribuidos en varios ficheros se puede violar de manera más fácil. Problemas de atomicidad: ciertos conjuntos de operaciones tienen que ser atómicas (ocurrir completas o no ocurrir). Esto es difícil de asegurar con archivos. Anomalías en acceso concurrentes: Múltiples usuarios a los mismos datos → inconsistencia. Problemas de seguridad: Es difícil asegurar que solo accedan unos determinados usuarios a los ficheros. 2-sql-EDAT-121.pdf SQL (Cap 8 - Elmasri 5ª edición) 2 Structured Query Language – SQL Lenguaje de “programación” para SGBDs (DBMSs) – DDL: Data definition language: creación del modelo de datos (diseño de tablas) – DML: Data manipulation language: inserción, modificación, eliminación de datos – DQL: Data query language: consultas El SQL se puede ejecutar sobre un SGBD (DBMS). El SQL facilita la migración entre SGBDs (DBMSs) y por eso su éxito comercial. Así proporciona un “interfaz” común entre los diferentes SGDBs (DBMSs). Algebra relacional: conjunto de operaciones que describen paso a paso como computar una respuesta sobre las relaciones en una BD (modelo relacional). Cálculo relacional: es un lenguaje de consulta, sobre relaciones, describiendo la respuesta deseada sobre una BD (no se especifica como obtenerla). 3 Structured Query Language – SQL El SQL proporciona una interfaz de lenguaje declarativo (especifica lo que debe ser el resultado) de más alto nivel que puramente una consulta en algebra relacional. Dejando así al SGBD (DBMS) las decisiones de optimización y de cómo se debe realizar la consulta. Aunque el SQL incluye algunas características de algebra relacional, está muy basado en el cálculo relacional de tuplas. ¿Por qué no se utiliza cálculo? La ventaja del SQL es que la sintaxis es mucho más amigable. Leer el Capítulo 8 del libro: – Fundamentos de sistemas de bases de datos. Ramez Elmasri, Shamkant Navathe. Pearson Addison Wesley, 2007. INF/681.31.65/ELM. 4 Structured Query Language – SQL El estándar más utilizado – Creado en 1974 (D. D. Chamberlin & R. F. Boyce, IBM) – ANSI en 1986, ISO en 1987 – Core (todos los SGBD) + packages (modulos opcionales) Versiones – SQL1 – SQL 86 – SQL2 – SQL 92, SQL 99 – SQL 3 – no plenamente soportado por la industria Limitaciones – No es puramente relacional (p.e. las vistas son multiconjuntos de tuplas) – Importantes divergencias entre implementaciones (no es directamente portable en general, incompletitudes, extensiones) –uno termina aprendiendo variantes de SQL 5 Structured Query Language – SQL Algunos SGBDs libres: – PostgreSQL (http://www.postgresql.org Postgresql) Licencia BSD – SQLite (http://www.sqlite.org SQLite) Licencia Dominio Público – DB2 Express-C (http://www.ibm.com/software/data/db2/express/) – Apache Derby (http://db.apache.org/derby/) – MySQL (http://dev.mysql.com/) – ……. Algunos SGBDs no libres: – MySQL: Licencia Dual, depende del uso – dBase – Fox Pro – IBM DB2: Universal Database (DB2 UDB) – Microsoft SQL Server – Oracle – ……. Algunos SGBDs no libres y gratuitos: – Microsoft SQL Server Compact Edition Basica – Oracle Express Edition 10 (solo corre en un servidor, capacidad limitada) – ……. http://es.wikipedia.org/wiki/PostgreSQL http://www.postgresql.org/ http://es.wikipedia.org/wiki/SQLite http://www.sqlite.org/ http://es.wikipedia.org/wiki/DB2_Express-C http://www.ibm.com/software/data/db2/express/ http://es.wikipedia.org/wiki/Apache_Derby http://db.apache.org/derby/ http://es.wikipedia.org/wiki/MySQL http://dev.mysql.com/ http://es.wikipedia.org/wiki/MySQL http://es.wikipedia.org/wiki/DBase http://es.wikipedia.org/wiki/Fox_Pro http://es.wikipedia.org/wiki/IBM http://es.wikipedia.org/wiki/DB2 http://es.wikipedia.org/wiki/Microsoft_SQL_Server http://es.wikipedia.org/wiki/Oracle http://es.wikipedia.org/wiki/SQL_Server_Compact http://es.wikipedia.org/w/index.php?title=Oracle_Express_Edition_10&action=edit&redlink=1 6 Elementos fundamentales de una base de datos SQL Base de datos = conjunto de tablas RELACIONADAS Tabla (relación, entidad, esquema…) = – Estructura fija de campos (esquema) – Conjunto de registros con valores de campos Campo (atributo, propiedad, “columna”), tiene un tipo de dato Registro (tupla, “fila”) Clave primaria Clave secundaria Clave externa 7 Diagramas típicos para una BD (modelo E/R) EMPLEADO Dirección DNI 1 CONTROLA PROYECTO DEPARTAMENTO Nombre Número Ubicaciones 1 N Ubicación Número Nombre TRABAJA_EN NM Horas TRABAJA_ PARA ADMINISTRA 11 N NumEmpleados Fechainicio FechaNac Nombre Sueldo NombreP Apellido1 Apellido2 Sexo CONTROL 1 N Supervisor Supervisado SUBORDINA DOS_DE SUBORDINADO N 1 Nombre Sexo FechaNac Relación 8 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 9 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 10 Estructura léxica del lenguaje Operaciones SQL DDL – Creación, diseño, eliminación de tablas DML – Inserción, modificación, eliminación de registros DQL – Consulta Estructura léxica de SQL Case-insensitive, insignificant whitespace Sentencias, expresiones, valores, tipos de datos Referencias – Elmasri cap. 8 – PostgreSQL SQL ref: https://www.postgresql.org/docs/10/static/index.html 11 Esquemas y Catálogos en SQL Versiones antiguas de SQL no incluían estos conceptos CREATE SCHEMA nombre AUTHORIZATION propietarios Definiciones de Dominios Definiciones de Tablas Definiciones de Vistas ………………………. CATÁLOGO = conjunto de esquemas bajo un nombre – Siempre incluye un esquema (INFORMATION_SCHEMA) que contiene información sobre todos los elementos del catálogo –Restricciones de Integridad: solo se pueden definir entre esquemas del mismo catálogo –El estándar no proporciona mecanismos para definir y eliminar catálogos, depende de la implementación 12 Literales, Expresiones y Operadores Valores literales Cadenas de caracteres entre '...' Valores numéricos similar p.e. al lenguaje C Expresiones Se pueden utilizar en WHERE, SELECT, SET, DEFAULT, CHECK… Operadores Comentarios + – * / % ^ – – AND OR NOT /* … */ = < > <= >= LIKE ISNULL operaciones con strings: concatenación, like, expresiones regulares (‘%’ ‘_’) 13 Tipos de Datos y Dominios en SQL Numéricos: –Entero de distintos tamaños (INTERGER o INT, SMALLINT) –Reales de distinta precisión (FLOAT o REAL, DOUBLE PRECISION) –Números con formato (NUMERIC(t,d), DECIMAL(t,d), d menor t, d=0 por defecto, t=n dig, d= n dig a la derecha del punto) Cadenas de caracteres: –CHAR (n) – longitud fija con relleno a blancos –CHAR VARYING (n) - longitud variable con límite –TEXT - longitud variable sin límite Cadenas de bits: –BIT(n) –BIT VARYING (n) 14 Tipos de Datos y Dominios en SQL Fecha y Hora: –DATE (10 posiciones), YYYY-MM-DD –TIME (8 posiciones), HH:MM:MM –TIME (i), carácter separador más i posiciones para fracciones de segundo –WITH TIME ZONE, 6 posiciones extra para el desplazamiento respecto al uso horario estándar universal, +-HH.MM –TIMESTAMP YYYY-MM-DD HH.MM.SS.fracciones de segundo (6 posiciones), es opcional el calificador WITH TIME ZONE –INTERVAL, periodo de tiempo (están cualificado para ser de dos tipos de intervalos generalmente) •AÑO/MES •DIA/HORA 15 Tipos de Datos y Dominios en SQL Dominios: Alternativamente a especificar los datos directamente se pueden crear dominios. Ejemplo: CREATE DOMAIN Tipo_Dni AS CHAR(9) CREATE DOMAIN nombre [AS] tipo_datos [Definición_por_defecto] [Restricciones] Definición_por_defecto DEFAULT {literal|función|NULL} Restricciones [CONSTRAINT nombre ] CHECK (expresión_condicional) 16 Tipos de Datos y Dominios en SQL Ejemplos: CREATE DOMAIN CIUDADES CHAR(15) DEFAULT ´Madrid´ CONSTRAINT MirestricciondeCiudades CHECK (VALUE IN(‘Atenas’, ‘Dublin’,……., ‘Madrid’)) CREATE DOMAIN NumEmp NUMERIC(4) DEFAULT 0 CHECK (VALUE IN NOT NULL) 17 TABLAS CREATE TABLE nombre ( campo1 tipo1 [restricciones1], campo2 tipo2 [restricciones2], …, [restricciones ] ); ALTER TABLE nombre ADD COLUMN campo tipo [restricciones]; ALTER TABLE nombre ADD restricción; ALTER TABLE nombre DROP COLUMN campo; DROP TABLE nombre; DROP CONSTRAINT nombre-restricción; 18 TABLAS Las tablas pueden tener más opciones, como indicadores de comportamiento en ciertas acciones, o relaciones con otras tablas. Las restricciones de la tabla pueden ser de diferentes tipos: –PRIMARY KEY (lista de columnas) (NO permite valores nulos, NULL) –UNIQUE (lista de columnas) (permite valores nulos, NULL) –FOREGIN KEY (lista de columnas) REFERENCES Tabla(columnas) (Indica que esa lista de columnas son clave primaria de otra tabla) Las restricciones referenciales de la tabla pueden ir con en el borrado o actualización – ON DELETE •NO ACTION •SET DEFAULT •SET NULL •CASCADE – ON UPDATE •NO ACTION •SET DEFAULT •SET NULL •CASCADE 19 Crear Tablas: Ejemplos 20 CREATE TABLE Artista ( id int PRIMARY KEY, nombre text NOT NULL, nacionalidad text ); CREATE TABLE Cancion ( id int PRIMARY KEY, titulo text NOT NULL, genero text, duracion int, fecha date, autor int NOT NULL REFERENCES Artista (id) ); Crear Tablas: Más Ejemplos 21 CREATE TABLE Usuario ( nick varchar(30) PRIMARY KEY, nombre text NOT NULL, email text NOT NULL UNIQUE ); CREATE TABLE Contacto ( usuario1 varchar(30) REFERENCES Usuario (nick), usuario2 varchar(30) REFERENCES Usuario (nick), PRIMARY KEY (usuario1,usuario2) ); Crear Tablas: Ejemplos 22 CREATE TABLE Escucha ( usuario varchar(30) , cancion int REFERENCES Cancion (id), PRIMARY KEY (usuario,cancion,instante) ); ALTER TABLE Escucha ADD instante timestamp; /* NULL’s */ ALTER TABLE Escucha DROP COLUMN instante; ALTER TABLE Escucha ADD FOREIGN KEY (usuario) REFERENCES Usuario (nick); ALTER TABLE Usuario ADD PRIMARY KEY (nick); Crear Tablas: Ejemplos 23 Especificación de Restricciones en SQL En un campo NOT NULL UNIQUE PRIMARY KEY REFERENCES tabla (clave) [(ON DELETE | ON UPDATE) (SET NULL | CASCADE | SET DEFAULT)] DEFAULT valor En una tabla PRIMARY KEY (campo1, campo2, …) FOREIGN KEY (campo1, campo2, …) REFERENCES tabla (clave1, clave2, …) UNIQUE (campo1, campo2, …) CHECK (expresión) Con nombre CONSTRAINT nombre restricción 24 Especificación de Restricciones de Atributo y Valores Predeterminados Como SQL permite atributos NULL, se puede especificar un atributo con NOT NULL. También se puede utilizar una clausula DEFAULT <valor> que se incluye en cada tupla si no se especifica ningún valor. También se puede restringir los valores de un atributo o dominio con la clausula CHECK – NumeroDpto INT NOT NULL CHECK (NumeroDpto >0 AND NumeroDpto < 21) – CREATE DOMAIN NUM_D AS INTEGER CHECK (NUM_D > 0 AND NUM_D < 21) 25 Estas restricciones son muy importantes y clausulas especiales: –PRIMARY KEY (lista de columnas) (restricción de clave) –UNIQUE (lista de columnas) (restricción de clave) –FOREIGN KEY (lista de columnas) REFERENCES Tabla(columnas) (restricción de integridad referencial) Una integridad referencial se puede violar por la inserción o eliminación de tuplas de atributos de FOREIGN KEY o la clave principal. La acción por defecto si se viola la restricción referencial es rechazar la operación (NO ACTION), pero se pueden poner más opciones: •SET DEFAULT •SET NULL •CASCADE Estos son los valores que se cambian en la tupla que se referencian Estas opciones deben cualificarse: •ON DELETE •ON UPDATE Especificación de Restricciones de Clave y Integridad Referencial 26 Ejemplos – ON DELETE CASCADE: elimina las tuplas referenciadas en cascada cuando eliminamos algo de la clave externa. – ON UPDATE CASCADE: Actualiza la clave externa por la que se ha cambiado, en cascada. NOTA: Borrar solo puede violar la integridad referencial siempre que la tupla a eliminar esté referenciada por claves externas de otras tuplas. Ejemplo siguiente: si se elimina la tupla de un empleado supervisor, el valor de SuperDni queda a NULL automáticamente en todas la tuplas de empleado que hacían referencia a la tupla de empleado borrada. Por el contrario si se actualiza el valor Dni de un empleado supervisor (se introdujo incorrectamente), entonces el valor nuevo se actualiza en cascada para el SuperDni de todas la tuplas de empleado que hacen referencia a la tupla actualizada. Ver la siguiente transparencia. Especificación de Restricciones de Clave y Integridad Referencial 27 Crear Tablas con Restricciones 28 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 29 Sentencias de SQL para cambiar el Esquema Hay comandos para evolucionar el esquema (alterar un esquema) de una BD en SQL Añadir o eliminar tablas, atributos, restricciones, etc…. DROP SCHEMA empresa CASCADE; Se elimina todo el esquema con todos los elementos (…. empresa RESTRICT solo se elimina si no contiene elementos) DROP TABLE subordinado CASCADE; (se elimina la relación y su definición, RESTRICT solo se elimina la tabla si no hace referencia a otra tabla) DELETE FROM tabla [WHERE …]; Para eliminar tuplas (DELETE FROM empleado WHERE ‘dni=123456789’; DELETE FROM EMPLEADO WHERE Apellido1=‘Cabrera’;) ALTER TABLA EMPRESA.EMPLEADO ADD COLUMN Trabajo VARCHAR (12); (no se introduce un valor para la nueva columna, se pone toda la nueva columna a NULL) ALTER TABLA EMPRESA.EMPLEADO DROP COLUMN dirección CASCADE; (RESTRICT solo se elimina la columna si no hay vistas o restricciones que hagan referencia a esta columna) 30 Sentencias de SQL para cambiar el Esquema ALTER TABLA EMPRESA.DEPARTAMENTO ALTER COLUMN DniDirector DROP DEFAULT (se elimina la clausula predeterminada para DniDirector) ALTER TABLA EMPRESA.DEPARTAMENTO ALTER COLUMN DniDirector SET DEFAULT ‘333445555’(se define la clausula predeterminada para DniDirector) ALTER TABLA EMPRESA.EMPLEADO DROP CONSTRAINT SUPERFKEMP CASCADE; (se elimina la restricción SUPERFKEMP de la relación EMPLEADO) INSERT INTO EMPLEADO VALUES (‘Ricardo’, Roca’,’Flores’,’653298653’,’30-12-1962’,’Los Jarales, 47’,’H’,’37000’, ‘653298653’,4); (añade una nueva tupla, al menos hay que añadir los que están explícitamente en la definición de tabla a NOT NULL ); INSERT INTO EMPLEADO (Nombre , Apellido1, Dno, Dni) VALUES (‘Ricardo’, ‘Roca’,’4’,’653298653’); (añade parte de una nueva tupla, los no especificados se establecen a DEFAULT o a NULL); 31 Sentencias de SQL para cambiar el Esquema INSERT INTO EMPLEADO (Nombre , Apellido1, Dno, Dni) VALUES (‘Ricardo’, ‘Roca’,’2’,’653298653’); (Si el SGDB realiza la integridad referencial, se rechaza el comando); ¿Por qué? INSERT INTO EMPLEADO (Nombre , Apellido1, Dno) VALUES (‘Ricardo’, ‘Roca’,’4’); (Si el SGDB realiza la comprobación NOT NULL de ‘Dni’ no proporcionada y se rechaza el comando); UPDATE PROYECTO SET UbicaciónProyecto=‘Valencia’, NumDptoProyecto = 5 WHERE NumProyecto=10; UPDATE Empleado SET Sueldo=Sueldo*1.1 WHERE Dno IN (SELECT NumeroDpto FROM DEPARTAMENTO WHERE NombreDpto=‘Investigación’); IN vamos a utilizarlo en consultas anidadas también. TRUNCATE tabla; (quita todas las filas de una tabla, pero permanecen la estructura y sus columnas, las restricciones, los índices, etc. Para quitar la definición de tabla además de los datos: DROP TABLE) 32 Transacciones en SQL: BEGIN, COMMIT Todo SGDB maneja transacciones: Conjunto de acciones sobre una BD que altera los datos (INSERT INTO, UPDATE, DELETE, etc.) pero que deben ser realizados de manera atómica (para evitar concurrencia de usuarios, por ejemplo). BEGIN, COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK TO, RELEASE SAVEPOINT. La documentación la podéis encontrar en el manual de POSTGRESQL: – http://www.postgresql.org/docs/10/static/sql-begin.html 33 Transacciones en SQL: BEGIN, COMMIT Un ejemplo: BEGIN; Secuencia de comandos que alteran una BD determinada COMMIT; (este comando finaliza las transacciones haciendo los cambios permanentes y visibles a todos los usuarios) BEGIN inicia un bloque de transacción, es decir, todas las declaraciones después de un comando BEGIN se ejecutarán en una sola transacción hasta que de manera explícita haya un COMMIT (plasma todos los cambios en la BD) o un ROLLBACK (deshace todos los cambios). 34 Transacciones en SQL: ROLLBACK La transacción puede dar un error entre medias, para ello esta el comando ROLLBACK: BEGIN; Secuencia de comandos que alteran una BD determinada y en un punto determinado se genera un error ROLLBACK; (este comando vuelve al BEGIN deshace todos los cambios) Empiezas a hacer de nuevo los cambios, excepto el que te daba error. COMMIT; 35 Transacciones en SQL: SAVEPOINT Con el comando SAVEPOINT, también puedes grabar puntos interesantes intermedios, por si se produce un error inesperado y no tengas que volver al principio y así aproveches algunos cambios realizados: BEGIN; Secuencia de comandos que alteran una BD SAVEPOINT misavepoint Secuencia de comandos que alteran una BD y en un punto determinado se genera un error ROLLBACK TO misavepoint; Secuencia nueva de comandos que alteran una BD COMMIT; 36 Transacciones en SQL: RELEASE SAVEPOINT Sirve para indicar que la aplicación ya no desea mantener el punto de salvaguarda especificado. Después de invocar esta sentencia, ya no es posible hacer una retrotracción hasta el punto de salvaguarda. BEGIN; Secuencia de comandos que alteran una BD SAVEPOINT misavepoint 1 Secuencia de comandos que alteran una BD SAVEPOINT misavepoint 2 Secuencia de comandos que alteran una BD RELEASE SAVEPOINT misavepoint2; COMMIT; 37 Transacciones en SQL: ejemplos Para establecer un punto de salvaguarda y luego deshacer los efectos de todos los comandos ejecutados después de su creación, la transacción insertará los valores 1 y 3, pero no 2.: BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); ROLLBACK TO SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); COMMIT; 38 Transacciones en SQL: ejemplos Establecer y posteriormente destruir un punto de salvaguarda, la transacción insertará tanto 3 y 4: BEGIN; INSERT INTO table1 VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (4); RELEASE SAVEPOINT my_savepoint; COMMIT; 39 Más Ejemplos INSERT INTO Artista VALUES (1, 'The Beatles', 'UK'); INSERT INTO Artista VALUES (2, 'The Rolling Stones', 'UK'); INSERT INTO Artista (id, nombre) VALUES (3, 'David Bowie'); INSERT INTO Cancion VALUES (1, 'Norwegian wood', 'Pop', '125', '1965-03-12', 1); INSERT INTO Cancion VALUES (2, 'Here, there and everywhere', 'Pop', '145', '1966-08-05', 1); INSERT INTO Cancion VALUES (3, 'Jumping jack flash', 'Pop', '225', '1968-04-20', 2); INSERT INTO Usuario VALUES ('lola', 'Dolores', 'lola@gmail.com'); INSERT INTO Usuario VALUES ('pepe', 'José', 'jose@gmail.com'); INSERT INTO Usuario VALUES ('chema', 'José María', 'chema@gmail.com'); INSERT INTO Usuario VALUES ('charo', 'Rosario', 'rosario@gmail.com'); 40 INSERT INTO Contacto VALUES ('pepe', 'lola'), ('charo', 'pepe'), ('chema', 'charo'); INSERT INTO Escucha VALUES ('charo', 2, '2011-09-09 16:57:54'); INSERT INTO Escucha VALUES ('pepe', 3, '2011-09-12 21:15:30'); UPDATE Artista SET nacionalidad = 'UK' WHERE nombre = 'David Bowie'; UPDATE Album SET precio = precio * 1.2; DELETE FROM Escucha WHERE instante < '2000-01-01 00:00:00'; Más Ejemplos 41 Consultas en SQL SELECT [DISTINCT] campos FROM tablas [WHERE condición]; Consulta A SELECT FechaNac, Dirección FROM EMPLEADO WHERE Nombre=‘Jose’ AND Apellido1=‘Pérez’ AND Apellido2=‘Pérez’; Otras consultas: SELECT titulo, genero FROM Cancion WHERE fecha < '1967-01-01'; SELECT DISTINCT nacionalidad FROM Artista; (solo las tuplas diferentes permanecen en el resultado, en contraposición a SELECT ALL) SELECT * FROM Cancion, Artista WHERE Cancion.autor = Artista.id AND Artista.nacionalidad = 'UK'; SELECT dni, teoria * 0.6 + practicas * 0.4 FROM Notas; 42 Consultas en SQL sencillas Ejemplo 1 SELECT "FechaNac", "Direccion" FROM "EMPLEADO" WHERE "Nombre"='Jose' AND "Apellido1"='Perez' AND "Apellido2"='Perez'; Ejemplo 2 SELECT * FROM "EMPLEADO" WHERE "Nombre"='Jose' AND "Apellido1"='Perez' AND "Apellido2"='Perez'; Ejemplo 3 SELECT * FROM "EMPLEADO" WHERE "Sexo"='M'; 43 Consultas en SQL sencillas Ejemplo 4 SELECT "Sexo" FROM "EMPLEADO"; Ejemplo 5 SELECT DISTINCT "Sexo" FROM "EMPLEADO"; Ejemplo 6 SELECT "Nombre", "Apellido1", "Direccion" FROM "EMPLEADO", "DEPARTAMENTO" WHERE "NombreDpto"='Investigacion' AND "Dno"="NumeroDpto"; Ejemplo 7 SELECT "EMPLEADO"."Nombre", "EMPLEADO"."Apellido1", "EMPLEADO"."Direccion" FROM "EMPLEADO", "DEPARTAMENTO" WHERE "EMPLEADO"."Dno"="DEPARTAMENTO"."NumeroDpto" AND "DEPARTAMENTO"."NombreDpto"='Investigacion'; 44 Consultas en SQL (INNER JOIN) Consulta B SELECT Nombre, Apellido1, Dirección FROM EMPLEADO, DEPARTAMENTO (o de manera explicita FROM EMPLEADO INNER JOIN DEPARTAMENTO ON NumeroDpto =Dno ) WHERE NombreDpto=‘Investigación’ AND NumeroDpto =Dno; (selección-proyección-concatenación, Álgebra relacional) Consulta C SELECT NumProyecto, NumDptoProyecto, Apellido1, Dirección, FechaNac FROM PROYECTO, DEPARTAMENTO, EMPLEADO WHERE NumDptoProyecto =NumeroDpto AND DniDirector=Dni AND UbicacionProyecto=‘Gijon’; (selección-proyección-2 condiciones de concatenación, Álgebra relacional) 45 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 46 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 47 Concatenación de Tablas, Join SELECT campos FROM tabla1 JOIN tabla2 ON condición [WHERE condición]; (JOIN: Concepto de tabla concatenada o relación concatenada) Consulta B SELECT Nombre, Apellido1, Dirección FROM (EMPLEADO JOIN DEPARTAMENTO ON Dno= NumeroDpto) WHERE NombreDpto=‘Investigación’; Uso típico (pero no sólo) con claves externas: ON externa = primaria SELECT titulo FROM Cancion, Escucha WHERE usuario='lola'; SELECT titulo FROM (Cancion JOIN Escucha ON cancion = id); SELECT * FROM (Contacto JOIN Usuario ON (usuario1 = nick OR usuario2 = nick)) WHERE nombre = 'Rosario'; (ver tablas siguientes) 48 CREATE TABLE Usuario ( nick varchar(30) PRIMARY KEY, nombre text NOT NULL, email text NOT NULL UNIQUE ); CREATE TABLE Contacto ( usuario1 varchar(30) REFERENCES Usuario (nick), usuario2 varchar(30) REFERENCES Usuario (nick), PRIMARY KEY (usuario1,usuario2) ); Tablas 49 Ejemplos de Consultas en SQL: Join Ejemplo 6 SELECT "Nombre", "Apellido1", "Direccion" FROM "EMPLEADO", "DEPARTAMENTO" WHERE "NombreDpto"='Investigacion' AND "Dno"="NumeroDpto"; Ejemplo 7 SELECT "EMPLEADO"."Nombre", "EMPLEADO"."Apellido1", "EMPLEADO"."Direccion" FROM "EMPLEADO", "DEPARTAMENTO" WHERE "EMPLEADO"."Dno"="DEPARTAMENTO"."NumeroDpto" AND "DEPARTAMENTO"."NombreDpto"='Investigacion'; Ejemplo 8 SELECT "Nombre", "Apellido1", "Direccion" FROM "EMPLEADO" INNER JOIN "DEPARTAMENTO" ON "Dno"="NumeroDpto" WHERE "NombreDpto"='Investigacion'; 50 Ejemplos de Consultas en SQL: Join Ejemplo 9 SELECT "Nombre", "Apellido1", "Direccion" FROM "EMPLEADO" JOIN "DEPARTAMENTO" ON "Dno"="NumeroDpto"; Ejemplo 10 SELECT * FROM "EMPLEADO" JOIN "DEPARTAMENTO" ON "Dno"="NumeroDpto"; Ejemplo 11 SELECT * FROM "EMPLEADO" INNER JOIN "DEPARTAMENTO" ON "Dno"="NumeroDpto"; 51 Concatenación de Tablas, Join Consulta B SELECT Nombre, Apellido1, Dirección FROM (EMPLEADO NATURAL JOIN (DEPARTAMENTO AS DEPT(NombreDpto, Dno, DniDirector,FechaIngresoDirector))) WHERE NombreDpto=‘Investigación’; (Antes de hacer el NATURAL JOIN si los nombres de los atributos de concatenación no coinciden en las relaciones base, se renombran para que coincidan, a través de AS para renombrar la relación. En este caso en la tabla DEPARTAMENTO NumeroDpto se renombra a Dno para el NJ) Realmente AS se puede utilizar para definir un ALIAS, lo veremos más adelante. OJO: En SQL se pueden utilizar el mismo nombre para dos o más atributos siempre que se encuentren en relaciones diferentes. Para eso están los alias o variables de tupla, (ejemplos a continuación). 52 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO Con AS pasa a Dno 53 Nombres de Atributos, Alias y Variables de Tupla. Consulta D SELECT E.Nombre, E.Apellido1, S.Nombre, S.Apellido1 FROM EMPLEADO AS E, EMPLEADO AS S WHERE E.SuperDni=S.Dni; Por cada empleado se recupera el nombre y primer apellido del mismo y el nombre y primer apellido de su supervisor inmediato. La tabla E se va a utilizar como tabla para extraer la información de los empleados que son supervisados. La tabla S se utiliza para extraer la información de los empleados supervisores. Darse cuenta que las tablas E y S son copias de la tabla empleado. Consulta D (notación reducida) SELECT E.Nombre, E.Apellido1, S.Nombre, S.Apellido1 FROM EMPLEADO E, EMPLEADO S WHERE E.SuperDni=S.Dni; 54 Nombres de Atributos, Alias y Variables de Tupla. Resultado Consulta D (notación reducida) SELECT "E"."Nombre", "E"."Apellido1", "S"."Nombre", "S"."Apellido1" FROM "EMPLEADO" "E", "EMPLEADO" "S" WHERE "E"."SuperDni"="S"."Dni"; 55 Tipos de join INNER Por defecto (no hace falta ponerlo) NATURAL La condición consiste en igualdad entre la combinación de los campos que se llamen igual entre ambas tablas (EQUIJOIN) (no se repiten los campos) LEFT | RIGHT | FULL Se añaden también filas que no cumplen la condición (incompatible con INNER)(OUTER JOIN) – R (->< Dni=DniDirector) S (LEFT OUTER JOIN, mantiene cada tupla de la relación izquierda aunque no se encuentre ninguna tupla en S que cumple la conexión, esos atributos se rellenan a NULL) – R (><- Dni=DniDirector) S (RIGHT OUTER JOIN, mantiene cada tupla de la relación derecha aunque no se encuentre ninguna tupla en R que cumple la conexión, esos atributos se rellenan a NULL) (nota recordatorio: explicar en la pizarra gráficamente con conjuntos) 56 Ejemplos de Consultas en SQL: Join Ejemplo 12 SELECT * FROM "EMPLEADO" LEFT JOIN "DEPARTAMENTO" ON "Dno"="NumeroDpto"; Ejemplo 13 SELECT * FROM "EMPLEADO" LEFT JOIN "DEPARTAMENTO" ON "Dni"="DniDirector"; Ejemplo 14 SELECT * FROM "EMPLEADO" RIGHT JOIN "DEPARTAMENTO" ON "Dni"="DniDirector"; 57 Ejemplos de Consultas en SQL: Join Ejemplo 12 SELECT * FROM "EMPLEADO" LEFT JOIN "DEPARTAMENTO" ON "Dno"="NumeroDpto"; 58 Ejemplos de Consultas en SQL: Join Ejemplo 13 SELECT * FROM "EMPLEADO" LEFT JOIN "DEPARTAMENTO" ON "Dni"="DniDirector"; 59 Ejemplos de Consultas en SQL: Join Ejemplo 14 SELECT * FROM "EMPLEADO" RIGHT JOIN "DEPARTAMENTO" ON "Dni"="DniDirector"; 60 Ejemplos de Consultas en SQL: Join Ejemplo 15 SELECT "NumProyecto", "NumDptoProyecto", "Apellido1", "Direccion", "FechaNac" FROM "PROYECTO", "DEPARTAMENTO", "EMPLEADO" WHERE "NumDptoProyecto"="NumeroDpto" AND "DniDirector"="Dni" AND "UbicacionProyecto"='Gijon'; Ejemplo 16 SELECT * FROM "PROYECTO", "DEPARTAMENTO", "EMPLEADO" WHERE "NumDptoProyecto"="NumeroDpto" AND "DniDirector"="Dni"; 61 Ejemplos de Consultas en SQL: AS Ejemplo 18 SELECT "Nombre", "Apellido1", "Direccion" FROM "EMPLEADO" NATURAL JOIN "DEPARTAMENTO" AS "DEPT"("NombreDpto","Dno","DniDirector","FechaIngresoDirector") WHERE "NombreDpto"='Investigacion'; Ejemplo 19 SELECT * FROM "EMPLEADO" NATURAL JOIN "DEPARTAMENTO" AS "DEPT"("NombreDpto","Dno","DniDirector","FechaIngresoDirector"); Ejemplo 20 SELECT "E"."Nombre", "E"."Apellido1", "S"."Nombre", "S"."Apellido1" FROM "EMPLEADO" AS "E", "EMPLEADO" AS "S" WHERE "E"."SuperDni"="S"."Dni"; 62 Más ejemplos de join CREATE TABLE Alumno ( dni VARCHAR(12) PRIMARY KEY, nombre text); CREATE TABLE Asignatura ( codigo NUMERIC PRIMARY KEY, nombre text); CREATE TABLE Notas ( dni VARCHAR(12) REFERENCES Alumno(dni), codigo NUMERIC REFERENCES Asignatura(codigo), teoria NUMERIC (4,2), practicas NUMERIC (4,2), PRIMARY KEY (dni, codigo)); SELECT nombre, teoria FROM Notas NATURAL JOIN Asignatura; SELECT nombre, teoria FROM Notas JOIN Asignatura ON Notas.codigo = Asignatura.codigo; Recordar la notación: ON externa = primaria 63 Mas Alias SELECT campos FROM tabla AS alias [(alias-campo1, alias-campo2, …)] [WHERE condición]; SELECT campo AS alias FROM … Ejemplos: SELECT dni, teoria * 0.6 + practicas * 0.4 as media FROM Notas; SELECT u1.nombre FROM Usuario AS u1, Usuario AS u2 WHERE u1.nombre = u2.nombre AND u1.nick <> u2.nick; (ver tablas anteriores y siguientes) 64 CREATE TABLE Usuario ( nick varchar(30) PRIMARY KEY, nombre text NOT NULL, email text NOT NULL UNIQUE ); CREATE TABLE Contacto ( usuario1 varchar(30) REFERENCES Usuario (nick), usuario2 varchar(30) REFERENCES Usuario (nick), PRIMARY KEY (usuario1,usuario2) ); Tablas 65 Consultas anidadas Son conexiones entre consultas a través del operador de comparación normalmente IN. SELECT campos FROM tabla WHERE campo1, campo2, … IN (SELECT campo1, campo2, …); Ejemplo: (selecciona los números de proyectos que tienen Pérez como director) SELECT DISTINCT NumProyecto FROM PROYECTO WHERE NumProyecto IN (SELECT NumProyecto FROM PROYECTO, DEPARTAMENTO, EMPLEADO WHERE NumDptoProyecto =NumeroDpto AND DniDirector=Dni AND Apellido1=‘Pérez’;) (Con la palabra clave DISTINCT eliminamos las tuplas iguales, solo permanecen en el resultado las tuplas distintas) 66 Consultas anidadas (más opciones) SELECT campos FROM tabla WHERE campo comparación (SOME | ALL) (SELECT …); SELECT campos FROM tabla WHERE EXISTS (SELECT …); SELECT campos FROM tabla WHERE (SELECT …) CONTAINS (SOME | ALL) (SELECT …); 67 Consultas anidadas Ejemplo SELECT u2.nombre FROM Usuario AS u1, Usuario as u2 WHERE (u1.nick, u2.nick) IN ((SELECT usuario1, usuario2 FROM Contacto) UNION (SELECT usuario2, usuario1 FROM Contacto)) AND u1.nombre = 'Rosario'; 68 Ejemplos de Consultas anidadas Ejemplo 26 (Características de proyectos que tienen a Campos como director) SELECT * FROM "PROYECTO" WHERE "NumProyecto" IN (SELECT "NumProyecto" FROM "PROYECTO", "DEPARTAMENTO", "EMPLEADO" WHERE "NumDptoProyecto"="NumeroDpto" AND "DniDirector"="Dni" AND "Apellido1"='Campos'); 69 Ejemplos de Consultas anidadas Ejemplo 27 (Todos los empleados que NO trabajen en el proyecto 2, con la operación resta algebraica, EXCEPT) SELECT "EMPLEADO"."Nombre", "EMPLEADO"."Apellido1", "EMPLEADO"."Apellido2" FROM "EMPLEADO", "TRABAJA_EN" WHERE "EMPLEADO"."Dni"="TRABAJA_EN"."DniEmpleado" EXCEPT (SELECT "EMPLEADO"."Nombre", "EMPLEADO"."Apellido1", "EMPLEADO"."Apellido2" FROM "EMPLEADO", "TRABAJA_EN" WHERE "EMPLEADO"."Dni"="TRABAJA_EN"."DniEmpleado" AND "TRABAJA_EN"."NumProy"='2'); Son todos los que trabajan en el proyecto 2 70 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 71 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 72 Ejemplos de Consultas anidadas Ejemplo 29 (Enumere el nombre de todos los empleados que trabajan en algún proyecto controlado por el departamento 5. El segundo SELECT me proporciona los números de proyecto que controla el departamento 5) SELECT DISTINCT "EMPLEADO"."Nombre" FROM "TRABAJA_EN", "EMPLEADO" WHERE "EMPLEADO"."Dni"="TRABAJA_EN"."DniEmpleado" AND "TRABAJA_EN"."NumProy" IN (SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO" WHERE "PROYECTO"."NumDptoProyecto"='5'); 73 Consultas anidadas (detalle IN) Enumere el nombre de todos los empleados que trabajan en algún proyecto controlado por el departamento 5. El segundo SELECT me proporciona los números de proyecto que controla el departamento 5. 74 Consultas anidadas (detalle IN) La palabra clave IN equivale a establecer condiciones sobre un mismo campo conectadas por el operador OR. 75 Ejemplos de Consultas anidadas Ejemplo 30-A (Obtener una lista de los números de los proyectos que impliquen a cualquier empleado cuyo primer apellido sea ‘Campos’, independientemente de que sean trabajadores o directores del departamento que gestiona dicho proyecto): SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO" WHERE "PROYECTO"."NumProyecto" IN (SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO", "DEPARTAMENTO", "EMPLEADO" WHERE "PROYECTO"."NumDptoProyecto"="DEPARTAMENTO"."NumeroDpto" AND "DEPARTAMENTO"."DniDirector"="EMPLEADO"."Dni" AND "Apellido1"='Campos') OR "PROYECTO"."NumProyecto" IN (SELECT "TRABAJA_EN"."NumProy" FROM "TRABAJA_EN", "EMPLEADO" WHERE "TRABAJA_EN"."DniEmpleado"="EMPLEADO"."Dni" AND "Apellido1"='Campos'); Directores Empleados 76 Consultas anidadas Obtener una lista de los números de los proyectos que impliquen a cualquier empleado cuyo primer apellido sea ‘Campos’, independientemente de que sean trabajadores o directores del departamento que gestiona dicho proyecto: Directores Empleados 77 Álgebra de conjuntos consulta1 UNION consulta2 consulta1 INTERSECT consulta2 consulta1 EXCEPT consulta2 Tuplas homogéneas: los conjuntos de tuplas tienen que tener los mismos campos Aplica un DISTINCT implícito (a menos que indiquemos ALL) Ejemplo: (SELECT usuario2 FROM Contacto WHERE usuario1 = 'charo' UNION SELECT usuario1 FROM Contacto WHERE usuario2 = 'charo') INTERSECT (SELECT usuario2 FROM Contacto WHERE usuario1 = 'lola' UNION SELECT usuario1 FROM Contacto WHERE usuario2 = 'lola') 78 Ejemplos de Consultas anidadas Ejemplo 30-B (Obtener una lista de los números de los proyectos que impliquen a cualquier empleado cuyo primer apellido sea ‘Campos’, independientemente de que sean trabajadores o directores del departamento que gestiona dicho proyecto): También se puede hacer con UNION: SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO" WHERE "PROYECTO"."NumProyecto" IN ((SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO", "DEPARTAMENTO", "EMPLEADO" WHERE "PROYECTO"."NumDptoProyecto"="DEPARTAMENTO"."NumeroDpto" AND "DEPARTAMENTO"."DniDirector"="EMPLEADO"."Dni" AND "Apellido1"='Campos') UNION (SELECT "TRABAJA_EN"."NumProy" FROM "TRABAJA_EN", "EMPLEADO" WHERE "TRABAJA_EN"."DniEmpleado"="EMPLEADO"."Dni" AND "Apellido1"='Campos')); 79 Orden, agregación SELECT COUNT (campos) FROM tabla … [GROUP BY campo1, campo2, …]; SELECT SUM | MAX | MIN | AVG (campo) FROM tabla … [GROUP BY campo1, campo2, …]; SELECT … [ORDER BY campo1, campo2, …]; 80 Orden, agregación Ejemplos: SELECT COUNT (*) FROM Escucha JOIN Cancion ON cancion = id WHERE titulo = 'Norwegian Wood'; SELECT autor, COUNT (*) FROM Escucha JOIN Cancion ON cancion = id GROUP BY autor; SELECT * FROM Usuario WHERE (SELECT COUNT (*) FROM Contacto WHERE usuario1 = nick OR usuario2 = nick) > 2; SELECT * FROM Usuario ORDER BY (SELECT COUNT (*) FROM Contacto WHERE usuario1 = nick OR usuario2 = nick); 81 Orden, agregación 82 Orden y agregación Ejemplos de funciones agregadas, COUNT, SUM, MAX, MIN y AVG: La función COUNT devuelve el número de tuplas o valores especificados en una consulta. Las funciones SUM, MAX, MIN y AVG se aplican a un conjunto o multiconjunto de valores numéricos. SELECT SUM("EMPLEADO"."Sueldo"), MAX("EMPLEADO"."Sueldo"), MIN("EMPLEADO"."Sueldo"), AVG("EMPLEADO"."Sueldo") FROM "EMPLEADO" 83 Orden y agregación Consulta 20 Visualizar la suma de los salarios de todos los empleados del departamento ‘Investigación’, así como el salario más alto, el salario más bajo, y el salario medio de este departamento; SELECT SUM("EMPLEADO"."Sueldo"), MAX("EMPLEADO"."Sueldo"), MIN("EMPLEADO"."Sueldo"), AVG("EMPLEADO"."Sueldo") FROM "EMPLEADO" JOIN "DEPARTAMENTO" ON "Dno" = "NumeroDpto" WHERE "NombreDpto"='Investigacion'; 84 Orden y agregación Consulta 21. Recuperar el número total de empleados de la empresa: SELECT COUNT (*) FROM “EMPLEADO”; 85 Orden y agregación Consulta 22. Recuperar el número de empleados del departamento ‘investigación’: SELECT COUNT (*) FROM "EMPLEADO" , "DEPARTAMENTO" WHERE "Dno" = "NumeroDpto" AND "NombreDpto"='Investigacion'; 86 Orden y agregación Consulta 23-a. Contar el número de sueldos diferentes almacenados en la base de datos: SELECT COUNT (DISTINCT "Sueldo") FROM "EMPLEADO"; 87 Orden y agregación Consulta 23-b. Consulta anidada correlacionada con la función agregada: La siguiente consulta anidada recupera los nombres de todos los empleados que tienen dos o más subordinados: SELECT "Apellido1", "Nombre" FROM "EMPLEADO" WHERE (SELECT COUNT (*) FROM "SUBORDINADO" WHERE "EMPLEADO"."Dni"= "SUBORDINADO"."DniEmpleado") >= 2; 88 Orden y agregación Consulta 23-b. Salida del segundo SELECT, pero hay que meter “EMPLEADO” en FROM SELECT * FROM "SUBORDINADO", "EMPLEADO" WHERE "EMPLEADO"."Dni"="SUBORDINADO"."DniEmpleado"; Hay solo dos empleados que tienen dos o más subordinados, rodeados por los dos círculos rojos. 89 Orden y agregación Consulta 24. Consulta anidada correlacionada con la función agregada: La siguiente consulta anidada recupera los nombres de todos los empleados que tienen dos o más subordinados: SELECT "Dno", COUNT(*), AVG("Sueldo") FROM "EMPLEADO" GROUP BY "Dno"; 90 Orden y agregación: GROUP BY (dos atributos)Consulta 25. Por cada proyecto, recuperar el número de proyecto, el nombre de proyecto y el número de empleados que trabajan en ese proyecto: SELECT "NumProyecto", "NombreProyecto", COUNT(*) FROM "PROYECTO", "TRABAJA_EN" WHERE "NumProyecto" = "NumProy" GROUP BY "NumProyecto", "NombreProyecto"; 91 Orden, agregación 92 Orden, agregación Que sucede si no agrupo!!!! 93 Orden y agregación: GROUP BY (dos atributos)Consulta 26. Por cada proyecto en el que trabajan más de dos empleados, recuperar el número el nombre y número de empleados que trabajan para el: SELECT "NumProyecto", "NombreProyecto", COUNT(*) FROM "PROYECTO", "TRABAJA_EN" WHERE "NumProyecto" = "NumProy" GROUP BY "NumProyecto", "NombreProyecto" HAVING COUNT(*) > 2; Estos grupos no se seccionan con HAVING, por lo tanto el GROUP BY solo actuaría sobre el resto de los grupos. 94 Orden y agregación Consulta 27. Por cada proyecto, recuperar el número, el nombre y la cantidad de empleados del departamento 5 que trabajan en dicho proyecto: SELECT "NumProyecto", "NombreProyecto", COUNT(*) FROM "PROYECTO", "TRABAJA_EN" , "EMPLEADO" WHERE "NumProyecto" = "NumProy" AND "Dni" = "DniEmpleado" AND "Dno" = 5 GROUP BY "NumProyecto", "NombreProyecto" 95 Orden y agregación Consulta 28. Por cada departamento que tiene más de 2 empleados, recuperar el número de departamento y el número de empleados que ganan mas de 40000: SELECT "NumeroDpto", COUNT(*) FROM "DEPARTAMENTO", "EMPLEADO" WHERE "NumeroDpto" = "Dno" AND "Sueldo" > 40000 AND "Dno" IN (SELECT "Dno" FROM "EMPLEADO" GROUP BY "Dno" HAVING COUNT(*) > 2) GROUP BY "NumeroDpto"; 96 Ejemplos de orden y agregación Ejemplo 29 (El empleado que más horas trabaja en un proyecto) SELECT "EMPLEADO"."Nombre", "TRABAJA_EN"."Horas" FROM "EMPLEADO", "TRABAJA_EN" WHERE "EMPLEADO"."Dni"="TRABAJA_EN"."DniEmpleado" AND "TRABAJA_EN"."Horas" IS NOT NULL ORDER BY "TRABAJA_EN"."Horas" DESC Limit 1; Ejemplo 32 (Por cada proyecto recuperar el número de proyecto, el nombre del proyecto y el numero de empleados que trabajan en el proyecto) SELECT "PROYECTO"."NumProyecto", "PROYECTO"."NombreProyecto", COUNT(*) FROM "PROYECTO", "TRABAJA_EN" WHERE "TRABAJA_EN"."NumProy"="PROYECTO"."NumProyecto" GROUP BY "PROYECTO"."NumProyecto", "PROYECTO"."NombreProyecto" 97 Vistas CREATE VIEW nombre AS SELECT…; Dan un nombre a una consulta, permiten usarla como tabla Útil para reutilizar consultas y evitar ejecutarlas varias veces Pueden configurarse para que se almacenen en disco Ejemplos: CREATE VIEW Contactos_Usuario AS SELECT u1.nick, u2.nombre FROM Usuario AS u1, Usuario as u2 WHERE (u1.nick, u2.nick) IN ((SELECT usuario1, usuario2 FROM Contacto) UNION (SELECT usuario2, usuario1 FROM Contacto)); SELECT nombre FROM Contactos_Usuario WHERE nick = 'pepe'; 3-ER-EDAT-121.pdf E/R (Cap 3 - Elmasri 5ª edición, Cap 4 es el EER, se aconseja lectura) Recopilación y Análisis de Requisitos Ejemplo - BDs - EMPRESA Los diseñadores de la base de datos proporcionan la siguiente descripción del minimundo (la parte de la empresa que se va a representar en la base de datos): 1. La empresa está organizada en departamentos. Cada uno tiene un nombre único, un número único y un empleado concreto que lo administra. Se realizará un seguimiento de la fecha en que ese empleado empezó a administrar el departamento. Un departamento puede tener varias ubicaciones. 2. Un departamento controla una cierta cantidad de proyectos, cada uno de los cuales tiene un nombre único, un número único y una sola ubicación. Recopilación y Análisis de Requisitos Ejemplo - BDs - EMPRESA Los diseñadores de la base de datos proporcionan la siguiente descripción del minimundo (la parte de la empresa que se va a representar en la base de datos): 3. Almacenaremos el nombre, el documento nacional de identidad, la dirección, el sueldo, el sexo y la fecha de nacimiento de cada empleado. Un empleado está asignado a un departamento, pero puede trabajar en varios proyectos, que no están controlados necesariamente por el mismo departamento. Se hará un seguimiento del número de horas por semana que un empleado trabaja en cada proyecto. También se realizará el seguimiento del supervisor directo de cada empleado. 4. También se desea realizar un seguimiento de las personas a cargo de cada empleado por el tema de los seguros. Por cada persona a cargo o subordinado, se registrará su nombre de pila, sexo, fecha de nacimiento y relación con el empleado. 5. Mas todos los requisitos funcionales de extracción de información. Modelo conceptual E-R • Entidad: Objeto del mundo real con existencia independiente • Físico: persona, coche, casa, empleado etc. • Conceptual: puesto de trabajo, etc. • Relación: Es un vínculo que nos permite definir una dependencia entre varia entidades. • Atributos: Las diferentes propiedades que pueden tener la entidades. • Atómicos o compuestos • Monoevaluados o multievaluados • Almacenados o derivados • NULL • Complejos • Etc. Modelo E/R EMPLEADO Dirección DNI 1 CONTROLA PROYECTO DEPARTAMENTO Nombre Número Ubicaciones 1 N Ubicación Número Nombre TRABAJA_EN NM Horas TRABAJA_PA RA ADMINISTRA 11 N NumEmpleados FechaInicio FechaNac Nombre Sueldo NombreP Apellido1 Apellido2 Sexo CONTROL 1 N Supervisor Supervisado SUBORDINAD OS_DE SUBORDINADO N 1 Nombre Sexo FechaNac Relación Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO TRABAJA_PARA 1:N Numero de relaciones ri en el que puede participar cada ei → 1 Participación completa ==== (todos los empleados trabajan en algún departamento). Numero de relaciones ri en el que puede participar cada di → N NOTA: En el esquema E/R va al contrario N:1 1:N -> Una entidad en EMPLEADO se relaciona exclusivamente con una entidad en DEPARTAMENTO. Pero una entidad en DEPATAMENTO se puede relacionar con 1 o muchas entidades en EMPLEADO (participación completa en este caso en los dos lados NOTA: Se dice N empleados trabajan para un departamento , por eso en el modelo E/R se escribe al contrario N:1 EMPLEADO DEPARTAMENTO Dado un conjunto de relaciones binarias y los conjuntos de entidades A y B, la correspondencia de cardinalidades puede ser: UNO a UNO: 1:1 -> Una entidad de A se relaciona únicamente con una entidad en B y viceversa. UNO a VARIOS: 1:N -> Una entidad en A se relaciona exclusivamente con una entidad en B. Pero una entidad en B se puede relacionar con 0 o muchas entidades en A. VARIOS a UNO: N:1 -> Una entidad en A se relaciona con cero o muchas entidades en B. Pero una entidad en B se relaciona con una única entidad en A. VARIOS a VARIOS: N:M -> Una entidad en A se puede relacionar con 0 o muchas entidades en B y viceversa. Correspondencia de cardinalidades 1: Supervisor 2: Supervisado CONTROL es una relación recursiva dentro De la misma entidad EMPLEADO 1:1Participación parcial: NO todas las entidades individuales (ei) de EMPLEADO participan de las instancias (ri) de la relación ADMINISTRA Participación total: todas las entidades individuales (di) de DEPARTAMENTO participan de las instancias (ri) de la relación ADMINISTRA M:N 4-MR-EDAT-121.pdf MR y su mapeo desde E-R (Cap 5 y 7 - Elmasri 5ª edición) Modelo Relacional • Fue presentado por Ted Codd de IBM en 1970. • Utiliza el concepto de relación matemática como bloque de construcción básica. • Su base teórica es la teoría de conjuntos de la lógica de predicado de primer orden. • LA BD se presenta como una colección de relaciones (semejantes a tablas). Modelo Relacional • Se define TUPLA como cada fila de la tabla. • Cada tupla representa una colección de datos relacionados entre si. • Cada tupla esta dividida n diferentes ATRIBUTOS (no pueden ser ni compuestos ni multievaluados). • Se define DOMINIO como los tipos de valores que pueden aparecer en una columna. Modelo Relacional • El ESQUEMA de una relación sirve para describir la relación: R(A1, …, An) • El GRADO de una relación es el número de atributos de su esquema. • La RELACIÓN es la tabla de tuplas. • Valores Nulos: se diseña el modelo para evitar esto Modelo Relacional: Claves • Superclave: conjunto de atributos que identifican de manera única cada fila de la relación. • Clave: conjunto de atributos mínimos que identifican de manera única cada fila de la relación. • Clave primaria: la que se escoge de la las claves candidatas • Clave externa: conjunto de atributos de una relación que forman parte de la clave de otra relación. Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO Modelo Relacional: Restricciones Es una regla que restringe los valores que puedan aparecer en una BD. Varios tipos: • Restricciones de Dominio • Restricciones de Clave • Restricciones de integridad de entidades • Restricciones de integridad referencial • Restricciones de integridad semántica Operaciones de Actualización en BD’s • Las restricciones de una BD se pueden modificar en: – Insertar: • Se puede violar todos los tipos • 2 opciones: rechazar la inserción o corregirla – Eliminar: • Se puede violar por ejemplo la integridad referencial de las FKs • 3 opciones: rechazar, tratar de propagar la eliminación eliminando las tuplas que hace referencia o modificar los valores del atributo referencia – Modificar: • Si no es PK o FK no hay problemas • Si es PK equivale a eliminar+insertar • Si es FK comprobar las restricciones de integridad referencial Modelo E/R EMPLEADO Dirección DNI 1 CONTROLA PROYECTO DEPARTAMENTO Nombre Número Ubicaciones 1 N Ubicación Número Nombre TRABAJA_EN NM Horas TRABAJA_PA RA ADMINISTRA 11 N NumEmpleados FechaInicio FechaNac Nombre Sueldo NombreP Apellido1 Apellido2 Sexo CONTROL 1 N Supervisor Supervisado SUBORDINAD OS_DE SUBORDINADO N 1 Nombre Sexo FechaNac Relación Conversión E/R a MR • Nos centraremos en como diseñar el esquema de una BD (Modelo Relacional) basándose en el esquema conceptual E/R. • Las transformaciones generales son: – Entidad -> Esquema relacional (tabla de tuplas) con la elección de una C-1º • Atributos atómicos -> Columna de la tabla • Atributos compuestos-> Varias Columnas de la tabla • Atributos multievaluado -> Nueva tabla dos columnas (C-1º de la entidad y el valor del atributo) ¿Cuál es la C-1º de la nueva tabla? – Entidad Débil -> tabla + columna con la C-1º de la entidad fuerte de la que depende. – Relación binarias -> tabla con los posibles atributos de la relación • 1:1 -> en una de las dos entidades introduces la C-1º (clave externa) de la otra (la elección minimizará el número de NULLS). Otra opción si la participación es total en los dos sentidos se realiza un tabla mezclada con las dos entidades participantes. • 1:n -> Igual que 1:1 pero identificando la entidad que participa como n para añadir la C-1º de la otra entidad (clave externa). • n:m -> se crea una tabla con las C-1ºs (claves externas) de las entidades de la relación y con los posibles atributos de la relación (reificación). ¿Cuál es la C-1º de la nueva tabla? – Relaciones n-arias (n>2) -> tabla con una columna para cada atributo de las C-1ºs (claves externas) de las entidades + posibles atributos de la relación. Conversión E/R a MR: proceso ordenado 1. Mapeado de los tipos de entidades regulares (EMPLEADO, DEPARTAMENTO, PROYECTO) 2. Mapeado de los tipos de entidades débiles (SUBORDINADO) 3. Mapeado de los tipos de relación 1:1 (ADMINISTRA) – Metodología clave externa (minimizar NULLs) (siempre utilizaremos esta) – Metodología de relación mezclada (participación parcial en los sentidos y se pueden mezclar las dos entidades en una misma tabla) – Metodología de referencia cruzada (la misma que en m:n) 4. Mapeado de los tipos de relación 1:n (CONTROL, TRABAJA_PARA, CONTROLA) (minimizar NULLs y redundancia) 5. Mapeado de los tipos de relación m:n (TRABAJA_EN) 6. Mapeado de los atributos multivalor (LOCALIZACIONES_DPTO) 7. Mapeado de los tipos de la relación n-aria Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 5-DFyN-EDAT-121.pdf DFyN (Diseño de BDs) (Cap 10 - Elmasri 5ª edición y parte del Cap 11) 2 Diseño de BD Hasta ahora solo se ha utilizado el sentido común para diseñar BDs. Necesitamos algún tipo de medida formal que nos que nos indique porque el agrupamiento de atributos en el esquema de relación puede ser mejor o no. Para ello esta lo que se denomina “Bondad” de los esquemas de relación que se puede explicar a 2 niveles: – Nivel lógico: se refiere a la forma en que los usuarios interpretan el esquema y significado de los atributos y se aplica a esquemas de relaciones base y vistas (tablas virtuales, ie. una tabla que deriva de otras tablas, CREATE VIEW). – Nivel de manipulación o almacenamiento: se refiere a como se almacenan y se actualizan la tuplas de una relación. Se aplica a esquemas de relaciones base que son los que se almacenan físicamente como archivos. 3 Diseño de BD El diseño de una BD puede seguir dos metodologías: – Ascendente o diseño por sintesis (Bottom-up): parte de las relaciones básicas entre atributos individuales hacía el esquema de relación de la BD. – Descendente o diseño por análisis (Top-down): empieza con varios agrupamientos de atributos de una relación que están juntos de forma natural y luego viene la posible descomposición. La teoría descrita aquí se aplica a los dos tipos de diseño, pero en general a la descendente. En general vamos a ver: – Criterios para distinguir esquemas buenos de esquemas malos. – Dependencias Funcionales (DFs): son la principal herramienta para medir formalmente la idoneidad de las agrupaciones de atributos para formar esquemas de relación. – El uso de DFs para agrupar atributos en esquemas que estén en una determinada Forma Normal (FN). – Veremos que cuando un esquema está en su FN tiene ciertas características deseables. 4 Medidas de Calidad Informales de BDs Semántica de atributos Reducción de valores redundantes en tuplas Reducción de valores nulos en tuplas Prohibición de tuplas espurias Estas 4 medidas de calidad sobre el diseño de BDs no son independientes entre si. 5 Semántica de los Atributos de una Relación Especifica que relaciones hay entre los atributos de una tupla Cuando más fácil sea especificar la semántica de la tupla, más fácil será el diseño del esquema. Las recomendaciones son las siguientes: – El diseño del esquema se hará de modo que sea fácil explicar su significado. – Por regla general no se combinarán atributos de varios tipos de entidades en una sola relación (excepto los extrictamente necesarios, PKs) Este es un esquema fácil de explicar semánticamente 6 Semántica de los Atributos de una Relación Ejemplo del estado de la BD del esquema relacional anterior: TRABAJA_EN 7 Semántica de los Atributos de una Relación En este caso, aunque aquí la semántica es buena, se mezclan atributos de diferentes entidades: – (a) Mezcla de atributos de EMPLEADO y DEPARTAMENTO – (b) Mezcla de atributos de EMPLEADO, PROYECTO y TRABAJA_EN (hemos quitado los atributos Dirección, FechaNac y NumeroDpto para que se pueda visualizar la tabla bien en la pantalla) (a) Datos de proyecto Datos de departamento (b) EMP_DEPT EMP_PROY 8 Información Redundante en Tuplas Uno de los objetivos de las BDs (su diseño) es minimizar el espacio de almacenamiento BDs que ocupan las relaciones base. La agrupación de atributos en relaciones tiene efecto significativo sobre el espacio de almacenamiento. Si aplicamos un NJ al estado de la BD que tenemos como ejemplo a las tablas EMPLEADO >< DEPARTAMENTO obtenemos una tabla EMP_DEPT Aparece una tabla con redundancia en las tuplas. Redundancia EMP_DEPT 9 Información Redundante en Tuplas En teoría de información la redundancia es una propiedad de los mensajes, consiste en tener partes predictibles a partir del resto del mensaje y que por tanto en si mismo no aportan nueva información o repiten parte de la información ya existente. En BD’s la redundancia hace referencia al almacenamiento de los mismos datos varias veces. La redundancia puede provocar varios problemas: – Incremento de trabajo (cuando se almacena o se borra un dato hay que almacenarlo o borrarlo de varios sitios). – Derroche de espacio de almacenamiento. – Inconsistencia (cuando los datos redundantes no coinciden por una modificación parcial de los mismos). La redundancia debe eliminarse en una BD, excepto la controlada (para seguridad y no perdida de datos, para mejorar el rendimiento respecto la consulta de BDs, etc.). 10 Información Redundante en Tuplas Si ahora combinamos información de EMPLEADO, PROYECTO y TRABAJA_EN obtenemos la tabla EMP_PROY. Aparece una tabla con redundancia en las tuplas. Redundancia Redundancia EMP_PROY 11 Información Redundante en Tuplas De la tabla anterior hemos quitado los atributos Dirección, FechaNac y NumeroDpto para que se pueda visualizar la tabla bien en la pantalla. 12 Información Redundante en Tuplas: Anomalías de Actualización Obviamente uno de los problemas que surgen cuando se usan las relaciones anteriores formados por los NJs, como relaciones bases, son la anomalías de actualización que comentamos anteriormente: – Inserción: • para insertar un nuevo empleado en la tabla EMP-DEPT debemos asegurar que los datos del departamento al que pertenece son congruentes con los datos del departamento en otras tuplas. • Es difícil insertar un nuevo departamento que aún no tiene empleados (se puede hacer poniendo NULLs, pero esto tiene problemas (DNI es C-1º ya que cada tupla representa un empleado, además cuando se introduce el primer empleado del departamento hay que ponerlo en los NULLs) – Eliminación: • Si eliminamos la tupla correspondiente al último empelado de un departamento se pierde la información de ese departamento. – Modificación : • Si cambiamos el valor de uno de los atributos de un departamento, debemos actualizar todas la tuplas de todos los empleados que pertenecían a ese departamento. Por ejemplo investigación se cambia a I+D: hay que hacerlo en todas. 13 Información Redundante en Tuplas Si nos basamos en las tres anomalías anteriores, las recomendaciones serían: – Diseñar esquemas de forma que podamos evitar las anomalía anteriores. – Si hubiese anomalías indicarlo para que los programas de actualización del SGDB operen correctamente. – OJO: en ciertas ocasiones es preciso saltarse la recomendaciones para mejorar el rendimiento de ciertas consultas : • por ejemplo cuando se quiere consultar datos de departamento y empleado a la vez de manera muy intensa. • Pero para esto están las VISTAS. – En general es altamente aconsejable utilizar relaciones base LIBRES de anomalías y especificar VISTAS que incluyan atributos de distintas relaciones. 14 Valores Nulos en Tuplas Tenemos que ser conscientes que si agrupamos muchos atributos en una relación, puede que algunos de ellos que no apliquen a todas la tuplas de la relación (NULL). Los NULLs siempre tiene problemas: – Desperdicio de espacio de almacenamiento. – Como se manejan en funciones agregadas (operaciones relacionales), por ejemplo: COUNT, SUM, MAX, MIN, AVG – SELEC SUM(sueldo), MAX(sueldo), MIN(sueldo), AVG(sueldo) FROM EMPLEADO; – SELEC COUNT(*) FROM EMPLEADO; Además los nulos pueden tener múltiples interpretaciones: – El atributo no se aplica a esa tupla en cuestión. – Valor desconocidos del atributo para esa tupla. – Valor no registrado aunque se conoce. Por lo tanto tienen la misma representación pero el significado puede ser diferente. Se recomienda: – Evitar incluir atributos cuyos valores puedan ser nulos. – Si es imposible evitar nulos asegurarse que son una excepción en cierta tuplas. 15 Tuplas Espurias Supongamos que empleamos EMP_LOCS y EMP_PROJ1 como relaciones base: Esto nos hace no poder recuperar la información que había en la tabla EMPO_PROY desde esas 2 nuevas tablas . Para ello hacemos un NJ de la estas dos tablas (a través de UbicacionProyecto) 16 Tuplas Espurias Se obtienen tuplas erróneas (*) porque le NJ se hace sobre atributos que no son C- 1ºs (UbicaciónProyecto no es ni PK ni FK). 17 Tuplas Espurias La recomendación es que se diseñen esquemas sobre los cuales se pueden hacer NJ sin producir tuplas espurias, es decir que los atributos del NJ sean PK y FK. 18 Superclaves, Clave Candidata, Clave Principal, Atributos Primos Una superclave X de un esquema de la relación R={A1,…,An} es un conjunto de atributos S R con la propiedad de que no habrá un par de tuplas t1 y t2 en ningún estado de la relación permitido r de R tal que t1[X] = t2[X]. Un clave K es una superclave con la propiedad adicional de que la eliminación de cualquier atributo de K provocará que K deje de ser una superclave. Es la superclave mínima. Si un esquema de una relación tiene más de una clave cada una de ellas se llama clave candidata. Una de ellas se elige arbitrariamente como clave principal. El resto de las claves candidatas son claves secundarias. Cualquier atributo del esquema de la relación R que pertenece a una clave candidata o es una clave candidata se denomina atributo primo o primario. Un atributo no primo no es miembro de una clave candidata o no es una clave candidata. 19 Dependencias Funcionales Una dependencia funcional (DF) es una restricción implícita. Si X e Y son dos conjuntos de atributos, decimos que hay un DF de X a Y o que Y depende funcionalmente de X, si y solo si siempre que dos tuplas que coinciden en su valor X, necesariamente deben coincidir en su valor Y. Es decir, los atributos de Y están unívocamente determinados por los de X Notación: X Y (dni FechaNac, pero no FechaNac dni) 20 Dependencias Funcionales De manera más estricta: Dados dos conjuntos X e Y de atributos de un esquema de relación R, supongamos dos tuplas t1 y t2 entonces el conjunto de atributos Y depende funcionalmente del conjunto de atributos X si t1[X] = t2[X] t1[Y] = t2[Y], t1, t2 r(R), donde r(R) es un estado de la relación particular del esquema de relación. Ojo que el tener la DF X Y no supone tener Y X en R. En el ejemplo de la figura anterior las posibles DFs que tenemos son: – DF1: {Dni, NumProyecto} Horas – DF2: Dni NombreE – DF3: NumProyecto {NombreProyecto, UbicaciónProyecto} En general si X es una superclave de R X Y para cualquier conjunto de atributos Y de R. Observar que si X es una clave candidata de la relación entonces tenemos X Y para cualquier agrupación de atributos Y (ejem: en EMP_DEPT existe la DF Dni Número Dpto, pero no Número Dpto Dni , ver en la tabla). Realmente un DF la podríamos ver en la tabla como una restricción entre atributos. 21 Dependencias Funcionales: Reglas de Inferencia Las reglas de inferencia sirven para deducir o inferir nuevas dependencias funcionales a partir de un conjunto dado de dependencias. (RI1) Reflexividad: Y X |= X Y (dependencia trivial) (RI2) Aumento: { X Y } |= XZ YZ (RI3) Transitividad: { X Y, Y Z } |= X Z (RI4) Proyección: { X YZ } |= X Y (descomposición) (RI5) Aditividad: { X Y, X Z } |= X YZ (unión) (RI6) Pseudotransitividad: { X Y, WY Z } |= WX Z Obsérvese que: { X Y, Z W } NO|= XZ YW XY Z NO|= X Z F |= X Y quiere decir que la dependencia funcional X Y se infiere o se deduce del conjunto de dependencias funcionales F. 22 Dependencias Funcionales: Reglas de Inferencia RI1 especifica que un conjunto de atributos siempre se determina a si mismo o cualquiera de sus subconjuntos (obvio). Ya que RI1 genera dependencias que siempre son verdaderas estas se llaman triviales, las no triviales son el resto. RI2 o regla de aumento dice que añadir el mismo conjunto de atributos a cada lado de la dependencia genera otra dependencia válida. RI3 o regla transitiva dice que una dependencia funcional X Z en un esquema de relación R es una dependencia transitiva si existe un conjunto de atributos Y que ni es clave candidata ni es un subconjunto de una clave de R, y se cumple tanto X Y como Y Z. RI4 (regla de eliminación de atributos del lado derecho), si aplicamos esta regla repetidamente podemos descomponer la DF {X A1, …, An} en el conjunto de DFs {X A1, …, X An}. RI5(regla de unión de atributos), nos permite realizar lo contrario para combinar DFs {X A1, …, X An} en la DF {X A1, …, An}. Se puede comprobar que RI4, RI5 y RI6 se infieren usando las reglas RI1, RI2 y RI3 (reglas de inferencia de Amstrong). (ver el cap 10 del libro). 23 Dependencias Funcionales: Reglas de Inferencia de Amstrong Clausura de F (F+): el conjunto de todas las DFs que incluyen F, junto con todas la DFs que se pueden inferir desde F es lo que se llama clausura de F y se designa por F+. Amstrong (1974) demostró que las reglas RI1, RI2 y RI3 (reglas de inferencia de Amstrong) son sólidas y completas. Sólida: Dado un conjunto de DFs F especificados en un esquema de una relación R, cualquier DF que podamos inferir de F usando solo RI1, RI2 y RI3, se cumple en cada estado de la relación r de R que satisfaga las DFs de F (a partir de una DF que se cumple en R, aplicando las reglas de inferencia de Amstrong, obtenemos otra DF que se cumple en R). Completa: Usando estas reglas para inferir DFs hasta que no se pueda determinar ninguna otra entonces se genera un conjunto completo de todas las dependencias posibles que se pueden inferir a partir de F. Así la clausura de F se puede obtener con la reglas de inferencia de Amstrong (se puede obtener F+ aplicando las reglas de inferencia de Amstrong). 24 Dependencias Funcionales: Conjuntos Mínimos Dos conjuntos de dependencias F y E son equivalentes si toda dependencia de uno se puede inferir de las dependencias del otro y viceversa (es decir F+ = E+). Un conjunto de DFs de F es mínimo si: – La parte derecha de todas sus dependencias es un solo atributo. – Si eliminamos una dependencia, obtenemos un conjunto no equivalente a F. – Si eliminamos un atributo en la parte izquierda de una dependencia, obtenemos un conjunto no equivalente a F. En otras palabras: DFs en forma canónica y sin redundancias. Una cobertura mínima de un conjunto de DFs de F es un conjunto mínimo equivalente a F. 25 Dependencias Funcionales: Conjuntos Mínimos, Algoritmo Cobertura mínima (E) /* encuentra una cobertura mínima F de las DFs E */ 1. Establecer F := E /* Descomponer en dependencias sobre atributos individuales en la parte derecha (atributos redundantes) */ 2. Substituir todas las dependencias X { A1, …, An } en F por X A1, …, X An /* Eliminar atributos que sobren en las partes izquierdas (atributos redundantes) */ 3. for X A F do for atributo B X do if F – { X A } { (X – {B}) A } es equivalente a F then F := F – { X A } { (X – {B}) A } (reemplazar X A por (X – {B}) A en F) /* Eliminar dependencias que se infieren de otras (inferencia redundantes) */ 4. for X A F do if {F – { X A}} es equivalente a F then F := F – { X A} (eliminamos X A) return F 26 Ejemplo Cobertura Mínima Supongamos las DFs de E: {DF1: B A, DF2: D A, DF3: AB D}, la cobertura mínima sería: (paginas 511 y 512, Edi. 7) 1. Establecer F := E /* Descomponer en dependencias sobre atributos individuales en la parte derecha */ 2. Ya lo están. /* Eliminar atributos que sobren en las partes izquierdas (atributos redundantes) */ 3. De la única que podemos quitar es de AB D ¿Podemos quitar A o B de la parte izquierda quedando B D o A D? Es decir ¿podríamos sustituir AB D por B D o A D? Supongamos la primera DF1: B A, aumentando con B (RI2) inferimos BB AB o lo que es lo mismo B AB. Así tenemos estas dos DFs: {B AB, AB D} |= B D (RI3). Por lo tanto si sustituimos AB D por B D tenemos lo mismo, ya que B D se infiere de las dos DFs. /* Eliminar dependencias que se infieren de otras (inferencia redundantes) */ 4. Hacer notar que tenemos {B A, D A, B D}, así que {B D, D A} |= B A y esta ya está, y por lo tanto es redundante. Así F:={B D, D A} return F (es una cobertura mínima) 27 Normalización de Datos (Basadas en PKs) En 1972 Codd hace pasar un esquema de relación por una serie de comprobaciones para certificar que satisface cierta forma normal (E. F. Codd. Further Normalization of the Data Base Relational Model. IBM Research Report, San Jose, California RJ909: (1971)) Codd propone la 1ª, 2ª y 3ª Formas Normales (FNs), posteriormente Boyce y Codd proponen la BCNF (más estricta que la primera). La normalización de datos es el proceso por el cual los esquemas de relación insatisfactorios se descomponen en esquemas más pequeños con propiedades más deseables. Deseables???? El objetivo es evitar las diversas anomalías que hemos comentado anteriormente. 28 Normalización de Datos (Basadas en PKs) El proceso consiste en efectuar una serie de pruebas sobre el esquema relacional propuesto: – Si fallan las pruebas, la relación se descompone en relaciones más pequeñas que si son capaces de satisfacer las pruebas. – Por si solo las FNs no garantizan de manera absoluta un buen diseño de la BD, se tienen que cumplir otras propiedades: • Preservación de atributos. • Reunión sin perdida o reunión no aditiva (se garantiza que no hay tuplas espurias), recordar que hay que diseñar tablas sobre las que se pueda hacer un NJ sobre atributos que sean PK o FK (ESTRICTA). • Conservación de dependencias: todas la DFs están representadas en alguna relación individual tras la descomposición (SE PUEDE SACRIFICAR). Así una FN de una relación hace referencia a la FN más alta que cumple e indica el grado en la que ha sido normalizada. 29 Formas Normales Es un marco formal para el análisis de los esquemas de relación en claves y en dependencias funcionales entre sus atributos. Se pasan una serie de pruebas a los esquemas hasta normalizar al grado deseado. Son incrementales – Si se cumple la forma normal n-ésima se cumple la (n-1)-ésima 30 Formas Normales Formas normales 1ª, 2ª, 3ª, BCNF – Involucran un solo esquema – No eliminan totalmente la posibilidad de anomalías de actualización, pero las reducen a casos muy excepcionales en la práctica Formas 4ª, 5ª y 6ª – Eliminan sucesivamente más anomalías de actualización Se normaliza para evitar redundancia, mantener la integridad de los datos y mejorar el redimiendo del SGBD. 31 1ª forma normal (1NF) Decimos que un esquema está 1NF si: – Los atributos son atómicos y univaluados. – Los nombres de atributo son únicos. – No hay tuplas duplicadas (consecuencia: todo esquema tiene alguna clave). – El orden de tuplas y atributos es arbitrario . Realmente estas propiedades se considera parte inherente del modelo relacional. Aunque tenemos que hacer notar que: – SQL sólo cumple la primera de estas condiciones (el tratamiento de NULL se sale también del modelo relacional) – Se estudian alternativas como el modelo relacional anidado, que admite relaciones como valores de atributos Esta Forma Normal elimina los valores repetidos en una BD 32 1ª forma normal (1NF) (a) NO esta en 1FN, por ejemplo mirar (b)UbicacionesDpto no es un atributo atómico, en cambio en (c) SI esta en 1FN (PK es {UbicacionesDpto,NumeroDpto}) La solución (c) démonos cuenta que introduce redundancia. Si seguimos posteriormente con el proceso de normalización quitaríamos esta redundancia y nos llevaría a otra posible solución que podríamos a haber tomado: hacer una tabla independiente. 33 1ª forma normal (1NF) ¿Como hacemos una tabla independiente?: sería quitar el atributo UbicacionesDpto (es el atributo que infringe 1NF) y se pone en una tabla aparte junto con el atributo NumeroDpto (FK). En la nueva tabla la PK es {UbicacionesDpto, NumeroDpto}. Otra solución si se conoce el número máximo de valores para cada atributo, digamos por ejemplo tres, se sustituye ese atributo multievaluado por tres atributos atómicos UbicacionDpto1, UbicacionDpto2 y UbicacionDpto3. Esta solución es menos deseable. Esto tiene el consiguiente problema de NULLs y además la consulta de este atributo se hace más complicada (ejemplo de consulta: departamentos que tienen Valencia como ubicación). 34 2ª forma normal (2NF) Está basado en el concepto de DF total (si se elimina cualquier atributo de X se rompe la dependencia). Una dependencia funcional X Y es plena si no le sobra ningún atributo a X, es decir X – {A} no determina funcionalmente a Y, A X. Dicho de otro modo, los atributos dependen de la clave completa; sólo los atributos de una clave pueden depender de partes de éstas. Atributo no primo o no primario = atributo que no es parte de ninguna clave. Un esquema R está en 2FN si todo atributo no primo forma una DF total de alguna clave candidata. Un esquema R es 2NF si todo atributo no primario de R tiene una dependencia funcional plena con las claves de R. Recordar que atributos primarios son los que forman parte de alguna clave. 35 2ª forma normal (2NF) Una dependencia funcional X Y es parcial si X – {A} Y, con A X. – La DF {Dni, NumProyecto} Horas es completa ya que ni Dni Horas ni NumProyecto Horas son dependencias válidas. – Sin embargo la DF {Dni, NumProyecto} NombreE es una dependencia parcial porque también se cumple que Dni NombreE es una DF. Así DF1 cumple 2NF, pero DF2 y DF3 no cumplen 2NF ya que no son dependencias funcionales completas con la clave candidata {Dni, NumProyecto}. OJO: Lo atributos no primos tienen que depender completamente de la clave candidata. Solo se permite depender a atributos de una clave candidata (atributos primos) con partes de claves candidatas (esta permitido en 2NF). 36 2ª forma normal (2NF) El proceso de normalización de 1NF 2NF se hace dividiendo la relación en varias relaciones en las que los atributos no primos estén asociados solo a la parte de alguna clave candidata o claves candidatas de la que dependen. 37 2ª forma normal (2NF) La comprobación 2FN implica la comprobación de la DFs de la relación cuyos atributos del lado izquierdo forman parte de alguna clave candidata. Si la clave candidata contiene un solo atributo no hace falta comprobar la verificación. En la tabla EMP_PROY la clave primaria esta formada por {Dni, NumProyecto} y no hay ninguna otra clave candidata. El atributo no primo NombreE que forma parte de DF2 no cumple 2FN ya no depende totalmente de la clave primaria o alguna clave candidata. Los atributos no primos NombreProyecto y UbicaciónProyecto que forman parte de DF3 incumplen 2FN por la misma razón. La normalización 2NF se realiza dividendo la relación en relaciones en las que los atributos no primos solo estén asociados a la parte de la clave principal de la que son completa y funcionalmente dependientes. Ver figura anterior. 38 Ejemplo de eliminación de redundancia con 2FN TRABAJA_EN 39 Ejemplo de eliminación de redundancia con 2FN Si ahora combinamos información de EMPLEADO, PROYECTO y TRABAJA_EN obtenemos la tabla EMP_PROY. Aparece una tabla con redundancia en las tuplas y la eliminamos con 2FN. DF2 DF3 DF1 no genera redundancia 40 Ejemplo de eliminación de redundancia con 2FN ¿Porqué hay redundancia en tablas que no cumplen 2FN? Supongamos la DF Dni NombreE, esta dependencia genera repeticiones: – Recordemos que la clave primaria es: {Dni, NumProyecto} – Por lo tanto puede haber tuplas con el mismo Dni (Dni aquí no es clave primaria). – Así como existe la DF Dni NombreE, hay todavía más repeticiones (por la definición de Dependencia Funcional: si encontramos tuplas con el mismo Dni a la fuerza NombreE es el mismo en esas tuplas. Para resolver este problema hacemos tablas base más pequeñas sin esas repeticiones mediante el proceso de normalización: – todos los atributos no primos dependen totalmente de alguna clave. 41 Ejemplo de eliminación de redundancia con 2FN El proceso de normalización de 1NF 2NF se hace dividiendo la relación en varias relaciones en las que los atributos no primos estén asociado solo a la parte de alguna clave candidata o claves candidatas de la que dependen. 42 3ª forma normal (3NF) Se basa en el concepto de dependencia transitiva: una dependencia funcional X Y en un esquema de relación R es una dependencia transitiva si existe un conjunto de atributos Z que ni es clave candidata ni es un subconjunto de una clave de R, y se cumple tanto X Z como Z Y. Ejemplo: en la relación EMP_DEPT la dependencia Dni DniDirector es transitiva a través de NumeroDpto, ya que se cumplen las dependencias Dni NumeroDpto y NumeroDpto DniDirector (nota: NumeroDpto no es una clave por si misma ni un subconjunto de clave de EMP_DEPT). 3FN = 2FN+ningún atributo no primo depende transitivamente de la clave principal o primaria a través de un atributo no primo. 43 3ª forma normal (3NF) Se puede demostrar que una definición equivalente es que un esquema es 3NF si para toda dependencia X A no trivial (X A es trivial si A X), o bien X es una superclave, o bien A es un atributo primo. Dicho de otro modo, no puede un atributo depender de algo que no sea una superclave, excepto acaso los atributos que forman parte de alguna clave. 44 3ª forma normal (3NF) También las relaciones que están en 2FN pueden tener redundancia, por el mismo motivo de antes: hay dependencias funcionales que la parte Y depende de algo X que no es clave. Dni NumeroDpto y NumeroDpto {NombreDpto, DniDirector}, y NumeroDpto no es C-1ª (es un atributo no primo) Redundancia 45 3ª forma normal (3NF) EMP_DEPT está en 2NF ya que no existen dependencias no parciales de una clave. No esta en 3NF ya que existen dependencias transitivas a través de NúmeroDpto: – Dni NombreDpto y Dni DniDirector son dependencias transitivas a través del atributo NúmeroDpto . – La DF NúmeroDpto {NombreDpto, DniDirector} no esta en 3NF (la parte izquierda no es una superclave, la parte derecha no es un atributo primo). Podemos descomponerla en ED1 y ED2, de tal forma que si hacemos una NJ entre esas tablas recuperamos la tabla original EMP_DEPT sin tuplas espurias. 46 Resumen formas normales Intuitivamente podemos ver que cualquier dependencia funcional en la que el lado izquierdo es parte de la clave principal (subconjunto propio) , o es un atributo no clave, implica una DF problemática. La normalización 2FN y 3FN eliminan esas dependencias problemáticas. 47 Forma normal Boyce-Codd (BCNF) Un esquema R es BCNF si para toda dependencia X Y no trivial X es una superclave de R Dicho de otro modo, no puede haber más dependencia que con las superclaves. Este esquema tiene por claves candidatas: IdPropiedad y {NombreMunicipio, NúmeroParcela}, se elige como primaria IdPropiedad. La parte izquierda de DF5 no es superclave de la relación PARCELAS1A. Notar que si es 3FN ya que la parte derecha es un atributo primo (NombreMunicipio forma parte de una clave candidata). 48 Forma normal Boyce-Codd (BCNF) Para pasar a BCNF perdemos la dependencia DF2 ya que sus atributos no coexisten en una misma relación. Notar que en la normalización BCNF se pueden perder dependencias, al contrario de lo que pasa en 2FN y 3FN. Generalmente los esquemas que están en 3FN lo están BCNF. Solo si se cumple X A en un esquema de relación R, no siendo X un superclave y siendo A un atributo primo estarán en 3FN pero no BCNF: – Ya FD1 está en 3FN ya que la parte izquierda es una superclave y FD2 también porque la parte derecha es un atributo primo. FD2 no está en BCNF ya que la parte izquierda no es superclave, pero FD1 si está en BCNF. 49 Forma normal Boyce-Codd (BCNF) Supongamos que tenemos la siguiente relación con las siguientes dependencias: – DF1: {Estudiante, Curso} → Profesor – DF2: Profesor → Curso {Estudiante, Curso} es una clave candidata y clave primaria en este caso. Esta relación esta en 3FN pero no en BCNF. DF2 es la razón de no estar en BCNF. 3 opciones para BCNF: 1. {Estudiante, Profesor} y {Estudiante Curso} 2. {Curso, Profesor} y {Curso, Estudiante} 3. {Profesor, Curso} y {Profesor, Estudiante} Las 3 posibilidades rompen DF1, pero la apropiada es la (3) ya que no genera tuplas falsas tras una concatenación (se puede comprobar mediante el test del join sin perdidas). 50 Forma normal Boyce-Codd (BCNF o 3.5NF) Vemos que al normalizar a {Profesor, Curso} y {Profesor, Estudiante}, se elimina la redundancia de Profesor → Curso en la tabla (ya que en la tabla la clave primaria es {Estudiante, Curso}). Podemos ver por ejemplo que Marcos y Bases de datos esta varias veces repetida, y con la normalización se elimina esa redundancia. Observar la FK y PK de las nuevas relaciones base. 51 Mas Ejemplos 52 ¿Normalizar o Desnormalizar? Hay veces que en una BD, por razones de optimización de rapidez en consultas, es conveniente desnormalizar (aumentar la redundancia de las relaciones base). Así mantener unas redundancias controladas en las tablas en algunos casos puede ser bueno. En algunos casos el tener la BD en niveles altos de normalización puede no significar más eficiencia: mientras más normalización algunas veces menor rendimiento (muchas concatenaciones para recuperar información). Es decisión del analista del SGDB encontrar un balance entre la normalización y desnormalización de la BD. Para desnormalizar se requiere que la BD este en su nivel optimo de normalización: 3FN o 3.5FN. Para desnormalizar por ejemplo se pueden utilizar vistas materializadas. 53 Algoritmos de normalización Comprobación de preservar dependencias en descomposiciones Comprobación de join sin pérdida en descomposiciones Comprobación de que un conjunto de atributos es una superclave Propiedad 3NF, BCNF de relaciones Descomposición de relaciones a 3NF, BCNF – Siempre es posible descomponer a 2NF y 3NF sin pérdida de dependencias – BCNF puede no ser posible sin perder alguna dependencia 54 Normalización 3NF (Cap 11) 3NF (R, F) /* Esta descomposición tiene “join” sin pérdida, y preserva las dependencias */ /* R es cualquier relación universal y F un conjunto de DFs de R */ 1. D := 2. G := cobertura mínima de F /* se localiza la cobertura mínima G para F */ /* Sacar a tablas aparte los atributos de todos los conjuntos de dependencias con la misma parte izquierda */ 3. for X Y G (cobertura mínima) Añadir a D el esquema X { A1, A2, …, An } donde X Ai son todas las dependencias sobre X en G /* Si no ha salido ninguna tabla con la clave original completa, crear esa tabla */ 4. Si ningún esquema de D contiene una clave de R, añadir a D un esquema con una clave de R 5. Eliminar los esquemas redundantes de D (esquemas incluidos en otros) 55 Ejemplo de Normalización 3NF (algoritmo) R={A B C D E F G}, DF1: B ACDE, DF2: E FG 3NF (R, F) /* Esta descomposición tiene “join” sin pérdida, y preserva las dependencias */ 1. D := 2. G := cobertura mínima de R /* se localiza la cobertura mínima G para R */ – Pasamos de B ACDE a B A, B C, B D, B E – Pasamos de E FG a E F, E G, estas 6 DFs ya tienen sus partes derechas en su forma simple – Las partes izquierdas también están en su forma simple y por tanto no hay redundancia de atributos – No hay dependencias redundantes (DFs que se infieren de otra DFs) y por tanto la cobertura mínima G – G:={B A, B C, B D, B E, E F, E G} 56 Ejemplo de Normalización 3NF (algoritmo) /* Sacar a tablas aparte los atributos de todos los conjuntos de dependencias con la misma parte izquierda */ 3. for X Y G (cobertura mínima) Añadir a D el esquema X { A1, A2, …, An } donde X Ai son todas las dependencias sobre X en G Así que tenemos: D:={B {A, C, D, E}, E {F, G}}= {{B, A, C, D, E}, {E, F, G}}={R1, R2} /* Si no ha salido ninguna tabla con la clave original completa, crear esa tabla */ 4. Si ningún esquema de D contiene una clave de R, añadir a D un esquema con una clave de R (pero si hay una clave de R que es B, así que no es el caso). 5. Eliminar los esquemas redundantes de D (esquemas incluidos en otros) que no es el caso. 6. La clave primaria de R1 es B y la clave primaria de R2 es E. El atributo E en R1 es clave foránea (esta descomposición tiene “join” sin pérdida, y preserva las dependencias). 57 Normalización BCNF (Cap 11) BCNF (R, F) /* El algoritmo genera una descomposición que tiene join sin pérdida, pero no asegura la preservación de todas las dependencias */ D := {R} while D contiene una relación no BCNF Q := elegir una dependencia funcional no BCNF en D X Y := elegir una dependencia de F en Q que no cumple BCNF Substituir Q en D por dos esquemas (Q – Y), (X Y) (es decir en cada pasada del while se descompone un esquema Q que no esta en BCNF en dos esquemas que si son BCNF) En otras palabras… 1. Sacar a tablas aparte todas las dependencias no BCNF de la relación original, pero eliminando de ésta la parte derecha de las dependencias 2. Repetir el proceso sobre las relaciones que van saliendo NOTA: En eliminando de ésta la parte derecha se pueden perder dependencias. 58 Ejemplo Normalización BCNF (algoritmo) Este esquema tiene por claves candidatas: IdPropiedad y {NombreMunicipio, NúmeroParcela}, se elige como primaria IdPropiedad. R={A B C D}, y clave candidata {BC}, la dependencias funcionales son DF1: A BCD, DF2: BC AD, DF3: D B Solo hay una DF que no cumple BCNF que es DF3: D B Substituir el esquema R por dos esquemas (R – B) y (D B) R={R1, R2}={{A C D}, {D B}} La clave primaria de R1 es A y de R2 es D. El atributo D en R1 es clave foránea. Este algoritmo genera una descomposición que tiene join sin pérdida, pero no asegura la preservación de todas las dependencias (por ejemplo la dependencia DF2 ya no existe). . 59 Ejemplo Normalización BCNF (algoritmo) Supongamos la siguiente relación R={Estudiante, Curso, Profesor} con las siguientes dependencias: – DF1: {Estudiante, Curso} → Profesor – DF2: Profesor → Curso R={A, B, C}, DF1: AB C, DF2: C B Solo hay una DF que no cumple BCNF que es DF2: C B Substituir el esquema R por dos esquemas (R – B) y (C B) R={R1, R2}={{A C}, {C B}} La clave primaria de R1 es AC y de R2 es C. El atributo C en R1 es clave foránea. Este algoritmo genera una descomposición que tiene join sin pérdida, pero no asegura la preservación de todas las dependencias (por ejemplo la dependencia DF1 ya no existe). . 60 Test para Join sin pérdida (Cap 11) Test sencillo para una descomposición binaria: Una descomposición binaria {R1, R2} de una relación R tiene join sin pérdida respecto a un conjunto de dependencias F si y solo si: O bien (R1 R2 R1 – R2) se infiere de F (o está en F +) O bien (R1 R2 R2 – R1) se infiere de F (o está en F +) (Esto quiere decir más o menos o que {R1 R2} es la clave foránea que me relaciona R1 con R2 o al contrario) 61 Ejemplo de Test para Join sin pérdida R={Estudiante, Curso, Profesor} con las siguientes dependencias: – DF1: {Estudiante, Curso} → Profesor – DF2: Profesor → Curso R={A, B, C}, DF1: AB C, DF2: C B F={DF1, DF2} Según el ejemplo anterior, la única descomposición sin perdidas es: R={R1, R2}= {{A C}, {C B}} O bien se infiere R1 R2 (= C) R1 – R2 (= A) de F O bien se infiere R1 R2 (= C) R2 – R1 (= B) de F En este caso la segunda C B Luego como sabíamos R1 y R2 producen un NJ sin perdida DIFERENCIA: R-S es una relación que incluye todas los aributos que están en R pero no están en S. 62 Ejemplo de Test para Join sin pérdida No obstante para la descomposición binaria : R={R1, R2}={{A C}, {A B}} O bien se infiere R1 R2 (= A) R1 – R2 (= C) de F O bien se infiere R1 R2 (= A) R2 – R1 (= B) de F En este caso ni A C, ni A B se infieren de F, por lo tanto R1 y R2 NO producen un NJ sin perdida y se tendrían tuplas falsas como resultado. Así para la descomposición binaria : R={R1, R2}={{B C}, {A B}} O bien se infiere R1 R2 (= B) R1 – R2 (= C) de F O bien se infiere R1 R2 (= B) R2 – R1 (= A) de F En este caso ni B C, ni B A se infieren de F, por lo tanto R1 y R2 NO producen tampoco un NJ sin perdida y se tendrían tuplas falsas como resultado. 6-CRyAR-EDAT-121.pdf Cálculo y Álgebra Relacional (Cap 6 - Elmasri 5ª edición) 2 Introducción Vamos a tratar los dos lenguajes formales del modelo relacional. – Cálculo relacional – Álgebra relacional El modelo de datos debe incluir un conjunto de operaciones para manipular la BD. Estás operaciones permiten al usuario especificar las peticiones fundamentales de recuperación de información en la BD. El resultado de una recuperación es una nueva relación, y estas relaciones se pueden manipular posteriormente. El conjunto de operaciones básicas del modelo relacional es lo que se denomina álgebra relacional (AR). El AR proporciona el fundamento formal para las operaciones del modelo relacional, y además es la base para la implementación y optimización de las consultas en un sistema de gestión de BD. 3 Introducción El cálculo relacional (CR) ofrece una notación declarativa de alto nivel para especificar las consultas relacionales. En una expresión de cálculo no existe un orden de las operaciones para recuperar los resultados de la consulta: la expresión solo especifica la información que el resultado debería contener. Por tanto el CR es un formalismo declarativo, al contrario del AR que es procedural (especifica el conjunto de operaciones en el orden adecuado para recuperar los resultados de la consulta). Así tenemos dos tipos de formalismos para expresar operaciones de consulta sobre una BD en el modelo relacional, CR y AR. Estos dos formalismos son diferentes pero lógicamente equivalentes: – Toda expresión de cálculo se puede expresar en álgebra y viceversa. – Es decir, permiten expresar las mismas consultas. 4 Introducción Un lenguaje de consulta es relacionalmente completo si permite expresar cualquier consulta del cálculo relacional. La traducción de AR a SQL es relativamente inmediata. Los motores de SQL basan su representación interna en consultas a través de AR. Así el AR se utiliza con fines más prácticos, en principio es más manejable que el SQL para diseñar consultas complejas. La traducción de CR a SQL no es trivial. CR es más adecuado para establecer y verificar propiedades formales, la consistencia de los modelos relacionales y sus formalismo. Introducido por Edgar Frank Codd, para operar en el contexto del modelo relacional. La creación original del modelo relacional se fundamentó en el cálculo –interesa entenderlo para una comprensión más profunda del modelo relacional y el fundamento de la tecnología de bases de datos y otros lenguajes de consulta de BDs como QBE (desarrollado por IBM). 5 Introducción QBE: (Query By Example - Consulta por ejemplo). Es un método de consulta en base de datos relacionales. Fue ideado por Moshé M. Zloof en el IBM Research a mediados de los 70, en paralelo al desarrollo de SQL. Este sistema nos permite que la persona que genera la búsqueda o la aplicación que la realice pueda proporcionar información sobre aquello que está buscando en la base de datos. Fue el primer lenguaje de consulta gráfico, que utiliza tablas visuales donde el usuario puede insertar comandos, elementos de ejemplos y condiciones. QBE está basado en la idea de DRC (Domain relational calculus), que es un cálculo que fue introducido por Michel Lacroix y Alain Pirotte como un lenguaje de consultas declarativo de base de datos para el modelo relacional. Más información en: http://es.wikipedia.org/wiki/Búsqueda_mediante_ejemplo Esto es interesante por Page Rank, es QBE con texto: consiste en dar al sistema cualquier información y que éste devuelva entradas relacionas con el tema http://es.wikipedia.org/wiki/Búsqueda_mediante_ejemplo https://es.wikipedia.org/wiki/PageRank 6 Cálculo Relacional El CR es un lenguaje formal basado en una rama de la lógica matemática llamada cálculo de predicado de primer orden. El CR puede actuar sobre tuplas o dominios (diferentes tipos de variables): – CRT – CRD El CR de tupla opera directamente sobre las tuplas de una relación, las variables utilizadas en la fórmulas operan sobre tuplas. En el CR de dominio las variables usadas en las fórmulas operan sobre valores individuales de los dominios de los atributos. La diferencia es esencialmente de notación, pero son prácticamente equivalentes. 7 Cálculo Relacional de Tupla El CR de tupla está basado en la especificación de un número de variables de tuplas. Cada especificación suele aplicarse sobre una relación base de datos en particular: – Es decir la variable podría tomar su valor de cualquier tupla individual de esa relación base Un consulta de CR sencilla tiene la siguiente forma { t | cond(t) }: – t representa una variable de tupla – cond(t) es una expresión condicional – La expresión representa (literalmente) un conjunto de tuplas que cumplen la condición El resultado es el conjunto de todas la tuplas t que satisfacen la condición cond(t). 8 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 9 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 10 Cálculo Relacional de Tupla: Variables de Tupla y Relaciones de Rango Por ejemplo para localizar todos lo empleados cuyo salario es superior a 50000€ podemos escribir la siguiente expresión: – { t | EMPLEADO(t) AND t.sueldo >50000 } – La condición EMPLEADO(t) especifica que la relación de rango de la variable de tupla t es EMPLEADO. – Cada EMPLEADO t que satisface la condición t.sueldo>50000 será recuperada. – t.Sueldo hace referencia al atributo Sueldo de la variable de tupla t. La consulta anterior recupera todos los valores del atributo de cada tupla. Para recuperar solo algunos atributos (Nombre y Apellido1): – { t.Nombre, t.Apellido1 | EMPLEADO(t) AND t.sueldo >50000 } Por ejemplo para localizar todos los vuelos con origen en Madrid – { t | Vuelo(t) and t.origen = ‘MAD’ } – La condición Vuelo(t) especifica que la relación de rango de la variable de tupla t es Vuelo. – Cada Vuelo t que satisface la condición t.origen=‘MAD’ será recuperada. – t.origen hace referencia al atributo origen de la variable de tupla t. 11 Cálculo Relacional de Tupla: Consulta General Informalmente tenemos que suministrar la siguiente información en una expresión de cálculo de tupla: – Para cada variable de tupla t, la relación de rango R de t, R(t). – Una condición para seleccionar combinaciones de tuplas particulares. – El conjunto de atributos a recuperar (atributos solicitados). Por ejemplo recuperar la fecha de nacimiento y la dirección del empleado (o empleados) cuyo nombre sea José Peréz Peréz: – { t.FechaNac, t.Dirección | EMPLEADO(t) AND t.Nombre =‘José’ AND t.Apellido1=‘Pérez’ AND t.Apellido2=‘Pérez’} Pero se pueden formular consultas más elaboradas Vamos a ver la forma general de una consulta de CR: { variables | condición } 12 Cálculo Relacional de Tupla: Expresiones y Fórmulas { t1 . Aj, t2 . Ak, …, tn . Am | COND(t1, t2, …, tn, tn+1, tn+2, …, tn+m)} – Donde t1, t2, …, tn, tn+1, tn+2, …, tn+m,son variables de tupla. – Aj es un atributo de la relación a la que engloba ti – Y COND es una condición o fórmula. Una fórmula está compuesta por alguno de los siguientes elementos de cálculo más pequeños (llamados átomos): 1. Un átomo de la forma R(ti), donde R es el nombre de una relación y ti es una variable de tupla. Esta fórmula identifica el ámbito de la variable tupla ti como la relación cuyo nombre es R. 2. Un átomo de la forma ti . A op tj . B, donde op es uno de los operadores de comparación del conjunto {=,<, ≤, >, ≥, ≠}, ti y tj son variables de la tupla, y A y B son atributos de las relaciones ti y tj a las que, respectivamente, engloban. 3. Un átomo de la forma anterior pero con uno de los operandos siendo una constante y no una variable. 13 Cada uno de los átomos anteriores se evalúa como VERDADERO o FALSO para una combinación específica de tuplas (veracidad del átomo). Mediante estas fórmulas compuestas por átomos queremos saber si los datos almacenados en las BDs cumplen un cierta condición o no, para recuperar esa información. Así por ejemplo para los átomos de la forma R(t), si t está asignada a una tupla que es miembro de la relación R especificada, ese átomo se evalúa como VERDADERO, en cualquier otro caso FALSO. – Ej: EMPLEADO(t), si t es una tupla que pertenece a empleado este átomo se evalúa como VERDADERO. Los átomos de tipo 2 o 3, si las variables de tupla están asignadas a tuplas en las que los valores de los atributos especificados de las mismas satisfacen la condición entonces las fórmulas se evalúan como verdaderas. En general una fórmula (COND) está compuesta por uno o varios átomos conectados mediante operadores lógicos, AND, OR y NOT. Cálculo Relacional de Tupla: Expresiones y Fórmulas 14 Las relaciones entre fórmulas y átomos cumple las siguientes reglas: Regla1: Cada átomo es una fórmula. Regla2: Si F1 y F2 son fórmulas entones también lo son (F1 AND F2), (F1 OR F2), NOT(F1) y NOT(F2). Los valores de veracidad para estas fórmulas se derivan de los obtenidos para F1 y F2 de la siguiente forma: – (F1 AND F2) es VERDADERO si F1 y F2 lo son. En cualquier otro caso es FALSO. – (F1 OR F2) es FALSO si F1 y F2 lo son. En cualquier otro caso es VERDADERO. – NOT(F1) es VERDADERO si F1 es FALSO. En cualquier otro caso es FALSO. – NOT(F2) es VERDADERO si F2 es FALSO. En cualquier otro caso es FALSO. Cálculo Relacional de Tupla: Expresiones y Fórmulas 15 Existen otros símbolos especiales llamados cuantificadores que pueden aparecer en la fórmulas: El universal () y el existencial (). Conceptos de variables de tupla libre y tupla acotada de una fórmula: una variable de tupla t es ligada o acotada si está cuantificada (aparece en una clausula t o t), en cualquier otro caso es libre. Las reglas que determinan si es libre o acotada: – Una variable de tupla en una fórmula F que es un átomo es libre en F. – Una variable de tupla t es libre o acotada en una fórmula construida mediante conexiones lógicas {(F1 AND F2), (F1 OR F2), NOT(F1) y NOT(F2)} dependiendo de su estado en F1 o F2. (Nota: En la dos primeras si F1 es libre y F2 acotada, o viceversa, el resultado del AND es acotado y el resultado del OR es libre). – Todas las ocurrencias libres de una variable de tupla t en F son acotadas en una fórmula F’ de la forma: F’=(t)F o F’=(t)F. La variable de tupla es acotada al cuantificador especificado en F’ (notar que los cuantificadores anteriores solo hacen referencia a t). • F1: d.NombreDpto=‘investigacion’ • F2: (t)(d.NumeroDpto=t.Dno) • F3: (d)(d.DniDirector=‘333445555’) La variable de tupla d es libre en F1 y F2, mientras que es acotada en F3 (por el cuantificador ). La variable t es acotada respecto al cuantificador () en F2. Cálculo Relacional de Tupla: Cuantificadores Existencial y Universal 16 Los valores de comprobación de las fórmulas con estos cuantificadores están descritos por las siguientes reglas: – Regla3: Si F es una fórmula , entonces F’=(t)F también lo es, donde t es una variable de tupla. F’ es VERDADERO si F se evalúa como tal en alguna (al menos una) tupla asignada a las ocurrencias libres de t en F. En cualquier otro caso F’ es FALSO. – Regla4: Si F es una fórmula , entonces F’=( t)F también lo es, donde t es una variable de tupla. F’ es VERDADERO si F se evalúa como tal para cada tupla asignada a las ocurrencias libres de t en F. En cualquier otro caso F’ es FALSO. se dice que es un cuantificador existencial porque una fórmula (t)F es VERDADERO si existe alguna tupla que haga que F sea VERDADERO. Para el cuantificador universal, ( t)F es VERDADERO si cada posible tupla que puede asignarse a las ocurrencias libres de t en F es sustituida por t, y F es VERDADERO para cada una de estas sustituciones. Recibe el nombre de universal (o para todos los cuantificadores) porque cada tupla del universo de tuplas debe hacer que F sea VERDADERO para la fórmula cuantificada también lo sea. Cálculo Relacional de Tupla: Cuantificadores Existencial y Universal 17 Forma General: { t | F(t) } conjunto de tuplas t tal que F(t) es verdadero Relación de intervalo (rango de la tabla A): { t | A(t)} conjunto de tuplas que pertenecen a la relación A Proyección: { t.A1, t.A2 | A(t) } extraer los atributos de una tabla Selección: { t | A(t) and t.A1 >2000 } seccionar tuplas de una tabla Unión: { t | A(t) or B(t)} (es necesario la compatibilidad de relaciones) Intersección: { t | A(t) and B(t)} (es necesario la compatibilidad de relaciones) Resta: { t | A(t) and not B(t)} (es necesario la compatibilidad de relaciones) Producto cartesiano: { t, s | A(t) and B(s)} Join: { t, s | A(t) and B(s) and t.A1<s.B1 } Join: { t | A(t) and ((s)(B(s) and t.A1<s.B1 ))} Equi-Join: { t, s | A(t) and B(s) and t.A1=s.B1 } Equi-Join: { t | A(t) and ((s)(B(s) and t.A1=s.B1 ))} Cálculo Relacional de Tupla: Operaciones Básicas-Repaso 18 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 19 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 20 Consulta1: Liste el nombre y la dirección de todos los empleados que trabajan para el departamento ‘Investigación’: {t.Nombre, t. Apellido1, t.Dirección | EMPLEADO(t) AND (d) (DEPARTAMENTO(d) AND d.NombreDpto=‘Investigación’ AND d.NumeroDpto=t.Dno) } – En cálculo relacional la únicas variables de tupla que son libres aparecen a la izquierda de la barra (|). – En este caso, t es la única variable de tupla libre. – Esta variable es acotada sucesivamente para cada tupla. Esto quiere decir que si la tupla satisface las condiciones de la consulta, esta se recupera del modo que se especifica. – La variable de tupla d es acotada al cuatificador existencial. – Las condiciones EMPLEADO(t) y DEPARTAMENTO(d) especifican las relaciones de rango para las variables de tupla t y d. – La condición d.NombreDpto=‘Investigación’ es una condición de selección (operación de selección del Álgebra Relacional). – La condición d.NumeroDpto=t.Dno es una condición de concatenación (operación básica del Álgebra Relacional). Cálculo Relacional de Tupla: Ejemplos 21 Consulta equivalente en SQL: SELECT Nombre, Apellido1, Dirección FROM (EMPLEADO JOIN DEPARTAMENTO ON Dno= NumeroDpto) WHERE NombreDpto=‘Investigación’; También podemos hacerla como: SELECT Nombre, Apellido1, Dirección FROM EMPLEADO, DEPARTAMENTO WHERE NombreDpto=‘Investigación’ AND NumeroDpto =Dno; O también de con el “join” explicito: SELECT Nombre, Apellido1, Dirección FROM EMPLEADO INNER JOIN DEPARTAMENTO ON NumeroDpto =Dno WHERE NombreDpto=‘Investigación’ ; Cálculo Relacional de Tupla: Ejemplos Equivalente en SQL 22 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 23 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 24 Consulta 2: Por cada proyecto ubicado en ‘Gijón’, obtenga el número de departamento que lo gestiona, los apellidos, la fecha de nacimiento y la dirección del director del mismo: {p.NumProyecto, p. NumDptoProyecto, e.Apellido1, e.FechaNac, e.Dirección | PROYECTO(p) AND EMPLEADO(e) AND p.UbicacionProyecto=‘Gijón’ AND ((d)(DEPARTAMENTO(d) AND p.NumDptoProyecto=d.NumeroDpto AND d.DniDirector=e.Dni))} – Las variables de tuplas p y e son libres. La variable d es acotada al cuantificador existencial. – La condición de la consulta se evalúa para cada combinación de tuplas asignadas a ‘p’ y a ‘e’, seleccionando de esas combinaciones posibles las que son acotadas por las fórmulas de la condición. Cálculo Relacional de Tupla: Ejemplos 25 Consulta equivalente en SQL: SELECT NumProyecto, NumDptoProyecto, Apellido1, Dirección, FechaNac FROM PROYECTO, DEPARTAMENTO, EMPLEADO WHERE NumDptoProyecto =NumeroDpto AND DniDirector=Dni AND UbicacionProyecto=‘Gijon’; Cálculo Relacional de Tupla: Ejemplos Equivalente en SQL 26 Ojo que distintas variables de tupla de una consulta pueden alcanzar la misma relación, por ejemplo la siguiente consulta. Consulta 3: Por cada empleado, recuperar el nombre y primer apellido del empleado, y el nombre y primer apellido de su supervisor inmediato. {e.Nombre, e.Apellido1, s.Nombre, s.Apellido1 | EMPLEADO(e) AND EMPLEADO(s) AND e.SuperDni=s.Dni} Recordar el mismo ejemplo en SQL: SELECT E.Nombre, E.Apellido1, S.Nombre, S.Apellido1 FROM EMPLEADO AS E, EMPLEADO AS S WHERE E.SuperDni=S.Dni; La tabla E se va a utilizar como tabla para extraer la información de los empleados que son supervisados. La tabla S se utiliza para extraer la información de los empleados supervisores. Darse cuenta que las tablas E y S son copias de la tabla empleado. Cálculo Relacional de Tupla: Ejemplos 27 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 28 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 29 Consulta 4: Enumere el nombre de todos los empleados que trabajan en algún proyecto controlado por el departamento 5: {e.Apellido1, e. Nombre | EMPLEADO(e) AND ((x) (w) (PROYECTO(x) AND TRABAJA_EN(w) AND x.NumDptoProyecto=5 AND w.DniEmpleado=e.Dni AND x.NumProyecto=w.NumProy)))} En SQL: SELECT DISTINCT "EMPLEADO"."Nombre" FROM "TRABAJA_EN", "EMPLEADO" WHERE "EMPLEADO"."Dni"="TRABAJA_EN"."DniEmpleado" AND "TRABAJA_EN"."NumProy" IN (SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO" WHERE "PROYECTO"."NumDptoProyecto"='5'); Es una consulta anidada. El segundo SELECT me proporciona los números de proyectos que controla el departamento 5. Estos número se les pasa a la primera consulta. ¿PODEMOS QUITAR EN ESTE CASO EL ANIDAMIENTO? Cálculo Relacional de Tupla: Ejemplos 30 Cálculo Relacional de Tupla: Ejemplos RECORDTORIO: Enumere el nombre de todos los empleados que trabajan en algún proyecto controlado por el departamento 5. El segundo SELECT me proporciona los números de proyecto que controla el departamento 5. 31 Consulta 4: Enumere el nombre de todos los empleados que trabajan en algún proyecto controlado por el departamento 5: {e.Apellido1, e. Nombre | EMPLEADO(e) AND ((x) (w) (PROYECTO(x) AND TRABAJA_EN(w) AND x.NumDptoProyecto=5 AND w.DniEmpleado=e.Dni AND x.NumProyecto=w.NumProy))}} En SQL pero sin SELECT anidado: SELECT DISTINCT "EMPLEADO"."Nombre" FROM "TRABAJA_EN", "EMPLEADO", "PROYECTO" WHERE "EMPLEADO"."Dni"="TRABAJA_EN"."DniEmpleado" AND "TRABAJA_EN"."NumProy"="PROYECTO"."NumProyecto" AND "PROYECTO"."NumDptoProyecto"='5' Cálculo Relacional de Tupla: Ejemplos 32 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 33 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 34 Consulta 5: Obtener una lista de los números de los proyectos que impliquen a cualquier empleado cuyo primer apellido sea ‘Campos’, independientemente de que sean trabajadores o directores del departamento que gestiona dicho proyecto: {p.NumProyecto | PROYECTO(p) AND (((e) (w) EMPLEADO(e) AND TRABAJA_EN(w) w.NumProy=p.NumProyecto AND e.Apellido1=‘Campos’ AND e.Dni=w.DniEmpleado)) OR ((m) (d) EMPLEADO(m) AND DEPARTAMENTO(d) AND p.NumDptoProyecto=d.NumeroDpto AND d.DniDirector=m.Dni AND m.Apellido1=‘Campos’))) } Cálculo Relacional de Tupla: Ejemplos Trabajadores Directores 35 En SQL la Consulta 5: Obtener una lista de los números de los proyectos que impliquen a cualquier empleado cuyo primer apellido sea ‘Campos’, independientemente de que sean trabajadores o directores del departamento que gestiona dicho proyecto: SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO" WHERE "PROYECTO"."NumProyecto" IN (SELECT "PROYECTO"."NumProyecto" FROM "PROYECTO", "DEPARTAMENTO", "EMPLEADO" WHERE "PROYECTO"."NumDptoProyecto"="DEPARTAMENTO"."NumeroDpto" AND "DEPARTAMENTO"."DniDirector"="EMPLEADO"."Dni" AND "Apellido1"='Campos') OR "PROYECTO"."NumProyecto" IN (SELECT "TRABAJA_EN"."NumProy" FROM "TRABAJA_EN", "EMPLEADO" WHERE "TRABAJA_EN"."DniEmpleado"="EMPLEADO"."Dni" AND "Apellido1"='Campos'); Cálculo Relacional de Tupla: Ejemplos 36 Cálculo Relacional de Tupla: Ejemplos RECORDATORIO: Obtener una lista de los números de los proyectos que impliquen a cualquier empleado cuyo primer apellido sea ‘Campos’, independientemente de que sean trabajadores o directores del departamento que gestiona dicho proyecto: Directores Empleados 37 Expresiones no seguras Expresiones no seguras – Devuelven infinitas tuplas: Ejemplo: { t | NOT EMPLEADO(t) } – Recupera todas la tuplas del universo que no son tuplas empleado. – Solución: evitarlas! – La caracterización de consultas seguras y no seguras es compleja –no profundizaremos en ello en este curso. – Las equivalencias entre los diferentes formalismos (cálculo, álgebra, cálculo de tuplas vs. de dominio) se dan con salvedad de las expresiones no seguras. 38 Álgebra Relacional Se considera como una parte del modelo de datos relacional. Las consultas se hacen mediante operaciones de manera procedural (al contrario del CR que es declarativo como ya hemos visto). Al igual que en CR una consulta en AR da como resultado el conjuntos de tuplas que cumplen ciertas condiciones que se desean especificadas por la consulta. Existen varios tipos de operaciones: – Operaciones propias: desarrolladas propiamente para las bases de datos relacionales (Unarias o Binarias): • Selección, Proyección, Renombrado, Concatenación o Combinación. – Operaciones entre conjuntos: • Unión, Intersección, Diferencia de conjuntos, Producto Cartesiano – Operaciones extendidas: operaciones que se necesitan además de las anteriores: • Funciones Agregadas y Concatenación y Unión adicionales. 39 Álgebra Relacional: Operaciones Unarias-SELECT La operación unaria SELECCIÓN se emplea para seccionar un conjunto de tuplas de una relación que satisface una condición de selección. Puede ser visto como una partición horizontal de la relación: solo la tuplas que cumplen la condición son seleccionadas, es resto se descarta. Ejemplos: – Dno=4 (EMPLEADO): selecciona las tuplas de empleado cuyo departamento es 4. – Sueldo>30000 (EMPLEADO): selecciona las tuplas de empleado cuyo salario es mayor de 30000 €. En general: <condición de selección> (R) El símbolo representa la operación de selección propiamente dicha. La condición de selección es una expresión lógica (o booleana) especificada sobre los atributos de la relación R. 40 Álgebra Relacional: Operaciones Unarias-SELECT R en general puede ser una operación de AR, cuyo resultado es una relación (una tabla o conjunto de tuplas). Obviamente la R más sencilla es el nombre de una relación de la BDs, como hemos visto en los ejemplos anteriores. El resultado de la operación selección tiene los mismos atributos de la relación R. La condición de selección puede estar compuesta por las diferentes clausulas: – A op B, o A op c, donde A y B son atributos de una relación , c una constante y op es un operador comparación {=,<, ≤, >, ≥, ≠} Estás clausulas pueden estar conectadas por operadores lógicos AND, OR y NOT. NOTA: Las condiciones son iguales que las de CR pero no se aplican a variables de tupla, no se utilizan condiciones de esquema indicando la relación de rango de la variable, y no se utilizan los cuantificadores existencial y universal. 41 Álgebra Relacional: Operaciones Unarias-SELECT Ejemplos: (Dno=4 AND Sueldo>25000) OR (Dno=5 AND Sueldo>30000) (EMPLEADO): secciona las tuplas de la relación empleado que trabajan en el departamento 4 y ganan más de 25000€, o los que trabajan en el departamento 5 y ganan más de 30000. 42 Álgebra Relacional: Operaciones Unarias-SELECT Toda operación de selección cumple: – Los atributos de la selección son los mismos que los de la relación. – El número de tuplas resultante es siempre menor o igual que el número de tuplas de la relación. – La operación selección es conmutativa: • condición1 (condición2 (R)) = concición2 (condición1 (R)) = condición1 and condición2 (R) • Esto se puede aplicar a una cascada de condiciones En general la operación selección es una elección de filas de las relaciones (partición horizontal), al contrario de la operación que vamos a estudiar a continuación de PROYECCIÓN. Está segunda operación unaria selecciona ciertas columnas de una tabla. Es por que la operación PROYECCIÓN se suele ver como una partición vertical de la tabla sobre la que opera. 43 Álgebra Relacional: Operaciones Unarias-PROJECT Está operación selecciona ciertas columnas de una tabla. Es por que la operación PROYECCIÓN se suele ver como una partición vertical de la tabla sobre la que opera. Ejemplo: – Apellido1, Nombre, Sueldo (EMPLEADO): selecciona los atributos Apellido1, Nombre, Sueldo de la tabla EMPLEADO. 44 Álgebra Relacional: Operaciones Unarias-PROJECT En general: <lista de atributos> (R) El símbolo representa la operación de proyección propiamente dicha. La lista de atributos contiene a la lista de campos de la relación que queremos extraer de la relación R. El orden de los atributos en la nueva relación es el orden especificado en la proyección. Si la lista de atributos no incluye ninguna clave candidata de R, entonces es posible que se obtuviesen tuplas duplicadas. La operación proyección elimina cualquier tupla que este duplicada, por lo tanto se obtiene una relación válida en el modelo relacional. Esto es lo que se conoce como eliminación de duplicados: – Sexo, Sueldo (EMPLEADO): aunque formalmente existirían tuplas duplicadas (<‘M’, 25000>), estas se eliminan del resultado. 45 Álgebra Relacional: Operaciones Unarias-PROJECT La eliminación de duplicados lleva implícitamente un proceso de ordenación para detectar esos duplicados y eliminarlos (esto no sucede en SQL, DISTINCT). En una operación de proyección siempre se cumple: – El número de tuplas resultante es siempre menor o igual que el número de tuplas de la relación (eliminación de duplicados). Es igual estrictamente cuando la lista tiene una clave candidata de R. – Propiedad de listas incluidas: lista1(lista2(R)) = lista1(R), siempre y cuando lista2 lista1, si esto no pasa la expresión es incorrecta. – La operación proyección NO es conmutativa. 46 Álgebra Relacional: Operaciones Unarias-RENAME Al resultado de las operaciones anteriores no se les asigna ningún nombre. Se pueden realizar todas las operaciones de AR una tras otra, anidando dichas operaciones (sin tener que asignar nombres intermedios). Podemos querer crear relaciones intermedias y asignar nombre a esas relaciones intermedias. Ejemplo: Recuperar el nombre, el primer apellido y el sueldo de todos los empleados que trabajan en el departamento 5, para ello debemos aplicar una selección y una proyección: – Nombre, Apellido1, Sueldo (Dno=5 (EMPLEADO)): Mostrar la figura (a) siguiente. – Podemos mostrar la secuencia de operaciones dando un nombre a cada una de ellas: • DEP5_EMPS Dno=5 (EMPLEADO) • RESULTADO Nombre, Apellido1, Sueldo (DEP5_EMPS). También podemos utilizar la técnica de RENOMBRAR los atributos en las relaciones intermedias y resultantes. Es muy útil con operaciones más complejas de unión y concatenación. 47 Álgebra Relacional: Operaciones Unarias-RENAME 48 Álgebra Relacional: Operaciones Unarias-RENAME Para renombrar los atributos lo hacemos de la siguiente forma con el ejemplo anterior (dos tipos de renombrado): – TEMP Dno=5 (EMPLEADO) (operación selección) – R(NuevoNombre, NuevoApellido, NuevoSueldo) Nombre, Apellido1, Sueldo (TEMP) (operación proyección) Mostrar la figura (b) anterior página. En la operación selección no se renombran los atributos y por lo tanto tienen el mismo nombre y en mismo orden. En la operación proyección los atributos tienen los nombres renombrados. Así una operación de renombrado es un operador unario. 49 Álgebra Relacional: Operaciones Unarias-RENAME La forma genérica de una operación de renombrado aplicada a una relación R de grado n puede ser: – S(B1, B2, …, Bn) (R), S (R) , (B1, B2, …, Bn) (R) Donde el símbolo representa la operación de renombrado. S es el nombre de la nueva relación. B1, B2,…, Bn son los nuevos atributos y R1, R2,…, Rn son los de R. La primera expresión renombra tanto la relación como los atributos (S(B1, B2, …, Bn)(R)). La segunda expresión solo renombra la relación (S (R)). La tercera solo los atributos ((B1, B2, …, Bn) (R)). Si suponemos que los atributos de R son (A1, A2,…, An) por este orden entonces cada Ai se renombra a Bi. Para renombrar solo el atributo Ri de la relación R por Bi: Bi/Ri (R). 50 Álgebra Relacional: Operaciones Entre Conjuntos (Binarias) UNIÓN (UNION) INTERSECCIÓN (INTERSECTION) DIFERENCIA (MINUS) PRODUCTO CARTESIANO o PRODUCTO CUZADO (CROSS JOIN) (necesario para explicar bien la operación extendida de concatenación posteriormente) 51 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 52 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 53 Álgebra Relacional: Operaciones Entre Conjuntos (, , -) Estas operaciones de AR son las correspondientes a la operativa matemática sobre conjuntos. Ejemplo de la operación UNIÓN: Recuperar los Documentos Nacionales de Identidad de todos los empleados que, o bien trabajan en el departamento 5 o bien supervisan a estos: 1. DEP5_EMPS Dno=5 (EMPLEADO) 2. RESULTADO1 Dni (DEP5_EMPS) 3. RESULTADO2(Dni) SuperDni (DEP5_EMPS) 4. RESULTADO RESULTADO1 RESULTADO2 – RESULTADO1 tiene el Dni de todos los empleados del departamento 5, RESULTADO2 tiene el Dni de todos aquellos empleados que supervisan directamente a los del primer grupo. – La unión de ambos es el conjunto de las tuplas que están en RESULTADO1 o están en RESULTADO2 o en ambas. Mostrar siguiente figura. 54 Álgebra Relacional: Operaciones Entre Conjuntos (, , -) 55 Álgebra Relacional: Operaciones Entre Conjuntos (, , -) La operaciones entre conjuntos sirven para combinar elementos entre conjuntos como uno desee. Todas las operaciones son binarias, ya que actúan sobre dos conjuntos de tuplas. Concepto de compatibilidad de tuplas: dos relaciones R(A1, A2,…, An) y S(B1, B2,…, Bn), se dice que son de unión compatible si ambas relaciones tienen el mismo grado n y el dom(Ai)=dom(Bi) con i entre 1 y n. Las operaciones unión, intersección y diferencia se tienen que aplicar entre conjuntos de tuplas compatibles (en el producto cartesiano no es necesario). Suponiendo R y S son dos conjuntos de tuplas compatibles las tres operaciones se definen: – UNIÓN: R S es una relación que incluye todas la tuplas que están en R o están en S o en ambas R y S (obviamente no hay duplicados, “o”). – INTERSECCIÓN: R S es una relación que incluye todas la tuplas que están en R y S . – DIFERENCIA: R-S es una relación que incluye todas la tuplas que están en R pero no están en S. 56 Álgebra Relacional: Operaciones Entre Conjuntos (, , -) E P E P E - P P - E 57 Álgebra Relacional: Operaciones Entre Conjuntos (, , -), Propiedades En todas las siguientes propiedades se suponen dos relaciones compatibles o de unión compatible R(A1, A2,…, An) y S(B1, B2,…, Bn). La unión e intersección son operaciones conmutativas y asociativas: – R S= S R y R S = S R – R (S T) = (R S) T y R (S T) = (R S) T La operación menos no es conmutativa: – R-S S-R (ver figura anterior) La intercesión se puede poner en términos de la unión y diferencia: – R S = R S- (R-S)-(S-R) Siempre la salida de las operaciones tiene el mismo número de atributos de los conjuntos. min(|R|,|S|) |R S| |R| + |S| |R S| min(|R|,|S|) 58 Álgebra Relacional: Operaciones Entre Conjuntos (, , -), Propiedades c (R) d (S) = c and d (R S) c (R) d (R) = c or d (R) 59 Álgebra Relacional: Operaciones Entre Conjuntos () Producto Cartesiano: Se trata también de una operación de conjuntos binarios, aunque los operandos no tienen porque ser de unión compatible. En general R(A1, A2,…, An) S(B1, B2,…, Bm) es una relación Q de grado n+m atributos Q(A1, A2,…, An ,B1, B2,…, Bm). En la relación Q resultante tiene una tupla por cada combinación de éstas (una para R y otra para S). Por tanto si R tiene nR tuplas y S tiene nS tuplas entonces R S tendrá nR * nS tuplas. Supongamos la siguiente secuencia de operaciones: 1. EMPLEADAS_FEMENINAS Sexo=‘M’ (EMPLEADO) 2. NOMBRE_EMPLEADOS Nombre, Apellido1, Dni(EMPLEADAS_FEMENINAS) 3. EMPLEADOS_SUBORDINADOS NOMBRE_EMPLEADOS SUBORDINADO 4. SUBORDINADOS_ACTUALES Dni=DniEmpleado (EMPLEADOS_SUBORDINADOS) 5. RESULTADO Nombre, Apellido1, NombreSubordinado(SUBORDINADOS_ACTUALES) El producto cartesiano solo tiene sentido si se hace a continuación que combine las relaciones componentes en la manera que deseamos. 60 Álgebra Relacional: Operaciones Entre Conjuntos () 61 Álgebra Relacional: Operaciones Entre Conjuntos () 62 Álgebra Relacional: Operaciones Entre Conjuntos () El producto cartesiano crea tuplas de con los atributos combinados de ambas relaciones. Solo podemos hacer una selección de tuplas de las dos relaciones especificando una condición de selección apropiada. Esto es lo que veremos ahora como la operación de CONCATENACIÓN. En el ejemplo anterior queremos combinar una tupla de empleada femenina solo con la de sus subordinados particulares (es decir la tuplas de SUBORDINADO cuyos valores de DniEmpleado coincidan con Dni de EMPLEADO). 63 Álgebra Relacional: Operaciones Binarias-CONCATENACIÓN El símbolo de la concatenación o JOIN es |><|, se emplea para combinar tuplas relacionadas de dos relaciones en una sola. Esta operación es fundamental ya que permite procesar relaciones entre relaciones. Supongamos que queremos recuperar el nombre del director de cada departamento, para ello necesitamos combinar la tuplas departamento y empleado a través de la operación concatenación: 1. DIRECTOR_DPTO DEPARTAMENTO |><| DniDirector=Dni EMPLEADO 2. RESULTADO NombreDpto, Apellido1, Nombre(DIRECTOR_DPTO) 64 Álgebra Relacional: Operaciones Binarias-CONCATENACIÓN La concatenación, como ya vimos puede ser enunciada como un producto cartesiano más una selección posterior (|><| = más ). Consideremos el ejemplo de hace unas transparencias: 1. EMPLEADOS_SUBORDINADOS NOMBRE_EMPLEADOS SUBORDINADO 2. SUBORDINADOS_ACTUALES Dni=DniEmpleado (EMPLEADOS_SUBORDINADOS) Estas dos operaciones se pueden sustituir por la operación concatenación: – SUBORDINADOS_ACTUALES NOMBRES_EMPLEADOS |><| Dni=DniEmpleado SUBORDINADO La forma general de la concatenación en dos relaciones R(A1, A2,…, An) y S(B1, B2,…, Bm) es: R |><| <condición de conexión> S El resultado de la concatenación es una relación Q de n+m atributos Q(A1, A2,…, An,B1, B2,…, Bm), por este orden que tiene una tupla por cada combinación de éstas (una para R y otra para S), siempre que dicha combinación satisfaga la condición de combinación. Aquí radica la diferencia principal entre PRODUCTO CARTESIANO y CONCATENACIÓN. 65 Álgebra Relacional: Operaciones Binarias-CONCATENACIÓN Una condición general de conexión la podemos expresar como: – <condición> AND <condición> AND … AND <condición> Solo aparecen la tuplas cuyas condiciones de conexión se evalúan como verdaderas. Donde cada <condición > es de la forma Ai Bj, con Ai siendo un atributo de la relación R y Bi es un atributo de la relación S y un operador de comparación {=,<, ≤, >, ≥, ≠}. Una concatenación con una condición de conexión de este tipo recibe el nombre de ASOCIACIÓN (THETA JOIN). Hay que observar que en una ASOCIACIÓN las tuplas cuyos atributos de conexión son NULL o aquellas cuya condición de conexión se evalúa como falsa no aparecen en el resultado (la concatenación no preserva necesariamente toda la información de las relaciones participantes). 66 Álgebra Relacional: CONCATENACIÓN EQUIJOIN y NATURAL El uso más simple de las concatenaciones supone el uso de condiciones de concatenación con solo comparaciones de igualdad: EQUIJOIN En EQUIJOIN siempre tenemos atributos que cuentan con valores idénticos en cada tupla (ver en la figura anterior Dni y DniDirector). Ya que los valores idénticos de los atributos en las tuplas son innecesarios, se creó una nueva operación llamada CONCATENACIÓN NATURAL (NATURAL JOIN), cuyo símbolo es |><| (o en el libro el símbolo *). El natural join se deshace del segundo atributo superfluo en una condición EQUIJOIN (elimina así la redundancia que se genera por un JOIN). La concatenación equijoin estándar precisa que los dos atributos (o dos combinaciones de atributos idénticas en cada una de las tablas) de conexión tengan el mismo nombre en las dos relaciones. En el siguiente ejemplo primero renombramos un atributo NumeroDpto NumeroDptoProyecto y luego aplicamos la concatenación natural: – PROYECTO_DPTO PROYECTO |><| S(NombreDpto, NumDptoProyecto, DniDirector, FechaIncresoDirector)(DEPARTAMENTO). 67 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 68 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 69 Álgebra Relacional: CONCATENACIÓN EQUIJOIN y NATURAL Este ejemplo anterior: – PROYECTO_DPTO PROYECTO |><| S(NombreDpto, NumDptoProyecto, DniDirector, FechaIncresoDirector)(DEPARTAMENTO). Se puede realizar en dos pasos creando una tabla intermedia: – DEPT S(NombreDpto, NumDptoProyecto, DniDirector, FechaIncresoDirector)(DEPARTAMENTO). – PROYECTO_DPTO PROYECTO |><| DEPT. El atributo NumDptoProyecto recibe el nombre de atributo de conexión del natural join (notar que solo mantiene uno de los atributos de conexión en la tabla resultante). 70 Álgebra Relacional: CONCATENACIÓN EQUIJOIN y NATURAL Si los atributos donde se va a realizar la concatenación natural ya tienen el mismo nombre ya o hace falta hacer el renombramiento de los atributos, como por ejemplo en DEPARTAMENTO y LOCALIZACIONES_DPTO el atributo NumeroDpto es el mismo en la dos tablas: – LOC_DPTO DEPARTAMENTO |><| LOCALIZACIONES_DPTO. 71 Álgebra Relacional: CONCATENACIÓN EQUIJOIN y NATURAL La concatenación se puede realizar entre diversas tablas: – ((PROYECTO |><| NumDptoProyecto=NumeroDpto DEPARTAMENTO) |><| DniDirector=Dni EMPLEADO). 72 Álgebra Relacional: Operaciones Adicionales (Proyección Generalizada) Amplia la posibilidades de proyección original: permite funciones de atributos en la lista de proyección: F1, F2,…..,Fn(R), donde F1, F2, …, Fn son funciones sobre los atributos de la relación R. Supongamos la relación EMPLEADO (Dni, Sueldo, Deducción, Antiguedad) y supongamos que queremos sacar un informe en el cual se muestre: – SalarioNeto= Sueldo – Deducción – Gratificaciones = 2000 * Antigüedad – Impuestos = 0.25 * Sueldo Así se puede utilizar una proyección generalizada para sacar este informe: – INFORME (Dni, SalarioNeto, Gratificaciones, Impuestos) Dni, Sueldo – Deducción, 2000 * Antigüedad , 0.25 * Sueldo (EMPLEADO)). 73 Álgebra Relacional: Operaciones Adicionales (Agregación y Agrupamiento) Se pueden hacer cálculos con los atributos de las relaciones a través de funciones matemáticas de agregación: – SUMA (SUM) – MEDIA (AVERAGE) – MÁXIMO (MAXIMUM) – MÍNIMO (MINIMUN) – CONTAR (COUNT) Otro tipo de función es la agrupación de atributos de una relación para luego posteriormente aplicar alguna de las funciones de agregación anteriores. La función agregada más general AGRUPA tuplas por el valor de ciertos atributos, y sobre esos grupos puede aplicar operaciones de AGREGACIÓN. Definimos la función agregada (script F) por el símbolo : – <atributos de agrupamiento> <lista de funciones> (R) Los <atributos de agrupamiento> es una lista de atributos de la relación R, y <lista de funciones> es una lista de parejas (<función>, <atributo>). En cada una de las parejas <función> puede ser cualquiera de las funciones de agregación anteriores, y <atributo> es un atributo de la relación especificada por R. 74 Álgebra Relacional: Operaciones Adicionales (Agregación y Agrupamiento) Por ejemplo recuperar cada número de departamento, el número de empleados del mismo, y la media de sueldos, renombrando los atributos resultantes: R(Dno, NumEmpleados, MediaSueldos) (Dno COUNT Dni, AVERAGE Sueldo (EMPLEADO)). 75 Álgebra Relacional: Operaciones Adicionales (Agregación y Agrupamiento) Si no se hiciese el renombrado a través de la función , el nombre de los atributos de la relación de salida se cambia a la forma <función><atributo>, podemos verlo en la tabla (b) de la transparencia anterior (esta notación no es estándar, aunque es la notación que utiliza el libro). Si no se especifican atributos de agrupamiento, las funciones de agregación se aplican a todas la tuplas indiscriminadamente de la relación (ver tabla (c) de la transparencia anterior). Es importante recalcar que en general las duplicaciones no se eliminan cuando se aplican funciones de agregación, por lo tanto hay que tener con las interpretaciones de aplicar a estos agrupamientos las funciones de agregación. Si queremos eliminar duplicados antes de pasar una función de agregación aplicamos la función DISTINCT. 76 Álgebra Relacional: Operaciones Adicionales (Cierre Recursivo) El cierre recursivo se aplica a una relación recursiva entre tuplas del mismo tipo, como por ejemplo las que se establecen entre un empleado y un supervisor. Esta relación esta descrita por la FK SuperDni de EMPLEADO. Un ejemplo de operación recursiva sería la recuperación de supervisiones de un empleado e a todos sus niveles, es decir todos los empleados e’ directamente supervisados por e, los e’’ que son todos los supervisados por e’ y así sucesivamente. Como haríamos esto con un ejemplo, para indicar los Dni de todos los empleado e’ supervisados directamente (a nivel 1) por el empleado e cuyo nombre es Eduardo Ochoa: DNI_OCHOA Dni( Nombre=‘Eduardo’ AND Apellido1=‘Ochoa’ EMPLEADO)) SUPERVISION(Dni1, Dni2) Dni, SuperDni(EMPLEADO) RESULTADO1(Dni) Dni1(SUPERVISION |><| Dni2=Dni DNI_OCHOA) 77 Álgebra Relacional: Operaciones Adicionales (Cierre Recursivo) Si queremos recuperar los supervisados por Ochoa a nivel 2: RESULTADO2(Dni) Dni1(SUPERVISION |><| Dni2=Dni RESULTADO1) Para obtener los empleados supervisados a nivel 1 y 2 hacemos la UNIÓN: RESULTADO RESULTADO2 RESULTADO1 Podemos seguir así indefinidamente hasta alcanzar todos los niveles, sin emplear un mecanismo de bucle recursivo. En el estándar SQL3 hay una sintaxis exclusiva para el cierre recursivo. 78 Álgebra Relacional: Operaciones Adicionales (Cierre Recursivo) 79 Álgebra Relacional: Operaciones Adicionales (Concatenación Externa) Las concatenaciones que mantienen solo la tuplas coincidentes (a través de una cierta condición), se llaman concatenaciones internas (son las que hemos visto hasta ahora). Pero podemos querer por ejemplo una lista de todos los empleados junto con los departamentos que controlan (si no controlan que aparezca NULL). Para esta consulta podemos utilizar la CONCATENACIÓN EXTERNA IZQUIERDA (LEFT OUTER JOIN): – TEMP (EMPLEADO ||><| Dni=DniDirector DEPARTAMENTO) – RESULTADO Nombre, Apellido1, Apellido2, NombreDpto(TEMP) Ver la siguiente transparencia. Notar que mantiene cada tupla de la primera relación (relación IZQUIERDA), y si no encuentra ninguna tupla en la segunda relación a través de los atributos de concatenación especificados, coloca un NULL. La CONCATENACIÓN EXTERNA DERECHA (RIGTH OUTER JOIN) es similar, |><||(mantiene todas la tuplas de la relación derecha). CONCATENACIÓN EXTERNA COMPLETA (FULL OUTER JOIN), ||><||. 80 Álgebra Relacional: Operaciones Adicionales (Concatenación Externa) 81 Álgebra Relacional: Operaciones Adicionales (Unión Externa) Fue diseñada para obtener la unión de tuplas no compatibles, cuando hay compatibilidad parcial, por ejemplo – R(X,Y) y S(X,Z), dando la unión externa otra relación T(X,Y,Z) – Cuando alguna parte X de R o S no se encuentran entonces habrá valores NULL en Y o Z. Por ejemplo: ESTUDIANTE(Nombre, Dni, Departamento, Tutor) y PROFESOR(Nombre, Dni, Departamento, Cargo). Solo comparten los tres primeros atributos, y la unión externa de ambas sería: – ESTUDIANTE_O_PROFESOR(Nombre, Dni, Departamento, Tutor, Cargo) Cuando ESTUDIANTE Y PROFESOR se combinen en una UNION EXTERNA, los tres primeros atributos que provengan de ESTUDIANTE tendrán NULL en el Cargo, y cuando provengan de PROFESOR tendrán NULL en el atributo Tutor. 82 Correspondencia con SQL atributos (condición (R)) SELECT atributos FROM R WHERE condición A / C (A, B (condición (R)) SELECT A AS C, B FROM R WHERE condición S (atributos (condición (R)) CREATE VIEW S AS atributos FROM R WHERE condición atributos (condición (R ⋈ S)) SELECT atributos FROM R JOIN S WHERE condición atributos (c1(R ⋈c2 S)) SELECT atributos FROM R JOIN S WHERE c1 and c2 atributos (condición (R S)) SELECT atributos FROM R, S WHERE condición R S, R S, R – S R UNION S, R INTERSECT S, R EXCEPT S atributos Count(A), Sum(B)… (R) SELECT atributos Count(A), Sum(B)… FROM R GROUP BY atributos 83 BD Empresa EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO SUBORDINADO TRABAJA_EN 84 Campos, Tuplas y Tablas en una BD EMPLEADO DEPARTAMENTO LOCALIZACIONES_DPTO PROYECTO TRABAJA_EN SUBORDINADO 85 Álgebra Relacional: Ejemplos Esta consulta se podría expresar de otras formas: se podría invertir el orden de las operaciones de CONCATENACIÓN y SELECCIÓN y se podría sustituir por una concatenación natural, después por supuesto de hacer un renombrado (ejercicio para casa). 86 Álgebra Relacional: Ejemplos 87 Álgebra Relacional: Ejemplos 88 Álgebra Relacional: Ejemplos 89 Álgebra Relacional: Ejemplos 7-RyC-EDAT-121.pdf Registros y Campos (ejemplos de almacenamiento en longitud fija y longitud variable) 2 Almacenamiento de tablas: Campos y registros Ejemplo 1: Longitud Fija DEPARTAMENTO NombreDpto NumeroDpto DniDirector FechaIngre Investigacion 5 333445555 1988-28-02 Administracion 4 987654321 1995-01-01 Sede Central 1 888665555 1981-06-19 Investigacion_43334455551988-28-02 Administracion53334455551988-28-02 Sede Central__18886655551981-06-19 0 1 2 Long. fija Long. fija TUPLA REGISTRO ATRIBUTO CAMPO NRR El campo NombreDpto tiene tres bytes desaprovechados: uno en Investigacion_, y otro en Sede Central__ (el símbolo “_” un byte desprovechado). Pero no se pierde mucho espacio en este caso. El tamaño de los registros es fijo de 34 bytes. Representación en la memoria secundaria 3 Almacenamiento de tablas: Campos y registros Ejemplo 2: Longitud Variable 421133344555505Ana24C/Oña 8, 28050 Madrid 991198765432114Hermenegildo72C/ Trallera... . . . 0 42 141 · · · Long. variable offset (bytes) long. campo long. registro Long. variable EMPLEADO DNI Nombre Dirección 333445555 Ana C/ Oña 8, 28050 Madrid 987654321 Hermenegildo C/ Trallera S/N, Colinas del Campo de Martín Moro Toledano, 24313 Leon . . . . . . . . . (incluyendo 2 bytes por indicador de longitud) Representación en la memoria secundaria 9 bytes 3 bytes 22 bytes 9 bytes 12 bytes 70 bytes TUPLA REGISTRO ATRIBUTO CAMPO Indicador de longitud de REGISTRO y de CAMPO 4 Almacenamiento de tablas: Campos y registros Ejemplo 3: Longitud Variable 400912333445555AnaC/Oña 8, 28050 Madrid 970921987654321HermenegildoC/ Trallera... . . . 0 40 137 · · · Long. variable offset (bytes) Posición Campo 3 long. registro Long. variable EMPLEADO DNI Nombre Dirección 333445555 Ana C/ Oña 8, 28050 Madrid 987654321 Hermenegildo C/ Trallera S/N, Colinas del Campo de Martín Moro Toledano, 24313 Leon . . . . . . . . . (incluyendo 2 bytes por indicador de longitud) Representación en la memoria secundaria 9 bytes 3 bytes 22 bytes 9 bytes 12 bytes 70 bytes TUPLA REGISTRO ATRIBUTO CAMPO Indicador de longitud de REGISTRO e indicador de posición de CAMPO Posición Campo 2 5 Almacenamiento de tablas: Campos y registros Ejemplo 4: Longitud Variable 333445555|Ana|C/ Oña 8, 28050 Madrid# 987654321|Hermenegildo|C/ Trallera... . . . 0 37 131 · · · Long. variable offset (bytes) Long. variable EMPLEADO DNI Nombre Dirección 333445555 Ana C/ Oña 8, 28050 Madrid 987654321 Hermenegildo C/ Trallera S/N, Colinas del Campo de Martín Moro Toledano, 24313 Leon . . . . . . . . . Representación en la memoria secundaria 9 bytes 3 bytes 22 bytes 9 bytes 12 bytes 70 bytes TUPLA REGISTRO ATRIBUTO CAMPO Indicador delimitador de CAMPO y REGISTRO delimitador campo p.e. '|' delimitador registro p.e. ‘#' 6 Almacenamiento de tablas: Campos y registros Ejemplo 5: Longitud Variable 38333445555|Ana|C/Oña 8, 28050 Madrid 95987654321|Hermenegildo|C/ Trallera... . . . 0 38 133 · · · Long. variable offset (bytes) long. registro Long. variable EMPLEADO DNI Nombre Dirección 333445555 Ana C/ Oña 8, 28050 Madrid 987654321 Hermenegildo C/ Trallera S/N, Colinas del Campo de Martín Moro Toledano, 24313 Leon . . . . . . . . . (incluyendo 2 bytes por indicador de longitud) Representación en la memoria secundaria 9 bytes 3 bytes 22 bytes 9 bytes 12 bytes 70 bytes TUPLA REGISTRO ATRIBUTO CAMPO Indicador de longitud de REGISTRO y delimitador de CAMPO delimitador campo p.e. '|' 8-BINyTEXT-EDAT-121.pdf Binario vs. Texto en escritura/lectura de ficheros 2 Binario vs. Texto Imaginemos que queremos guardar en el disco duro el número 425 en formato short int, mediante sentencias del lenguaje C. Hay una diferencia de almacenar ese dato en formato binario o texto. Cuando se almacenan datos de una sola vez en un ordenador de más de 1 byte, estos se pueden escribir: – big-endian: 0x01A9 se almacena en memoria (disco duro por ejemplo) como {01, A9}. Típico de Motorola. – little-endian: 0x01A9 se almacena en memoria (disco duro por ejemplo) como {A9, 01}. Típico de Intel. – Hay arquitecturas que pueden trabajar con ambos enfoques: middle-endian. Típico de ARM y PowerPc. Así en binario se guardan dos bytes a la vez (fwrite). En texto internamente byte a byte (fprint). 3 Binario vs. Texto Compilo y ejecuto: $ gcc bin-text.c -o bin-text; ./bin-text Muestro los bytes de los ficheros bin.dat y text.dat $ hexdump -C bin.dat 00000000 a9 01 |..| (los puntos son caracteres no imprimibles) 00000002 $ hexdump -C text.dat 00000000 34 32 35 |425| 00000003 Escritura en Binario ( fwrite(&n,sizeof(n), 1, f1) ): como lo he ejecutado en un Intel es little-endian y el valor hexadecimal A901 almacenado el disco duro representa el número hexadecimal 01A9 que en binario es 0000 0001 1010 1001. Este número en binario es precisamente la representación en complemento a dos del número short int n=425. Así 42510 0116 A916 00000001101010012 (en representación complemento a 2) Escritura en Texto ( fprintf(f2,"%d",n) ): generalmente el modo texto ocupa más, e implica la conversión en RAM de cada dígito del número a ASCII. 42510 “425” ‘4’ ‘2’ ’5’ 52 50 53 (códigos ASCII) 3416 3216 3516 001101002 001100102 001101012 (binario puro, cuando hay un signo menos se codifica con su código ASCII, 45 (-), es decir 2D en hexadcimal). 4 Binario vs. Texto Supongamos ahora: short int n = -425; (1111 1110 0101 0111 en C-A2, 0xFE57) Compilo y ejecuto: $ gcc bin-text.c -o bin-text; ./bin-text Muestro los bytes de los ficheros bin.dat y text.dat $ hexdump -C bin.dat 00000000 57 fe |W.| (el punto es un carácter no imprimible) 00000002 $ hexdump -C text.dat 00000000 2d 34 32 35 |-425| 00000003 Así la escritura en texto es legible para un editor de texto. La escritura en binario no tiene porque ser legible para un editor de texto. La lectura (como es lógico) debe ser coherente con la escritura: binario binario, texto texto (es decir fwrite fread, fprintf fscanf)