Capítulo 6: Organización de los datos. Página 12. 2.2.4.- Organización secuencial indexada encadenada. Una mejora de la estructura anterior es incluir punteros entre los registros, tal que mantengan el orden lógico de los registros, organización secuencial indexada encadenada. Al crear un archivo con esta organización su estructura es igual a la de un archivo secuencial indexado, salvo que añade un campo en cada registro para albergar un puntero. Para insertar un nuevo registro es necesario encontrar el que le sigue en la zona de registros. Se escribe el nuevo registro en la zona de desbordamientos y se reescribe el siguiente según el orden lógico, para incluir el puntero al registro recién grabado. Figura 11.- Archivo con organización secuencial indexada encadenada. La eliminación de un registro debe realizarse por marcas. Esto no implica en ningún caso la realización de modificaciones en el índice, pero degrada al archivo. La consulta es semejante a la realizada para el caso no encadenado. Esta organización reúne las ventajas de la organización secuencial indexada y de la organización secuencial encadenada. Cuando el número de registros borrados es grande o las cadenas de desbordamiento son largas el archivo se degrada. esto es, su estructura deja de ser eficaz. Cuando se llega a este punto es necesario reorganizar el archivo; esto es, volver a crearlo introduciendo los registros secuencialmente según el valor de clave. 2.2.5.- Organización directa o aleatoria. Un archivo con organización directa o aleatoria (“random”) es un archivo escrito sobre un soporte de acceso directo para el cual existe una transformación conocida que genera la dirección de cada registro en el archivo a partir de una llave o clave primaria. El nombre de “aleatorio” se debe a que normalmente no existe ninguna vinculación aparente entre el orden lógico de los registros y su orden físico. No resulta adecuado, en la mayoría de los casos, realizar una consulta secuencial en un archivo aleatorio, ya que los registros no serían leídos según el orden de la llave. El problema fundamental de esta organización es elegir adecuadamente de la transformación o método de direccionamiento que se ha de utilizar. En algunos casos aparecen dos situaciones no deseadas: Existen direcciones que no se corresponden con ninguna llave y, por tanto, habrá zonas de disco sin utilizar. Existen direcciones que corresponden a más de una llave. En este caso se dice que las llaves son sinónimas para esa transformación. Capítulo 6: Organización de los datos. Página 13. Hay dos formas de resolver el problema de los sinónimos, siempre a costa de complicar la estructura del archivo: 1ª. Cuando se asocia a una llave una dirección ya ocupada por un registro distinto (esto es, por un sinónimo de esta llave ), se busca en el archivo hasta encontrar una posición libre donde escribir el registro. 2ª. Se reserva una zona de desbordamientos donde se escribirán los registros que no se pueden escribir en la posición que les corresponde según la transformación, a la que denominaremos zona principal. Si se utiliza el primer procedimiento, la búsqueda de una posición libre puede realizarse secuencialmente a partir de la posición asignada, o aplicando a la dirección obtenida un segundo método de direccionamiento. En cualquier caso, ambos procedimientos son lentos y degradan considerablemente el archivo. Si se utiliza zona de desbordamientos se puede gestionar ésta, bien secuencialmente o bien encadenada a la zona principal. Esto último presenta el inconveniente de tener que reservar un puntero en cada registro, pero permite un acceso más rápido a los sinónimos, lo que en general será más importante que el espacio. Hay tres métodos básicos de direccionamiento para los archivos de organización directa: Directo. Se utiliza como dirección la propia llave. Asociado. A cada llave se le asocia una dirección mediante una tabla. Calculado o por transformación de llave. La dirección se obtiene realizando operaciones y transformaciones con la llave. A continuación se describen brevemente estos tres tipos de direccionamientos para archivos de organización directa. Direccionamiento directo. Sólo es factible cuando la llave es numérica y su rango de valores no es mayor que el rango de direcciones en el archivo. Se utiliza como dirección la propia llave. En algunos casos pueden quedar lagunas de direcciones sin utilizar, en lugares conocidos de antemano. En este caso se pueden ocupar dichas direcciones desplazando las direcciones superiores. Un archivo aleatorio con direccionamiento directo está siempre ordenado. Por ejemplo, el archivo de habitaciones de un hotel puede organizarse en forma aleatoria con direccionamiento directo, sin más que hacer la dirección igual al número de habitación. Direccionamiento asociado. El direccionamiento asociado se puede utilizar para cualquier tipo de llave. Si se utiliza este método debe construirse una tabla en la que figurarán todas las llaves y la dirección donde se encuentra el registro correspondiente. Al añadir nuevos registros las llaves se colocan al final de la tabla. Esta se encontrará normalmente desordenada. Por tanto, habrá que localizar las llaves en ella por lectura secuencial, lo que ralentiza el acceso, al menos que la tabla esté residiendo en la memoria principal, se indexe o se ordene y se busque en ella la llave con un procedimiento rápido, tal como el de “búsqueda dicotómica”. Direccionamiento calculado (“hashing”). En el direccionamiento calculado la dirección de cada registro se obtiene, o evaluando una expresión que utiliza como dato la llave, o bien realizando una transformación sobre dicha llave. Se utiliza cuando la llave no es numérica o, siendo numérica, cuando puede tomar valores dentro de un conjunto demasiado grande par usarla directamente como dirección. Cualquiera sea la transformación usada es normal que aparezcan sinónimos, dependiendo la frecuencia de aparición de los mismos de el algoritmo de transformación usado. Capítulo 6: Organización de los datos. Página 14. Si la llave no es numérica se usará una conversión previa para obtener un número a partir de ella. Normalmente se usa el equivalente decimal al propio código binario del carácter. Así, por ejemplo, en código ASCII al carácter A le corresponde el 65. Existen gran cantidad de métodos para el cálculo de dirección, algunos de los más relevantes son: División. La dirección es el resto de dividir la llave por una constante. Habitualmente esta constante es el mayor de los números primos menores que el número de posiciones que tenga el archivo. Extracción. Consiste en utilizar como dirección un grupo de cifras extraídas de la llave, dichas cifras pueden ser contiguas o no. Elevación al cuadrado. Se usa cuando la representación numérica de la llave no es muy larga. Consiste en elevar ésta al cuadrado y tomar los dígitos centrales. Por ejemplo, si hay 100 registros en el archivo y la llave 3489, se tendrá que: 2 - Se calcula 3.489 , que es 12 173 121. - Se toma como dirección las tres cifras centrales 3. Plegamiento. Se utiliza para llaves muy largas. Se descompone la llave en trozos de cifras contiguas del mismo tamaño y se suman éstos. Sobre el número obtenido se pude aplicar otro método si es necesario. 2.2.5.1.- Operaciones básicas sobre un archivo con organización directa. Con un archivo con organización directa se pueden realizar todas las operaciones descritas. A diferencia de otras organizaciones, es necesario realizar un proceso especial de creación del archivo. Esta implica la elección de uno de los procedimientos de direccionamiento descritos en los epígrafes precedentes y de un método de gestión de sinónimos, así como reservar espacio en disco para la zona principal. Consulta. La consulta se realiza por llave. Para leer un registro debe aplicarse a la llave el algoritmo de transformación y posteriormente leer el registro en la dirección resultante. Si el registro con la llave buscada no se encuentra allí se procederá, en función de cómo se haya resuelto gestionar los sinónimos. La consulta secuencial no siempre es factible. Borrado. Siempre se realiza un borrado lógico, pudiéndose reutilizar el espacio del registro eliminado. Modificación e inserción. Siempre se puede modificar o insertar un nuevo registro, realizando la transformación de la llave correspondiente. La organización directa es útil para archivos donde los accesos deben realizarse por llave, accediéndose siempre a registros concretos. Si la información se va a procesar en conjunto, con frecuencia puede ser más rentable una organización secuencial indexada. 3.- BASES DE DATOS: CONCEPTOS Y TIPOS. En una aplicación convencional con archivos, éstos se diseñan de acuerdo con los programas. Es decir, una vez planteado el problema, se decide si debe haber archivos, cuántos deben ser, qué organización tendrán, que información contendrá cada uno, que programas actuaran sobre ellos y cómo lo harán. Esto tiene la ventaja, en principio, de que los programas son bastante eficientes, ya que la estructura de un archivo está pensada “para el programa” que lo va a utilizar. Capítulo 6: Organización de los datos. Página 15. Sin embargo, conlleva graves inconvenientes. Por un lado, los programas que se realizan con posterioridad a la creación de un archivo pueden ser muy lentos, al tener que usar una organización pensada y creada “ la medida” de otro programa previo que realiza procesos diferentes. Por otra parte, si se toma la decisión de crear nuevos archivos para los programas que se han de realizar, se puede entrar en un proceso de degeneración de la aplicación, ya que: gran parte de la información aparecerá duplicada en más de un archivo (redundancias) ocupando la aplicación más espacio del necesario; al existir la misma información en varios archivos, los procesos de actualización se complican; se corre el riesgo de tener datos incongruentes entre los distintos archivos. Por ejemplo, tener dos domicilios diferentes de un mismo individuo en dos archivos distintos (por estar uno actualizado y el otro no ). En una aplicación convencional con archivos aparecen, pues, los siguientes problemas: Dificultad de mantenimiento. Si hay archivos con información parcialmente duplicada, realizar las actualizaciones necesarias es un problema complejo y costoso. Normalmente, es necesario actualizar varios archivos con diferentes organizaciones. Si la actualización no se realiza correctamente se tendrán informaciones incoherentes. Redundancia. Se dice que hay redundancia cuando hay datos que no aportan información. Es decir, su valor se puede deducir del de otros datos. Rigidez de búsqueda. El archivo se concibe para acceder a los datos de un determinado modo. Sin embargo, en la mayoría de los casos es necesario (o al menos deseable) combinar acceso secuencial y directo por varias claves. Dependencia con los programas. En un archivo las relaciones existentes entre campos y registros no están plasmadas en modo alguno. Es el programa, que trabaja con el archivo, el que determina en cada caso dichas relaciones. El programa recibe cada vez que lee una cadena de caracteres. Por tanto, la información de dónde comienza y dónde acaba cada campo, su tipo, etc., está controlada y es inherente al programa. Esto implica que cualquier modificación de la estructura de un archivo obliga a modificar todos los programas que lo usen. Esto ocurre aun en el caso de que la alteración sea ajena al programa. Así, si se aumenta la longitud de un campo habrá que modificar incluso los programas que no lo usan. Confidencialidad y seguridad. Uno de los mayores problemas de cualquier sistema de información es mantener la reserva necesaria sobre los datos que contiene. Esto es, por un lado, impedir la consulta de determinados usuarios a determinados datos (confidencialidad), y por otro, impedir modificaciones provocadas por usuarios no autorizados (seguridad). Si se está trabajando con archivos el control deberá realizarlo el propio programa. En cualquier caso no se podrá impedir que alguien construya un programa para modificar o ver el contenido del archivo, si el sistema operativo le permite el acceso. 3.1.- Concepto de base de datos. Las bases de datos surgen como alternativa a los sistemas de archivos, intentando eliminar o al menos reducir sus inconvenientes. Podemos definir una base de datos así: Una base de datos es un sistema formado por un conjunto de datos y un paquete software para gestión de dicho conjunto de datos de tal modo que: se controla el almacenamiento de datos redundantes, los datos resultan independientes de los programas que los usan, se almacenan las relaciones entre los datos junto con éstos y se puede acceder a los datos de diversas formas. Capítulo 6: Organización de los datos. Página 16. En una base de datos se almacenan las relaciones entre datos junto a los datos. Esto, y el utilizar como unidad de almacenamiento el campo además del registro, es el fundamento de la independencia con los programas de aplicación. En cualquier base de datos se puede tolerar un cierto nivel de redundancia. Se utilizan las redundancias, bien para hacer más rápido el acceso, o bien para asegurar la integridad de los datos. En cualquier caso, la gestión de la información redundante es interna a la base de datos. Normalmente la definición del concepto de base de datos se realiza en forma de requerimientos u objetivos que ésta debe cumplir. Aunque la definición anterior es suficientemente precisa vamos a exponer algunos requisitos que debe cumplir un buen sistema de base de datos. Acceso múltiple. Diversos usuarios pueden acceder a la base de datos, sin que se produzcan conflictos, ni visiones incoherentes. Utilización múltiple. Cada usuario podrá tener una imagen o visión particular de la estructura de la base de datos. Flexibilidad. Se podrán usar distintos métodos de acceso, con tiempos de respuesta razonablemente pequeños. Confidencialidad y seguridad. Se controlará el acceso a los datos (a nivel de campo), impidiéndoselo a los usuarios no autorizados. Uno concreto podrá acceder a unos datos y a otros datos no. Protección contra fallos. Deben existir mecanismos concretos de recuperación en caso de fallo de la computadora. Independencia física. Se puede cambiar el soporte físico de la base de datos sin que esto repercuta en la base de datos ni en los programas que la utilizan. Independencia lógica. Se pueden modificar los datos contenidos en la base, las relaciones existentes entre ellos o incluir nuevos datos, sin afectar a los programas que la usan. Redundancia controlada. Los datos se almacenan una sola vez. Interfaz de alto nivel. Existe una forma sencilla y cómoda de utilizar la base al menos desde un lenguaje de programación de alto nivel. Interrogación directa (“query”). Existe una utilidad que permite el acceso a los datos de forma interactiva o conversacional. 3.2.- Estructura general de una base de datos. En una base de datos se almacena información de una serie de objetos o elementos. Estos objetos reciben el nombre de entidades, siendo una entidad cualquier ente sobre el que se almacena información. Así, en una base de datos académicos podrá existir información de las siguientes entidades: alumno, profesor, asignatura, centro, plan de estudios, curso, etc. En una base de datos comerciales de una empresa podrán aparecer las siguientes entidades: cliente, producto, vendedor, etc. De cada entidad se almacenan una serie de datos que se denominan atributos de la entidad. Puede ser atributo de una entidad cualquier característica o propiedad de ésta. Así por ejemplo, son atributos de la entidad alumno: DNI, apellidos y nombre, sexo, fecha de nacimiento, nacionalidad, etc. Capítulo 6: Organización de los datos. Página 17. Las entidades y los atributos son conceptos abstractos. En una base de datos la información de cada entidad se almacena en registros, y cada atributo en campos de dicho registro, de forma análoga al almacenamiento en archivos. Sin embargo, cada entidad necesita registros con una estructura específica, mientras que en un archivo todos los registros tienen la misma estructura. Por tanto, en una base de datos hay diferentes tipos de registros, uno por cada entidad. Normalmente se reserva el nombre "registro" para especificar un "tipo de registro", utilizándose otros nombres para especificar cada una de las apariciones de ese registro en la base de datos, tales como: elemento, valor actual de registro, u ocurrencia de registro. Normalmente, no es necesario conocer los valores de todos los atributos de una entidad para determinar si dos elementos son iguales. Por lo general, es suficiente con conocer el valor de uno o varios atributos para identificar un elemento. Pues bien, diremos que un conjunto de atributos de una entidad es un identificador o clave primaria de dicha entidad si el valor de dichos atributos determina de forma unívoca cada uno de los elementos de dicha entidad, y no existe ningún subconjunto de él que sea identificador de la entidad. Por ejemplo, en la entidad alumno el atributo DNI es un identificador. También es un identificador de esta entidad el conjunto de los atributos: apellidos y nombre, fecha de nacimiento y lugar de nacimiento. Frecuentemente, es necesario buscar una ocurrencia de un registro en una base de datos conociendo el valor de uno o varios campos. Para que esta operación sea rápida, estos campos deben estar definidos en la base de datos como llave de búsqueda de dicho registro. En general, podemos decir que una llave es un campo o conjunto de campos, cuyos valores permiten localizar de forma rápida ocurrencias de un registro. La llave puede corresponderse con un identificador de la entidad. Si esto no ocurre podrá haber varias ocurrencias de registro con el mismo valor de llave, entonces se dice que la llave admite duplicados. En una base de datos se almacenan además de las entidades, las relaciones existentes entre ellas. Así, por ejemplo, en la base de datos académicos antes citada hay relaciones entre las siguientes entidades: cursos y alumnos, alumnos y profesores, profesores y asignaturas. Estas relaciones se almacenan con punteros que inserta automáticamente el sistema de gestión de la base de datos; es decir, los punteros son "transparentes" al usuario. Las relaciones entre entidades pueden ser simples o complejas (figura 12). Una relación es simple cuando biunívova, es decir, a cada elemento de una entidad le corresponde un único elemento de la otra. Es simple la relación existente entre alumno y expediente o profesor y horario. Cualquier relación que no sea biunívoca se dice que es compleja. Una relación es compleja cuando un elemento de una entidad está relacionado con varios elementos de la otra (relación de uno a muchos), o bien, cuando varios elementos de una entidad están relacionados con varios elementos de la otra (relación muchos a muchos). Por ejemplo, es una relación de uno a muchos la existente entre un alumno y las asignaturas de las que está matriculado. Y es una relación muchos a muchos la relación existente entre alumno y profesor. Al representar gráficamente la estructura de una base de datos. los registros se simbolizan mediante cajas y las relaciones mediante flechas. Capítulo 6: Organización de los datos. Página 18. Figura 12.- Representación de los distintos tipos de relaciones. No se deben confundir las relaciones con simples referencias. Decimos que existe una referencia entre dos registros cuando un campo de uno de ellos es llave en el otro. Esto permite localizar uno de ellos a partir del otro. Sin embargo, no se trata de una relación. La relación está ligada a la estructura de la base de datos, no al valor de los campos almacenados. Al definir la base de datos se deben especificar cada uno de los registros que la integran, indicando los campos que los componen y las relaciones que los ligan. Tal conjunto de especificaciones recibe el nombre de esquema de la base de datos. El esquema de una base de datos es pues la definición de su estructura lógica. El esquema suele representarse en forma gráfica o por simple enumeración. Para que un programa concreto pueda acceder a una base de datos es necesario especificar la estructura lógica de la parte de base de datos que éste va a usar. La descripción de la estructura lógica de una parte de la base de datos, que va a ser utilizada por uno o más programas, recibe el nombre de vista o subesquema, y estará siempre contenido en el esquema. No obstante, los nombres de campos, registros y relaciones pueden ser diferentes en el esquema y subesquema. El subesquema consigue aislar los programas de la estructura lógica de la base de datos. Por otra parte, permite que varios usuarios utilicen distintas estructuras de una misma base de datos. El subesquema permite además, limitar el acceso a distintas partes de la base de datos, para realizar tan solo determinadas acciones. Y para cada programa que acceda a la base de datos será necesario definir un subesquema. 3.3.- Tipos de bases de datos. Las bases de datos se clasifican tradicionalmente en tres grupos: jerárquicas, en red y relacionales. Las dos primeras se diferencian en los tipos de relaciones que permiten, y puede decirse que la estructura jerárquica es un caso particular de la estructura en red. Cualquier esquema que se cree para una base de datos jerárquica se puede utilizar para una base de datos en red. Las bases de datos relacionales son conceptualmente distintas, y en ellas las relaciones se almacenan y manipulan de forma completamente distinta. 3.3.1.- Bases de datos jerárquicas. En una base de datos jerárquica se establece una relación jerárquica entre los datos en forma de árbol, y no es posible definir relaciones muchos a muchos. Una base de datos jerárquica tiene una estructura semejante a la de la figura 13. Figura 13.- Esquema de una base de datos jerárquica. Para poder dar una caracterización más precisa de este tipo de base de datos se introduce el concepto de conjunto. Un conjunto es una estructura formada por dos registros ligados por una relación uno a muchos. Los registros que forman el conjunto reciben, en éste, los nombres de propietario y miembro, siendo la relación de un propietario a muchos miembros. Una base de datos es jerárquica cuando no permite definir relaciones muchos a muchos y no acepta estructuras en las que un mismo registro sea miembro de dos conjuntos distintos. Capítulo 6: Organización de los datos. Página 19. 3..3.2.- Bases de datos en red. Se trata de un modelo similar al jerárquico, en donde los datos se organizan en grafos, estructuras similares a los arboles que permiten a un nodo tener más de un padre. En una base de datos en red no hay ninguna restricción ni en el tipo de relaciones que se pueden usar, ni en los registros que pueden intervenir en ellas. No obstante, se distinguen entre bases de datos en red simple y bases de datos en red compleja, según permitan o no utilizar relaciones muchos a muchos. 3.3.3.- Bases de datos relacionales. A principios de la década de los setenta, E. F. Codd planteó una alternativa a las bases de datos jerárquicas y en red vistas hasta aquí. Pretendía obtener más flexibilidad que con las bases anteriores y más rigor en el tratamiento de los datos. Una base de datos relacional está formada por tablas. Una tabla es una estructura bidimensional formada por una sucesión de registros del mismo tipo. Si se imponen ciertas condiciones a las tablas, se pueden tratar como relaciones matemáticas. De ahí el nombre de este tipo de bases de datos y el hecho de que a las tablas de una base de datos relacional se les denomine tablas relaciones. Las tablas deben cumplir las siguientes condiciones: Todos los registros de una tabla son del mismo tipo. Para almacenar registros de tipos distintos se usan tablas distintas. En ninguna tabla aparecen campos repetidos. En ninguna tabla existen registros duplicados. El orden de los registros en la tabla es indiferente. En cada momento se pueden recuperar los registros en un orden particular. En cada tabla hay una llave, formada por uno o varios campos. 4.- SISTEMA DE GESTIÓN DE LA BASE DE DATOS (SGBD). Se denomina sistema de gestión de la base de datos ("Data Base Management System") al conjunto de software destinado a la creación, control y manipulación de la información de una base de datos. Concretamente, un SGBD debe permitir la realización de las siguientes tareas: Acceso a los datos desde algún lenguaje de alto nivel. Interrogación (o recuperación de la información) directa en modo conversacional. Definición del esquema de la base de datos y de los distintos subesquemas. Organización física de la base de datos y recuperación tras fallos del sistema. Las tres primeras funciones se realizan mediante dos lenguajes específicos: .Lenguaje de manipulación de datos (DML, "Data Manipulation Language»). Se utiliza para el acceso a la base de datos desde lenguajes de alto nivelo en modo conversacional. .Lenguaje de descripción de datos (DDL, "Data Description Language» ). Es usado para la descripción del esquema y de los subesquemas. El sistema de gestión de la base de datos actúa como intermediario entre los programas de aplicación y el sistema operativo, lo que permite que los programas sean independientes de la estructura física de los datos. 4.1.- Sistemas de gestión de bases de datos relacionales. Tanto el DDL como el DML de un sistema de base de datos relacional, son diferentes a los de las bases de datos jerárquicas y en red descritos en los apartados anteriores. Se describirán brevemente aquí ambos lenguajes para bases de datos relacionales. Capítulo 6: Organización de los datos. Página 20. Para definir una base de datos relacional se deben especificar cada una de las tablas que la constituyen. La descripción de una tabla consta de: Nombre de la tabla. Descripción de los campos de que consta cada registro de la tabla. La descripción de los campos es semejante a la realizada para sistemas en red. Nombre de los campos que se usan como llave. Las sentencias del DML de una base de datos relacional realizan operaciones con las tablas. Algunas de estas operaciones son: proyectar, seleccionar y componer o unir. La proyección de una tabla es otra tabla que contiene los mismos registros que la tabla de partida, y sólo determinadas columnas. Al proyectar una tabla se especifican las columnas que se desean obtener. Una selección en una tabla produce como resultado otra tabla que contiene los registros que cumplen una determinada condición. La condición se expresa en función de los valores de los campos. La tabla creada al seleccionar contiene todas las columnas de la tabla original. La composición o unión es una operación que se realiza con dos tablas, para producir una nueva tabla. La unión se realiza en base al valor de algún campo. Para cada par de registros de las tablas a componer, que tengan el mismo valor en dicho campo, se añade un registro en la tabla de salida. La tabla de salida contiene los campos que se encuentran en alguna de las tablas de entrada. .La manipulación de una base de datos relacional es muy distinta a la de estructura en red. En una base de datos en red el usuario se mueve por la estructura, mientras que en una base de datos relacional, realiza operaciones con tablas.