Вы находитесь на странице: 1из 21

Base de Datos

Archivo de datos

1
1.1 Archivos hash y
secuenciales
El almacenamiento en una base de datos se realiza por medio de archivos
físicos que se graban en un disco rígido. Estos archivos cuentan con una
estructura que nos permite realizar diferentes operaciones que se describen
a continuación.

1.1.1 Estructura de archivos

Una base de datos es una colección de archivos


relacionados que permite el manejo de la información de
una entidad. Cada uno de dichos archivos puede ser visto
como una colección de registros y cada registro está
compuesto de una colección de campos. Cada uno de los
campos de cada registro permite llevar información de
algún atributo de una entidad del mundo real. (Cruz
Chávez, 2017, recuperado de https://goo.gl/9Qv0Lw)

Cómo se conforma un archivo

1) Bloque o página: es la unidad más pequeña de conformación y


depende del sistema operativo sobre el cual se monta la base de
datos. Representa la unidad de transferencia de información entre el
disco rígido y la memoria.

2) Clúster: es el conjunto de bloques continuos en el disco rígido.

3) Dirección del bloque: para poder realizar operaciones, ya sea de


entrada o salida de la información, necesitamos conocer el número
de cilindro, pista y bloque (ver Figura 1).

4) Registros: es una colección de campos que se asocia de manera


independiente con un puntero.

5) Archivos: es una secuencia de registros que puede ser de longitud


fija o variable (ver Figura 2).

2
Figura 1: bloque de datos físico

Fuente: Elizondo, 2005, https://goo.gl/tII7nM

Figura 2: organización de archivos

Fuente: Elizondo, 2005, https://goo.gl/tII7nM

Cómo se organizan los archivos

1) Extendida: los espacios libres en cada bloque son ocupados o


aprovechados. Esto se logra almacenando parte del registro
en un bloque y el resto en otro bloque. La concatenación de
los dos bloques se logra por medio de un puntero al final del
bloque, que indica cual es el bloque donde continúa el
registro. Esto se usa cuando el registro es mayor que el
bloque.

2) No extendido: los espacios libres no son utilizados. Esto hace


que el procesamiento de datos sea más simple, pero el
espacio del disco no sea utilizado de manera óptima.

3
3) Archivos desordenados: el orden en este tipo de archivos se
va dando en la medida que los datos se van insertando. Y la
inserción por defecto siempre se realiza al final del archivo.

4) Archivos ordenados o secuenciales: al momento de la


inserción son ordenados físicamente por medio de algún
campo clave. Por ejemplo, en el archivo de artículos, se
ordena por nombre de artículo. Este tipo de archivo se usa
más con un índice primario; sería un archivo secuencial
indexado.

Técnicas de asignación de los bloques de un archivo en disco

1) Contigua: bloques consecutivos de disco. Facilita el doble


búfer y dificulta expandir el fichero.

2) Enlazada: cada bloque tiene un apuntador al siguiente


bloque. Facilita la expansión y dificulta la lectura.

3) Grupos de bloques: combinación de las anteriores. Es un


grupo de bloques consecutivos enlazado con el siguiente
grupo consecutivo.

4) Indexada: bloques que contienen solo índices. Estos son


apuntadores a los bloques que realmente contienen los
datos. (Elizondo, 2005, recuperado de
https://goo.gl/13TYzO)

1.1.2 Operaciones básicas


Las operaciones básicas que podemos hacer con los archivos son:

 Insertar: es una operación que permite poblar la base de datos. Estas


inserciones pueden ser individuales o masivas, de acuerdo con los
casos particulares. Por ejemplo, una inserción individual podría ocurrir
en un sistema de facturación cuando damos de alta un cliente. Un
ejemplo de inserción masiva podría ocurrir, en el mismo sistema de
facturación, al hacer la inserción masiva de todos los artículos
mediante la importación de un archivo externo, por ejemplo, un libro
Excel.

4
 Extracción o recuperación: son operaciones donde se busca un
determinado dato para ser presentado. Esta búsqueda puede ser
realizada con alguna condición para delimitar el universo de archivos
que se deban recorrer. Este tipo de operación no modifica los datos de
los archivos o base de datos. Suele ser llamada operación de lectura.
Un ejemplo para este tipo de operaciones sería el hecho de traer o leer
todos los artículos de un determinado rubro, por ejemplo, listar todos
los artículos del rubro electrónico.

 Actualización de datos: son operaciones donde se busca un


determinado dato o universo de datos, con el fin de realizar una
modificación. Al igual que la inserción, esto se puede hacer de forma
masiva, por ejemplo, si queremos incrementar en un 5 % el precio de
todos los artículos del rubro de electrónica o, de forma individual, si
queremos incrementar el precio de un solo artículo.

 Eliminación de datos: es la operación inversa a la inserción de datos,


que cuenta con la misma dinámica de poder procesar de forma masiva
o de manera individual. Es importante tener presente que en este tipo
de operación —principalmente cuando se hace de manera masiva—,
la recuperación puede que no sea posible. Por esto deberemos estar
muy seguros al momento de hacer la eliminación.

1.1.3 Resolución de conflictos en archivos hash


Una tabla hash es una estructura de datos que también es conocida como
Las tablas hash se tabla fragmentada. Esta estructura está basada en una operación principal
implementan sobre que es la búsqueda que, al asociar claves con valores, permite lograr accesos
vectores de una muy rápidos a la información buscada como, por ejemplo, la búsqueda de
dimensión,
un artículo por su nombre a partir de una clave generada. Lo que hacen estas
generalmente.
tablas es transformar la clave con una función hash en un número hash que
reconoce la posición donde la tabla posee el valor buscado.

5
Figura 3: ejemplo de tabla hash

Fuente: [Imagen sin título sobre tabla hash]. (s. f.). Recuperado de https://goo.gl/Hy50ns

Para conseguir un buen rendimiento de las tablas hash, es vital contar una
buena función, que genere la menor cantidad de colisiones. Cuando una
colisión es generada se resuelve con una búsqueda secuencial. Cuando una
función genera muchos valores iguales las búsquedas son más lentas.

Si contamos con una buena función hash, cuando realicemos un cambio en


la clave por más pequeño que sea (bit), nos dará como resultado un nuevo
Las tablas hash, número hash con más de la mitad de sus bits cambiados.
suelen ser más
lentas de acceder
Encontrar una función hash que evite coaliciones tiene un costo muy alto.
que los índices de
árboles binarios Con lo cual se ha decidido volcar más esfuerzo en resolver el problema de
auto-balanceados, las coaliciones.
por la forma en que
se almacenan los Es recomendable usar la misma función hash para cualquier tamaño de
datos.
arrays. El cálculo de la posición en el array de la tabla hash se hace en dos
pasos:

1) Hash genérico: el valor se calcula mediante el llenado de un entero


natural de máquina.

2) El valor calculado en punto 1, se reduce a un índice válido en el


vector, y su módulo se encuentra de acuerdo con el tamaño del
array.

Como siempre el objetivo es buscar el menor número de coaliciones, el


tamaño del vector de una tabla hash generalmente es un número primo.
Esto evita que los hashes de grandes enteros tengan divisores comunes con
el tamaño de la misma tabla.

¿Cuál es el problema más común en las funciones hash? Es la aglomeración


de valores. Esto se da cuando las claves más usadas caen todas muy cerca.
Esto tal vez lleve a bajar el rendimiento en una tabla de manera significativa.

6
Una forma de depurar el manejo de las colisiones en una tabla hash, puede
ser el utilizar una función hash que devuelva un valor constante. Por ejemplo
1 y que cause colisión en cada inserción.

Funciones hash más usadas

1) Hash de división: dado un diccionario D, se fija un número M >= |D|


(M mayor o igual al tamaño del diccionario) y que sea primo no
cercano a potencia de 2 o de 10. Siendo K la clave a buscar y h(K) la
función hash, se tiene h(K) = K %M (resto de la división k/m).

2) Hash de multiplicación: si, por alguna razón, se necesita una tabla


hash con tantos elementos o punteros como una potencia de 2 o de
10, será mejor usar una función hash de multiplicación,
independientemente del tamaño de la tabla. Se escoge un tamaño
de tabla M >= |D| (M mayor o igual al tamaño del diccionario) y un
cierto número irracional φ (normalmente, se usa 1+5^ (1/2) /2 o 1-
5^ (1/2) /2). De este modo, se define h(K) = Suelo (M*Parte
fraccionaria (K *φ)). (Gómez, 2017, recuperado de
https://goo.gl/3JLvib).

Resolución de colisiones

Hasta ahora hemos mencionado en muchas oportunidades las colisiones,


pero no hemos descripto a ciencia cierta cuándo se originan. Una colisión se
origina cuando dos números de la función hash apuntan al mismo índice.
Como no es posible almacenar dos registros en el mismo lugar, se debe
encontrar una ubicación para el nuevo registro.

El ejemplo típico de colisión es cuando la clave se genera por medio de la


fecha de nacimiento. La función hash correspondiente generará números
aleatorios, pero por más que nuestro vector tenga cerca de un millón de
posiciones hay una posibilidad del 95% que al menos se origine una colisión.

Por suerte esto tiene solución y hay varias técnicas para solucionarlo, pero
las más conocidas son:

 Encadenamiento.
 Direccionamiento abierto.

7
Encadenamiento

El encadenamiento es algo simple, se da cuando una casilla del array hace


referencia a una lista de registros que colisionan en la misma casilla.

Figura 4: ejemplo de encadenamiento

Fuente: [Imagen sin título sobre encadenamiento]. (s. f.). Recuperado de https://goo.gl/B3xN1E

Las principales ventajas del encadenamiento sobre el direccionamiento


directo son:

1) El borrado es simple.

2) El crecimiento de la tabla puede ser pospuesto durante más tiempo,


aun cuando todas las casillas están ocupadas. Las tablas has
encadenadas puede que no requieran crecimiento nunca, debido
que la degradación del rendimiento es lineal en la medida que se va
llenado la tabla. Otra técnica de encadenamiento es usar árboles
auto balanceados.

Direccionamiento abierto

En el caso de las tablas hash de direccionamiento abierto, podemos


almacenar los registros en el array directamente y las colisiones serán
resueltas por medio de un sondeo del array hasta encontrar el registro o
hasta llegar a una casilla vacía.

8
Figura 5: ejemplo de direccionamiento abierto

Fuente: [Imagen sin título sobre direccionamiento abierto]. (s. f.). Recuperado de
https://goo.gl/B3xN1E

Las siguientes son las secuencias de sondeo más usadas:

1) Sondeo lineal: el intervalo entre cada intento es


constante;
2) Sondeo cuadrático: el intervalo entre los intentos
aumenta linealmente;
3) Doble hasheo: el intervalo entre intentos es constante
para cada registro, pero es calculado por otra función
hash. (Gómez, 2017, recuperado de https://goo.gl/3JLvib)

El sondeo lineal favorece el rendimiento del caché, pero es


más sensible a la aglomeración.
El doble hasheo disminuye el rendimiento en el caché, pero
elimina el problema de aglomeración.
El sondeo cuadrático se sitúa en medio.

1.1.4 Hash perfecto y hash dinámico

Hash perfecto

Es cuando se encuentra una función que no duplica los valores de las claves
o genera valores únicos. Como consecuencia de esto no se presentan
colisiones.

9
Hash dinámico

Las estructuras de las tablas hash son del tipo árbol y permiten almacenar
un gran número de información. Su mayor eficiencia la presentan en las
operaciones de inserción, eliminación y búsqueda. Y como desventaja o
problema podemos nombrar dos:

1) La función hash que genere valores únicos no existe.


2) No pueden crecer ya que son estructuras estáticas, debido a que
necesitan un tamaño fijo.

10
1.2 Archivos de índices y
árboles
1.2.1 Archivos de índices
En la unidad anterior, hablamos de los archivos de índices de manera
general. En esta unidad entraremos en detalle. Para ello comenzaremos con
la clasificación de índices:

 Densos: una entrada por cada valor de la clave de indexación.


 No densos o escasos: solo entradas para algunos valores de la clave de
indexación.
 Tipos de índices ordenados de un nivel:
o principal;
o agrupado;
o secundario.
 Índices multinivel:
o índices multinivel
o índices multinivel dinámicos que utilizan árboles B y B+.

Índice principal

 Precondición: fichero de datos ordenado (físico) por campo clave.


 No contiene valores repetidos.
 El archivo índice tiene dos columnas:
o contiene valor del campo clave del primer registro de cada
bloque;
o puntero al bloque que lo contiene.
 Características principales:
o es un índice no denso;
o ocupa menos espacio que el archivo de datos;
o posee registro de longitud fija.
 Más registros del archivo índice por bloque.
 Búsqueda binaria en el archivo índice y lectura del bloque.
 Actualización:
o La inserción es un problema. Pueden cambiar registros anclas
o usar desbordamiento.
o El borrado utiliza un marcador.

11
Figura 6: índice principal

Fuente: Departamento de lenguajes y sistemas informáticos, Universidad de Alicante. (2017).


Recuperado de https://goo.gl/iPU2Zq

Índice agrupado

 Precondición: archivo de datos ordenado (físico) por campo no clave.


 El fichero índice tiene 2 columnas:
o contiene un registro por cada valor distinto del campo agrupado;
o puntero al primer bloque que contiene un registro con ese valor.
 Es un índice no denso.
 Ocupa menos espacio que el archivo de datos; registro de longitud fija.
 Más registros del archivo índice en cada bloque.
 Búsqueda binaria en el archivo índice y lectura del bloque.
 Actualización:
o inserción y borrado son un problema: reservar un bloque o
contiguos por cada valor distinto del campo de indexación.

12
Figura 7: índice agrupado, más de un valor por bloque

Fuente: banco de imágenes de Google.

Figura 8: índice agrupado, bloque por valor

Fuente: banco de imágenes de Google.

13
Índice secundario

 Precondición: el archivo ya tiene índice.


 Generado por clave candidata, no posee valores duplicados.
 Puede haber muchos índices secundarios por archivo de datos.
 Proporcionan orden “lógico” a los registros almacenados.
 El archivo índice tiene dos columnas:
o campo de indexación;
o puntero a bloque o a registro.
 Si es índice por clave candidata:
o hay un registro en el índice por cada registro en el archivo de datos
(índice denso);
o sigue siendo más pequeño que el de datos, lento para búsqueda y
crece proporcionalmente.
 Si es índice por campo no clave, los valores del campo de indexación
se repiten y hay 3 opciones:
o generar índice denso con un registro por cada valor, incluso
repetido;
o índice con registro de longitud variable con un campo
repetitivo de punteros a bloque;
o índice no denso, es decir, cada registro almacena puntero a
bloque de punteros y estos apuntan a registros (usado).

Figura 9: índice secundario, puntero a registro

Fuente: banco de imágenes de Google.

14
Figura 10: índice secundario, puntero a bloque de punteros

Fuente: banco de imágenes de Google.

Índice multinivel

 Se aplican después de generar índice principal, agrupado o secundario.


 Ese índice de 1.er nivel es sobre campo clave, valores no repetidos y
entradas de longitud fija.
 Genera 2.do nivel-principal y toma 1.er nivel como fichero ordenado con
valor distinto en clave.
 2.do nivel posee una entrada por bloque.
 Genera 3.er nivel, si el 2.do nivel ocupa más de un bloque.
 Lo anterior ocurre sucesivamente hasta que las entradas de un mismo
nivel se almacenan en un bloque.

15
Figura 11: Índices multiniveles

Fuente: Banco de imágenes de Google.

1.2.2 Árboles AVL


Los llamados árboles AVL, no son perfectamente equilibrados, pero son lo
suficiente como para ofrecer un comportamiento bastante bueno al ser
Un árbol AVL,
usados. La rama derecha por lo general no difiere en altura en más de una
creado por los unidad de la rama izquierda o viceversa.
matemáticos
rusos Adelson- El factor de equilibrio puede ser almacenado
Velskii y Landis, e directamente en cada nodo o ser computado a partir de
s un tipo especial
de árbol binario.
las alturas de los subárboles. Si, al realizar una operación
de inserción o borrado, se rompe la condición de
equilibrio, hay que realizar una serie de rotaciones de los
nodos para volver a equilibrarlo. (Ponce, 2017,
recuperado de https://goo.gl/Vtbv4z)

16
Figura 12: árbol AVL no equilibrado

Fuente: recuperado de https://es.wikipedia.org/wiki/Árbol_AVL

Figura 13: árbol AVL equilibrado

Fuente: recuperado de https://es.wikipedia.org/wiki/Árbol_AVL

1.2.3 Árboles B y B+
Los índices multinivel dinámico que utilizan árboles B y B+ son casos
especiales de estructuras dinámicas de datos. Permiten implementar índices
multinivel con posibilidad de que un índice se expanda o contraiga. Cada
nodo contiene:

1) un puntero por cada nodo hijo que tiene;


2) valor del campo de indexación.

17
Las dos limitaciones que tienen los árboles de búsqueda son, siendo K un
valor de búsqueda de conjunto ordenado:
 dentro de cada nodo: K1<K2<…<Kq-1;
 para todos los valores de X del subárbol al que apunta Pi,
tenemos que Ki-1<X<Ki. (Rodriguez-Tastets, 2017,
recuperado de https://goo.gl/R8wAIx)

El puntero apunta a un registro o a bloque. Los algoritmos no aseguran


equilibrio ni, por lo tanto, una velocidad de búsqueda no uniforme.

Figura 14: estructura de datos de árbol desequilibrado

Fuente: banco de imágenes de Google.

Figura 15: restricción de búsqueda 1

Fuente: recuperado de http://www.aprenderaprogramar.com/foros/index.php?topic=1436.0

18
Figura 16: restricción de búsqueda 2

Fuente: banco de imágenes de Google.

Árboles B

Los algoritmos de los árboles B son complejos, cada valor del campo de
búsqueda aparece con su puntero, por única vez. Hay otras restricciones
adicionales que aseguran el equilibrio:

1) cada nodo interno es de la forma < P1, , P2, , …, Pq-1, , Pq


> donde q ≤ p, cada Pi es un puntero de árbol (a otro nodo
del árbol) y cada Pri es un puntero a un registro cuyo valor
de clave sea Ki
2) en cada nodo K1 < K2 < … < Kq-1
3) para todo valor X en el subárbol apuntado por Pi, Ki-1 < X
< Ki
4) cada nodo tiene como máximo p punteros de árbol y p-1
pares
5) cada nodo interno (excepto el raíz) tiene como mínimo
p/2 punteros
6) un nodo con q punteros de árbol tiene q-1 valores de
campo clave
7) todos los nodos hoja (punteros a árbol nulos) están al
mismo nivel. (Escuela universitaria de informática, 2017,
recuperado de https://goo.gl/AzqvhV)

19
Figura 17: árboles B balanceados

Fuente: banco de imágenes de Google.

Árboles B+

Los árboles B+ son una variación de los árboles B. Los punteros a datos solo
están en los nodos hoja, con lo cual se logra menos niveles y mayor
capacidad. Los punteros de los nodos hoja pueden ser al:

 Registro, si es campo clave.


 Bloque que contiene el registro con indirección, si no es campo clave.

Los punteros en nodos internos son punteros de árbol a bloque. Los nodos
hoja se encadenan para obtener acceso ordenado a registros.

Figura 18: bloque con puntero a árbol

Fuente: banco de imágenes de Google.

Figura 19: puntero al nodo hoja

Fuente: banco de imágenes de Google.

20
Referencias
Cruz Chávez, M. A., (2017). Recuperado de
http://www.gridmorelos.uaem.mx/~mcruz/cursos/miic/bd1.pdf

Date, C. J. (1986). Introducción a los sistemas de base de datos. México:


Pearson Prentice Hall.

Departamento de lenguajes y sistemas informáticos, Universidad de


Alicante. (2017). Organización física de las bases de datos. Recuperado de
https://rua.ua.es/dspace/bitstream/10045/3444/1/T7OF.pdf

Elizondo, A. J. (2005). Diseños de base de datos. Recuperado de


http://www.unirioja.es/cu/arjaime/Temas/06.Org_interna.pdf

Escuela universitaria de informática. (2017). Organización física de las bases


de datos. Recuperado de
http://users.dsic.upv.es/~jcarlos/docente/bda/tema3_4p.pdf

Gómez, E. (2017). Estructuras de datos en Java. Recuperado de


https://sites.google.com/a/espe.edu.ec/programacion-ii/home/tablas-
hash

[Imagen sin título sobre direccionamiento abierto]. (s. f.). Recuperado de


https://commons.wikimedia.org/wiki/File:Tabla_hash_3.png

[Imagen sin título sobre encadenamiento]. (s. f.). Recuperado de


https://commons.wikimedia.org/wiki/File:Tabla_hash2.png

[Imagen sin título sobre tabla hash]. (s. f.). Recuperado de


https://upload.wikimedia.org/wikipedia/commons/2/2f/Hash_table-es.svg

Ponce, L., (2017). Recuperado de http://ponce-


sistemas.blogspot.com.ar/2010/08/arbol-avl.html

Rodriguez-Tastets, M. A., 2017, Modelo físico. Recuperado de


https://goo.gl/R8wAIx

21

Вам также может понравиться