Tema 11. Modelo en red Juan Ignacio Rodr´ıguez de Leon ´ Resumen Conceptos b´asicos. Diagramas de estructura de datos. El modelo CODASYL DBTG
´ Indice 1. Introduccion ´ 1.1. Registros, tipos de registros y datos . . . . . . . 1.2. Conjuntos, Tipos de Conjuntos e Instancias . . 1.3. Restricciones de los miembros de un conjunto 1.4. Tipos especiales de conjuntos . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
2 2 3 4 5
2. Base de datos de ejemplo
6
3. Facilidades para la recuperacion ´ de datos ´ 3.1. Area de trabajo de programa . . . . . . . . . . . . . . . . . .
8 8
4. Ordenes de recuperacion ´ (get) y navegacion ´ (find) 4.1. Acceso a registros individuales . . . . . . . . . 4.2. Acceso a registros dentro de un conjunto . . . 4.3. Predicados . . . . . . . . . . . . . . . . . . . . . 4.4. Insercion ´ y modificacion ´ . . . . . . . . . . . . . 4.5. Ordenacion ´ . . . . . . . . . . . . . . . . . . . . .
1
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
9 9 10 11 11 11
1
´ INTRODUCCION
1.
2
Introduccion ´
El modelo de red es, actualmente, una de las tres formas de organizar la informacion ´ m´as utilizada en los sistemas comerciales de bases de datos. Historicamente, las estructuras y el lenguaje del modelo fueron definidas ´ por el comit´e CODASYL por lo que, en mucha de la bibliograf´ıa existente, al modelo en red se le denomina CODASYL. Posteriormente, el ANSI (American National Standards Institute) realizo´ algunas modificaciones y recomendaciones sobre el lenguaje. Como se ver´a a lo largo del desarrollo de este cap´ıtulo,el lenguaje de un sistema en red no es como SQL, un lenguaje autonomo en s´ı, sino que se ´ compone de una serie de funciones que habr´a que usar de manera inmersa dentro de un lenguaje anfitrion. y debido a que es uno de ´ Para este proposito, ´ los lenguajes m´as difundidos, se utilizar´a PASCAL como lenguaje anfitrion, ´ (aunque, en funcion ´ del lenguaje comercial en cuestion, ´ el lenguaje puede ser otro, como C, COBOL, etc...) El nombre de las funciones de un sistema de red tambi´en var´ıa en funcion ´ del producto comercial con que se trabaje, aunque la funcion ´ en si sea la misma. Por ello, en este cap´ıtulo se nombrar´an estas funciones de una manera general y sin particularizar en un sistema concreto, pero teniendo bien claro que cualquiera de las funciones utilizadas aqu´ı tendr´a una homologo en el sistema comercial utilizado. ´ Visto esto, la idea que debe sacarse en claro es que lo importante de este cap´ıtulo es asimilar el funcionamiento y la manera de trabajar de un sistema en red. Antes de pasar a describir y utilizar el lenguaje en s´ı, se definir´an de manera muy breve las estructuras b´asicas de datos que componen un sistema en red.
1.1.
Registros, tipos de registros y datos
En el modelo relacional, los datos y las relaciones entre ellos se representan mediante una coleccion ´ de tablas. En el modelo en red, los datos se representan como colecciones de registros, y las relaciones entre los datos se representan mediante enlaces. Un registro es un conjunto de valores de datos relacionados. Se clasifican en tipos de registros, donde cada tipo describe la estructura de un grupo de registros que almacenan la misma informacion. ´ Por ejemplo, un Tipo de registro ESTUDIANTE podr´ıa ser: DNI
ESTUDIANTE NOMBRE APELLIDOS
DIRECCION
Mientras que una instancia de este tipo de Registro podr´ıa ser la siguiente:
1
´ INTRODUCCION 81211871
3 Antonio
Garc´ıa
Castellana, 2
A diferencia de las base de datos relacionales, cuyos registros se engloban dentro de la estructura de la tabla relacional, los sistemas en red presentan un nuevo tipo de estructura denominada conjunto, que, como se ver´a posteriormente, permite enlazar unos registros con otros.
1.2.
Conjuntos, Tipos de Conjuntos e Instancias
Un tipo de conjunto es una descripcion ´ de 1 : n relaciones entre dos tipos de registros, Este tipo de estructuras se representan habitualmente por un diagrama de Bachman, el cual se compone generalmente de: Un nombre para el tipo de conjunto Un tipo de registro propietario Un tipo de registro miembro Un ejemplo de un conjunto que representa la relacion ´ ente las asignaturas en las cuales est´a matriculado un alumno podr´ıa representarse de la siguiente manera:
DNI
ESTUDIANTE NOMBRE APELLIDOS
DIRECCION
↓ ESTUDIA REG-ASIG
ASIGNATURA NOMBRE CARRERA
CURSO
Donde el tipo de registro ESTUDIANTE es el tipo de registro propietario, ASIGNATURA es el tipo de registro miembro y ESTUDIA, el tipo de conjunto. Los tipos de conjunto, al igual que los tipos de registros, presentan tambi´en instancias de conjuntos o, como aparece en gran parte de la bibliograf´ıa, ocurrencias de conjuntos. Una ocurrencia de conjunto est´a compuesta por: Una instancia de registro propietario Un numero cualquiera de ocurrencias de un registro miembro ´ Una estructura de datos, generalmente del tipo de lista doblemente enlazada
1
´ INTRODUCCION
4
Una ocurrencia de conjunto podr´ıa ser, por ejemplo, la representada en la figura 1, en la que, como puede verse, aparece un registro propietario (ESTUDIANTE) enlazado con tres registros miembros. Este tipo de estructura de datos suele implementarse mediante listas enlazadas o doblemente enlazadas, de manera que desde el registro propietario es posible acceder a cualquiera de las instancias de registro que pertenecen a esa ocurrencia de conjunto. Una base de datos, planteada segun ´ este modelo, consistir´a en una serie de tipos de conjuntos entrelazados entre si de manera que un tipo de registro que en una ocurrencia de conjunto funciona como propietario, en otra ocurrencia de otro tipo de conjunto funciona como miembro.
Figura 1: Ocurrencia de conjunto
1.3.
Restricciones de los miembros de un conjunto
En el modelo de red, existen ciertas restricciones que pueden especificarse sobre los miembros de un conjunto. Estas restricciones pueden ser de dos tipos: Restricciones de insercion ´ Restricciones de mantenimiento Las restricciones de insercion ´ especifican de que manera se deben insertar los miembros de un conjunto. A diferencia de otro tipo de base de datos, aqu´ı es posible especificar, cuando se definen los conjuntos, como queremos que los nuevos registros se anadan a los existentes. Existen dos opciones: ˜ Autom´atica La ocurrencia del registro que se anade a la base de datos ˜ queda conectada autom´aticamente a una ocurrencia del conjunto.
1
´ INTRODUCCION
5
Manual Cuando se anade una ocurrencia nueva de registro a la base de ˜ datos,esta no se conecta a ninguna ocurrencia de conjunto sino que, mediante ciertas funciones que se ver´an posteriormente, el usuario lo debe conectar de manera manual. Las restricciones de mantenimiento especifican como deben existir los registros miembros dentro de una base de datos, es decir, si pueden existir sin un propietario o si, por el contrario, no tiene cabida en la base de datos si no est´an ligados a una ocurrencia de conjunto. Existen entonces tres opciones: Opcional Un registro miembro puede existir en la base de datos sin estar conectado a ninguna ocurrencia de conjunto. Estos tipos de registro pueden conectarse y desconectarse de una ocurrencia de conjunto a voluntad. Obligatoria Un registro miembro no puede existir en la base de datos sin un propietario, es decir, debe ser siempre miembro de una ocurrencia de conjunto. Pueden ser reconectado de una ocurrencia de conjunto a otra en un solo paso, utilizando para ello el comando RECONNECT. Fija Un registro miembro no puede existir sin un propietario y, adem´as, una vez conectado por primera vez ya no puede reconectarse a ninguna otra ocurrencia de conjunto.
1.4.
Tipos especiales de conjuntos
Existen tres tipos especiales de conjuntos en CODASYL. Conjuntos sistema-propietario: son aquellos en los que no existe un tipo de registro propietario como tal, sino que es el propio sistema el que actua ´ como propietario del mismo. Este tipo de conjuntos tiene dos funciones muy importantes dentro de un sistema de red: • Proporciona un punto de entrada a la base de datos, mediante la especificacion ´ de alguno de sus registros miembros. • Pueden ser utilizados para ordenar las ocurrencias de un determinado tipo de registro usando las debidas condiciones de ordenacion. ´ Conjuntos multi-miembros: son aquellos en los que los tipos de registros miembro pueden ser m´as de uno. Conjuntos recursivos: Son aquellos en los que el mismo tipo de registro representa un papel de miembro y propietario a la vez, como en la figura 2:
2
BASE DE DATOS DE EJEMPLO
6
Figura 2: Conjuntos recursivos
2.
Base de datos de ejemplo
Figura 3: Base de datos de ejemplo
Para los problemas del libro, y cuando ha salido este tema en el examen, se ha usado la base de datos cuya representacion ´ gr´afica es la de la figura 3, que explicaremos a continuacion: ´ La base de datos guarda informacion ´ sobre los EMPLEADOS de una empresa. Un empleado puede tener, mediante el subconjunto SUBORDINADOS, a un grupo de empleados a su cargo. Tambi´en se almacena informacion ´ sobre los DEPARTAMENTOS de la empresa, donde cada departamento tiene asociando a un conjunto de empleados mediante el conjunto ESTA-EN. A su vez, mediante en conjunto CONTROL, cada departamento se encontrar´a trabajando en unos determinados PROYECTOS, los cuales a trav´es de los conjuntos TRAB-PROY y TRABAJA-EN tendr´an asignados un grupo de empleados.
2
BASE DE DATOS DE EJEMPLO
7
Por ultimo, existe un tipo de registro denominado SUPERVISOR, en el ´ cual se encuentran los DNI de los directores de la empresa. Este tipo de registro est´a asociado a dos conjuntos distintos: Por una parte es propietario del conjunto SUPERVISA, lo cual significa que cada SUPERVISOR llevar´a asociado una lista enlazada de EMPLEADOS a sus ordenes. Adem´as, el tipo de registro SUPERVISOR es miembro del conjunto ES-SUPERV, lo que significa que cada empleado llevar´a asociado una lista enlazada de SUPERVISORES, los cuales son jefes suyos. A la base de datos se entra mediante el conjunto DEPARTAMENTOS, que es propiedad del sistema. Un ejemplo de consulta a esta base de datos podr´ıa ser: Encontrar e imprimir el salario de todos los empleados que trabajan en el departamento de nombre “ventas”. departmento.nombre := ’ventas’; find any departamento using nombre; if DB-Status = 0 then begin find first empleado within trabaje-en; while DB-Status = 0 do begin get empleado; writeln(empleado.salario); find next empleado within trabaja-en; end; end; Mediante la funcion ´ find any se encuentra el primer departamento cuyo nombre sea “ventas” (Se supone que solo ´ habr´a uno). Si el resultado es satisfactorio (DB-Status=0), habremos localizado correctamente el departamento de ventas. Lo que se hace a continuacion ´ es avanzar por la lista enlazada, de la cual el es propietario ese departamento segun ´ el conjunto trabaja-en, obteniendo por tanto todos los registros de empleados asignados al departamento. Mientras vaya encontrado registros imprime los salarios correspondientes. Cuando DB-Status sea distinto de cero significa que hemos terminado, y salimos del bucle. Veremos con m´as detalle las particularidades de las ordenes find y get en la siguiente seccion. ´
3
´ DE DATOS FACILIDADES PARA LA RECUPERACION
3. 3.1.
8
Facilidades para la recuperacion ´ de datos ´ Area de trabajo de programa
Todo programa que se ejecute en un sistema consta de una secuencia de ordenes; algunas son propias del lenguaje anfitrion ´ utilizado, mientras que otras ser´an sentencias de ordenes DBTG. Cada programa en ejecucion ´ ´ se denomina unidad de ejecucion ´ (run unit). Para cada programa, el sistema mantiene un a´ rea de trabajo (Denominada en el modelo DBTG como a´ rea de trabajo de usuario, user work area) que contiene las siguientes variables: Plantillas de registro: Un registro (entendido como registro en el lenguaje anfitrion, ´ por ejemplo, un registro Pascal) para cada tipo de registro utilizado por la aplicacion. ´ Punteros de actualidad (Currency pointers): Un conjunto de punteros a diversos registros de la base de datos que apuntan al registro accedido m´as recientemente por el programa. Los punteros de actualidad pueden ser de varios tipos: • Punteros actual al tipo de registro: Un puntero para cada tipo de registro T referenciado por el programa; cada puntero contiene la direccion ´ (localizacion ´ en disco) del tipo de registro T accedido m´as recientemente. • Punteros actual al tipo de conjunto: Un puntero que, para cada tipo de conjunto definido en el esquema de la base de datos, especifica la ultima ocurrencia a la que se ha accedido. Como ´ cuando se accede a una ocurrencia de conjunto, a lo que se accede de verdad es a un registro, este puntero senalar´ a al registro ˜ accedido de esa ocurrencia de conjunto. • Puntero actual de unidad de ejecucion: puntero, que ´ Un unico ´ contiene la direccion registro (independientemente de ´ del ultimo ´ su tipo) accedido por la aplicacion. ´ Indicadores de estado, que son un conjunto de variables que utiliza el sistema para comunicar a la aplicacion ´ el resultado de la ultima ´ operacion ´ aplicada a la base de datos. La m´as usado con diferencia es la variable DB-status, que valdr´a 0 si la operacion ´ tuvo e´ xito o un codigo de error en caso contrario. Por ejemplo, el resultado de una ´ operacion ´ puede ser la excepcion ´ FIN-DE-CONJUNTO (EOS, Endof-set), que indicar´ıa que no existen m´as registros miembros dentro de una ocurrencia de conjunto. Esta situacion ´ se produce cuando cuando una orden DML que intenta encontrar el siguiente o el anterior miembro de una ocurrencia de conjunto, encuentra que no existe
4
´ (GET) Y NAVEGACION ´ (FIND) ORDENES DE RECUPERACION
9
ninguno m´as. Por lo tanto, es habitual comprobar esta variable como condicion ´ de salida de un bucle. Las dem´as variables (DB-set-name, DB-record-name, y DBdata-name) se utilizan en caso de fallo, para obtener informacion ´ adicional del mismo.
4.
Ordenes de recuperacion ´ (get) y navegacion ´ (find) Las dos ordenes m´as usadas en este tipo de sistemas son get y find.
find Localiza un registro en la base de datos, y actualiza los punteros correspondientes. get copia el registro al que apunta el puntero de la unidad de ejecucion ´ en el a´ rea de trabajo, en el registro patron ´ correspondiente.
4.1.
Acceso a registros individuales
La orden find se puede usar de diferentes formas, solo ´ se ver´an algunas de ellas. Hay dos maneras diferentes de localizar un registro individual. La forma m´as simple ser´ıa: find any [record type] using [record-field] Este mandato localiza un registro de tipo record type cuyo valor en record-field sea el mismo que el valor de record-field que hubiera en el registro patron ´ en el a´ rea de trabajo. Una vez que el sistema localiza el registro buscado, ajusta los punteros de forma que: el puntero de la unidad de ejecucion ´ actual apunta al registro buscado. el puntero al tipo de registro actual apunta al tipo del registro buscado (record-type). el puntero de conjunto actual para cualquier conjunto en el que pueda estar incluido dicho record type es actualizado, apuntando o bien a un tipo propietario o bien a un tipo miembro. Puede haber varios registros con el mismo valor especificado. La orden find encuentra el primero, siguiendo una ordenacion ´ que ha sido previamente especificada. Para localizar el resto de registros, se usa la orden find duplicate, como en el siguiente ejemplo: find duplicate [record type] using [record-field]
4
´ (GET) Y NAVEGACION ´ (FIND) ORDENES DE RECUPERACION
10
que localiza el siguiente registro (segun ´ la ordenacion ´ preasignada) cuyo valor sea igual al especificado en el patron. ´ Los punteros que se enumeraron antes se ven afectados consecuentemente. Como ejemplo, veamos el siguiente fragmento de programa, que imprime los clientes que viven en la ciudad de Harrison. customer.customer-city := "Harrison"; find any customer using customer-city; while DB-status = 0 do begin get customer; print (customer.customer-name); find duplicate customer using customer-city; end; Se ha englobado parte de la busqueda en un bucle, porque ignoramos el ´ numero de clientes que encontraremos. Salimos del bucle cuando la variable ´ especial DB-status sea distinta de cero. Recu´erdese que un valor distinto de cero indica que se ha fallado en la busqueda del siguiente cliente, lo que ´ significa que ya hemos recorrido todos los clientes de Harrison.
4.2.
Acceso a registros dentro de un conjunto
La sentencia find vista anteriormente busca cualquier registro del tipo indicado. Veremos ahora como localizar registros dentro de un conjunto. El conjunto en cuestion ´ ser´a el que est´e referenciado por el puntero de conjunto actual. Hay tres tipos diferentes de ordenes. La orden de busqueda b´asica ´ ´ es: find first [record type] within [set-type] Que localiza al primer registro de tipo record type en el conjunto actual de tipo set-type. para iterar sobre el resto de registros en el conjunto, se ejecuta repetidamente la siguiente orden: find next [record type] within [set-type] Es necesario especificar el tipo de registro porque el conjunto podr´ıa contener registros de diferentes tipos. Tambi´en podemos usar una orden find para encontrar al registro propietario de una determinada ocurrencia de conjunto: find owner within [set-type]
4
´ (GET) Y NAVEGACION ´ (FIND) ORDENES DE RECUPERACION
4.3.
11
Predicados
Para poder realizar una busqueda que contemple un rango de valores, ´ y no un unico valor, debemos obtener todos los registros pertinentes en me´ moria, y examinar cada uno de ellos separadamente para poder determinar el valor de la condicion ´ de busqueda. ´ Como ejemplo, consid´erese el siguiente fragmento de codigo, que obtie´ ne el numero total de cuentas en la sucursal de Perryridge con un balance ´ mayor que 10.000$. count := 0; branch.branch-name := "Perryridge"; find any branch using branch-name; find first account within account-branch; while DB-status = 0 do begin get account; if account.balance > 10000 then count := count + 1; find next account within account-branch; end print (count);
4.4.
Insercion ´ y modificacion ´
La creacion ´ y el borrado de nuevos registros se realiza mediante las ordenes store y erase. Las modificaciones se realizan con el mandato modify. Las primitivas connect, disconnect y reconnect permiten insertar o sustraer registros de una instancia de conjunto. Cuando se define un conjunto, se debe especificar la manera en que los registros deben ser insertados, y bajo que condiciones se permite que puedan ser transferidos de una ocurrencia a otra. Un registro reci´en creado puede ser anadido a una ocurrencia de conjunto bien expl´ıcitamente o ˜ impl´ıcitamente. Esta distincion ´ se especifica en el momento de definir el conjunto, mediante la opcion ´ insertion is con los valores manual o automatic.
4.5.
Ordenacion ´
Los registros miembros de un conjunto pueden ser ordenados de diferentes maneras. El tipo de ordenacion ´ a utilizar se especifica por el programador mediante la orden: order is [order-mode] Donde order-mode puede ser uno de los siguientes valores:
4
´ (GET) Y NAVEGACION ´ (FIND) ORDENES DE RECUPERACION
12
first Al anadir un registro a un conjunto, se inserta el primero. El orden, ˜ por tanto, es cronologico inverso. ´ last Al anadir un registro a un conjunto, se inserta el ultimo. El orden, por ˜ ´ tanto, es cronologico. ´ next Si el puntero actual senala al registro x, el nuevo registro se inserta ˜ justo a continuacion ´ de x prior Si el puntero actual senala al registro x, el nuevo registro se inserta ˜ justo antes de x system default El orden es decidido de forma arbitraria por el sistema. sorted Las inserciones se realizan de forma que el conjunto se mantenga ordenado con respecto a los valores de un determinado campo, especificado por el programado a la hora de definir el conjunto. Se debe indicar si se desea un orden ascendente o descendente.