Después de los archivos de acceso aleatorio que explicaba en otro post, aparece el acceso indexado para corregir los principales inconvenientes de aquellos. Los archivos de acceso aleatorio suponían una reducción considerable en el tiempo de búsqueda de un dato sobre los archivos de acceso secuencial. Sin embargo, habia que conocer exactamente el número de registro del dato que querías buscar, lo cual es muy poco práctico, ya que normalmente querremos buscar por valores en los distintos campos.

Veámoslo con nuestro personaje Antonio, que cambio de los archivos de acceso secuencial a los archivos de acceso aleatorio. Resulta que al buscar un proveedor por el número de registro, se equivoca muchísimas veces, a él le gustaría poder buscar los datos del proveedor por el nombre del proveedor o por el nombre del contacto. Pero al tener que hacerlo por el número de registro, en no pocas ocasiones no consigue recordar este dato.

Para solucionar este tema, se comenzó a trabajar con índices. Un índice no es más que un campo que se emplea como clave para agilizar la búsqueda de registros. En los archivos de acceso aleatorio, el índice era el número de registro y ahora queremos que el índice sea un campo del registro por el que poder buscar.

Básicamente, lo que hacemos es construir una estructura adicional que, para los valores del campo escogido como índice, recoge todas las direcciones de comienzo de los registros que tienen dicho valor. Tendremos que crear una estructura para cada índice que escojamos, en el caso que nos ocupa, dos estructuras: para el campo nombre del proveedor y para el campo contacto del proveedor.

Lo bueno es que estas estructuras se cargan en la RAM y por tanto el acceso es mucho más rápido que con los ficheros secuenciales que íbamos a la memoria secundaria (discos duros).

Cuando un campo es utilizado como índice, se dice que dicho campo está indexado. De similar forma, hablamos de acceso indexado cuando trabajamos con estas estructuras de índices para acceder a los datos más rápidamente.

Ejemplo de acceso indexado

Tras explicar los archivos de acceso secuencial y los de acceso aleatorio, le toca el turno al acceso indexado. Recordemos que, aunque el acceso aleatorio supuso una mejora de la velocidad de acceso a datos, estábamos obligados a conocer el número de registro que estábamos buscando, ya que era a través de este parámetro como nos situábamos en la zona de memoria donde estaban los datos que buscábamos. Esta manera de trabajar, aunque fuera rápida, era bastante engorrosa, en la practica lo que se necesitaba era poder buscar por los valores de un parámetro, no por el número de registro.

Para entenderlo mejor, veámoslo con el ejemplo de nuestro ya viejo conocido Antonio y su supermercado Gades.

Paso 1: El fichero de partida.

Vamos a modificar ligeramente el fichero de proveedores que habíamos venido utilizando, para poder explicar mejor las estructuras de índices. Para ello, represento el fichero por registros, como si fuera una tabla, en lugar de por líneas en el archivo. Creo que se entenderá mejor con esta representación.

El fichero proveedores quedaría:

El número de registro no vamos a usarlo, pero lo mantengo para que se entienda la estructura y se aprecie que partimos del fichero ordenado por número de registro.

Paso 2: Indexamos por el campo nombre de Proveedor

En este caso estamos hablando de un índice sin duplicados, asumimos que no puede haber dos proveedores con el mismo nombre, es decir, no puede haber dos registros que tengan el mismo valor para el campo de nombre de proveedor.

Se crearía una estructura que para cada valor del campo nombre de proveedor guardaríamos la dirección del registro que tiene dicho valor:

La relación entre esta estructura de índices y los registros de nuestro archivo sería:

Donde básicamente quiero representar que cada dirección asociada a una clave en la estructura que hemos creado, apunta a la dirección de memoria del registro cuyo valor en el campo indexado es igual a la clave.

Paso 3: Empleando la estructura de índices para las búsquedas

Con la estructura de índices creada, Antonio ya puede buscar un proveedor por su nombre. Como esta estructura está en la memoria del sistema, la consulta será rápida, y obtendremos la dirección en memoria secundaria donde ir a buscar el registro con el nombre de proveedor seleccionado.

De momento, estamos recorriendo la estructura de claves de forma secuencial, pero veremos más adelante que existen maneras más eficientes de hacerlo.

Paso 4: Indexando por el campo contacto de proveedor

La principal diferencia de este campo con respecto al nombre de proveedor, que hemos usado en el paso 2 como índice, es que contacto de proveedor admite duplicados. En la practica esto significa que para una clave podemos tener varios registros que tengan la clave en el campo indexado, luego necesitaremos la dirección en memoria de cada uno de esos registros.

En el ejemplo que venimos manejando, el contacto de los proveedores “Azucarera Sevillana” y “Espárragos Cojonudos” tiene el mismo nombre, da la casualidad que se llaman los dos Rodrigo Mendez, aunque son contactos diferentes.

Puede observarse como la clave “Rodrigo Mendez” tiene dos direcciones, cada una apunta a un registro de los que contienen dicha clave en el campo indexado, en este caso, contacto proveedor.

NOTA:

Este post es parte de la colección “Arquitectura de Datos” que reproduce los apuntes de la clase que imparto sobre el tema en ESIC. Puedes ver el índice de esta colección aquí.