Gestión de Datos y Estructuras de Grafos
Gestión de Datos y Estructuras de Grafos
Gestion de Datos
Objetivos de la materia
Desarrollar los conceptos de estructuración de los datos en dispositivos de
almacenamiento.
Programa Sintético
· Bases de Datos: Conceptos básicos, arquitectura, componentes.
· Sistemas de Archivos.
· Normalización.
· Integridad de Datos, transacciones
Concepto de Base de Datos. Tipos de Bases de Datos. Modelo en Red (IDMS). Modelo
Jerárquico (IMS). Modelo de lista invertida (DATACOM/DB). Modelo Relacional. Modelo
orientado a objetos. Concepto de SQL. Concepto de PL-SQL. Recuperación y
Concurrencia, Seguridad e integridad de los datos. Aplicaciones con SQL y PL-SQL.
Bibliografía
· Estructuras de Datos y Algoritmos. Aho
Aristas Paralelas: Se dice que dos aristas son paralelas si el vértice inicial y el final son
el mismo.
Jerarquía de un grafo: para soportar una relación jerárquica el grafo debe incluir sentido de
dirección en sus arcos o aristas para indicar el sentido de la dirección de la relación.
Grado (v) de un vértice o nodo: para un grafo no orientado el grado será igual a la cantidad
de aristas que tocan el nodo.
Para el caso de un grafo orientado, el grado puede ser positivo o negativo y será igual a la
cantidad de aristas que salen o llegan a él respectivamente.
Camino: cuando existe por lo menos 1 arco (o arista) que une dos nodos a y b se dice que
existe un camino entre ellos, notar que aquí no importa si el grafo está dirigido o no. Dos nodos
están conectados si existe un camino entre ellos.
Paso: es un concepto sólo relevante en grafos dirigidos, dado que el paso entre dos nodos a y
b es un camino con un sentido preestablecido, es decir, partiendo del nodo a y siguiendo el
sentido del arco se llega al nodo b.
Ciclo: es una sucesión de arcos adyacentes donde recorriendo cada arco solo 1 vez se puede
llegar al punto inicial. Todo ciclo es un camino hamiltoniano.
Camino Hamiltoniano: es aquel ciclo que recorre todos los nodos del grafo, y en el que cada
nodo se recorre sólo una vez (a excepción del nodo inicial del cual parte y al cual llega). En la
actualidad solo existen métodos para hallar ciclos hamiltonianos en grafos pequeños, para
grafos grandes solo resta la fuerza bruta u otros métodos costosos.
Tipos de Grafos
Grafos simples: es aquel en el que, cualquier par de nodos está unido a lo sumo por
únicamente un arco. Un grafo que no es simple se denomina complejo o multigrafo.
Grafos Conexos: es aquel en el que cada par de nodos está conectado por un camino (existe
un camino para llegar a cualquier nodo). Un grafo es fuertemente conexo si cada par de nodos
está conectado por al menos dos caminos disjuntos (existe más de un camino para llegar a
cualquier nodo) tal que al eliminar un nodo del grafo no quede disconexo.
Es posible determinar si un grafo es conexo utilizando los siguientes algoritmos:
- Búsqueda en anchura o amplitud (BFS - Breadth-first search)
- Búsqueda en profundidad (DFS - Depth-first search)
Grafos Completos: un grafo simple es completo si todos los pares posibles de nodos están
unidos por arcos (es un todos con todos). Un grafo completo de “n” nodos (vértices) tendrá
𝑛(𝑛−1)
exactamente 2
arcos (aristas).
Grafos Bipartitos: un grafo bipartito puede expresarse como 𝐺 = {𝑉1 ∪ 𝑉2, 𝐴}, es decir es la
unión de dos grupos de vértices tal que cumplen las siguientes condiciones:
- 𝑉1, 𝑉2 son disjuntos y no vacíos
- Cada arista A une un vertice 𝑉1 con un vertice de 𝑉2
Grafo Ponderado: Un grafo ponderado, pesado o con costos es un grafo donde cada arista
tiene asociado un valor o etiqueta, para representar el costo, peso, longitud. Formalmente es
un grafo con una función 𝑣: 𝐴 → 𝑅 +, es decir que cada arista tiene asociado un valor
numérico real positivo.
Estatica
Una representación computacional se denomina estática, cuando el espacio
consumido para representar computacionalmente al grafo es invariable y fijo respecto a
la cantidad de nodos y vértices a representar, esto es que son consideradas todas las
ocurrencias de relaciones que puedan producirse entre todos los nodos, reservando el
espacio para dicha ocurrencia potencial.
De esta forma la representación no sigue la “dinámica” de la estructura, sino que
se mantiene fija y estática en el tiempo independientemente de las altas y bajas de arcos
o vértices que se produzcan en el grafo representado computacionalmente. Un gráfico
irrestricto puede representarse estáticamente mediante las siguientes:
- Matriz de adyacencia: es una matriz cuadrada 𝑀𝐴𝑛𝑥𝑛 donde “n” es el número de
vértices donde 𝑀𝐴𝑖𝑗 es el número de aristas que unen los vértices 𝑉𝑖 y 𝑉𝑗. La matriz será
binaria si el grafo es simple indicando con 1 si existe una relación y con 0 la ausencia de
la misma.
- Matriz de incidencia: es una matriz de orden nxm, siendo n el número de vértices y m el
número de aristas 𝑀𝐼𝑛𝑥𝑚donde el elemento 𝑀𝐼𝑖𝑗 será 0 si la arista no incide en el vértice,
1 si la arista incide, y 2 si la arista incide dos veces (bucle).
Algoritmos de Búsqueda
Primero en Amplitud / anchura (BFS - Breadth-first search):
Es un algoritmo para recorrer o buscar elementos en un grafo (usado frecuentemente sobre
árboles).Intuitivamente, se comienza en la raíz (eligiendo algún nodo como elemento raíz en el
caso de un grafo) y se exploran todos los vecinos de este nodo. A continuación para cada uno
de los vecinos se exploran sus respectivos vecinos adyacentes, y así hasta que se recorra todo
el árbol. Nótese que cada nodo es puesto a la cola una vez y su lista de adyacencia es
recorrida una vez también.
- Utiliza backtracking
- Utiliza una pila que se recorre tipo LIFO
- Esta técnica se utiliza cuando necesitamos encontrar respuesta a un problema
sobre un grafo sin condiciones de optimización.
Arboles
Desde el punto de vista conceptual, un árbol es un grafo que comienza con una raíz (root) y se
extiende en varias ramificaciones o líneas (branches), cada una de las cuales puede
extenderse en ramificaciones hasta terminar, finalmente en una hoja (leaves).
Grado:
- De un nodo: es el número de descendientes directos de un determinado nodo.
- De un árbol: es el máximo grado de todos los nodos del árbol.
Nivel: el nivel de un nodo es la longitud del camino que va desde la raíz hasta ese nodo.
Dicho de otra forma es el número de arcos a ser recorridos para llegar a determinado nodo.
Considerando que el nivel de la raíz es 0, y la de cualquier otro nodo sería la de su padre + 1.
Profundidad o altura de un árbol: es igual a la cantidad de niveles del árbol.
Tamaño de un nodo: es el número de nodos descendientes más el nodo mismo. El tamaño del
árbol es igual al tamaño de su raíz.
Cardinalidad o tamaño del árbol: es el número máximo de nodos que puede tener un árbol
𝑛𝑖𝑣𝑒𝑙𝑒𝑠
𝑔𝑟𝑎𝑑𝑜
Raíz: también llamado minimal, es aquel que no tiene flechas entrantes, su nivel es 0.
Hojas: también llamado maximal, nodo terminal o nodo exterior, es aquel que no tiene flechas
salientes.
Nodo Rama: también llamados nodos interiores, son aquellos que no son hojas ni raíz.
Propiedades
• Dados dos nodos cualesquiera de un árbol, existe exactamente un camino que los
conecta. Una consecuencia importante de esta propiedad es que cualquier nodo puede
ser raíz, ya que, dado cualquier nodo de un árbol, existe exactamente un camino que lo
conecta con cualquier otro nodo del árbol.
• Un árbol con N nodos debe tener N − 1 aristas porque a cada nodo, excepto la raíz, le
llega una arista.
• La altura de cualquier nodo es 1 más que la mayor altura de un hijo suyo.
• Un árbol N-ario con n ≥ 0 nodos internos, contiene ( 𝑁 − 1) 𝑛 + 1 nodos externos.
ℎ
• Un árbol N-ario de altura h ≥ 0 tiene como máximo 𝑁 hojas.
Tipos de Árboles
Árbol binario
Un árbol binario es un árbol en el que ningún nodo puede tener más de dos hijos, se los
distingue como izquierdo y derecho, o subárbol izquierdo y derecho.
Siendo:
● i = número de nodos internos
● n = número total de nodos
● l = numero de hojas
● h = número de niveles
Arbol Lleno
Un árbol está lleno cuando es completo y sus nodos maximales se encuentran a la misma
profundidad / nivel.
Árbol Balanceado
Un árbol está balanceado si todos los subárboles desde la raíz pesan los mismo o sea tienen la
misma cantidad de elementos o una diferencia indivisible.
Árbol Binario Balanceado
Un árbol binario está balanceado si la altura de sus subárboles izquierdo y derecho difiere a lo
sumo en 1.
Un árbol binario está perfectamente balanceado si el camino desde la raíz a cualquier hoja
tiene la misma longitud. Los únicos árboles que están completamente balanceados son los
árboles binarios perfectos. En estos árboles todas las hojas están al mismo nivel.
Árboles de Expresión
Tomamos como ejemplo la expresión 𝑎 / 𝑏 + (𝑐 − 𝑑 ) 𝑒. Los nodos terminales (hojas) de un
árbol de expresión son las variables o constantes en la expresión (a, b, c, d, y e). Los no
terminales son los operadores (+,× y ÷). Los paréntesis de la ecuación no aparecen en el árbol,
ya que justamente las posiciones de los operadores en el árbol son los que le asignan
prioridades. Para imprimir se usa el recorrido inorden y se utiliza el siguiente procedimiento:
Si se encuentra un nodo terminal, se lo imprime. De lo contrario, se hace lo siguiente:
1. Imprimir un paréntesis izquierdo
2. Recorrer el subárbol izquierdo
3. Imprimir la raíz
4. Recorrer el subárbol derecho.
5. Imprimir el paréntesis derecho.
Arboles de Busqueda
Soporta las operaciones de búsqueda, inserción y eliminación de forma eficiente.
Las claves no aparecen en los nodos de forma arbitraria, sino que hay un criterio de orden (o
relación de orden) que determina donde una determinada clave puede ubicarse en el árbol en
relación con las otras claves en ese árbol. Dicho de otra forma, debe haber una forma de
ordenar los elementos y estos deben ser comparables.
Ejemplos:
Operaciones
- Búsqueda: se utiliza para localizar elementos a partir de su clave, por ejemplo para
verificar si una clave está presente en el árbol o para obtener el nodo con el valor que
pedimos. Para ello comenzamos por la raíz y preguntamos si su valor es igual al valor
que buscamos, si no lo es repetimos la operatoria de forma análoga y utilizando
recursividad sobre los subárboles izquierdo y derecho.
- Inserción: es necesario introducir los elementos de forma ordenada y además, si el
árbol permite duplicados se puede mantener un contador que mantenga el número de
incidencias. Las reglas serían:
- Si el árbol está vacío: insertamos en la raíz.
- Si la raíz del árbol es igual al elemento a insertar y NO permitimos duplicados
emitimos un error de lo contrario aumentamos el contador.
- Si el elemento a insertar es menor a la raíz, insertamos en el subárbol izquierdo.
- Si el elemento a insertar es mayora la raíz, insertamos en el subárbol derecho.
- Eliminacion
- Si no tiene hijos puede eliminarse sin ajuste.
- Si tiene solo un subárbol, su hijo toma su lugar.
- si tiene dos subárboles, el menor de los hijos del subárbol derecho puede tomar el
lugar del padre.
Árboles B - (B-Trees)
Son árboles M-arios balanceados de manera tal que se garantice que la búsqueda, la
inserción y la eliminación sean todos de tiempo logarítmico 𝑂(𝑙𝑜𝑔 𝑛 ).
Se utilizan para grandes volúmenes de datos que no caben en memoria, por lo tanto se
almacenan en disco y se lee en la forma de bloques (es por eso que se trata de elegir un valor
de M grande y correlativo al tamaño del bloque).
El secreto es entonces disminuir el número de accesos a disco. La mayoría de operaciones
(búsqueda, inserción, eliminación, etc) requiere 𝑂(ℎ) accesos a disco donde h (height) es la
altura del árbol.
Se intenta mantener baja la altura del B-Tree almacenando en cada nodo tantas claves como
sea posible. Generalmente el tamaño de cada nodo se mantiene igual al tamaño de bloque.
Si se lo compara con Árboles Binarios de Búsqueda o AVL Trees la mayoría de operaciones en
un B-Tree se realizan con mejores resultados ya que este último por todo lo anterior
comentado, tendrá una altura menor y por consiguiente menor será la cantidad de accesos a
disco necesarios para realizar una operación.
En un nodo de B-tree hay un número K de claves y un número K+1 (se suele denotar M por el
grado) de hijos (punteros).
En B-Tree todas las hojas están al mismo nivel.
Las claves de la izquierda son menores que las de la derecha. Es decir, van en orden creciente
o ascendente ( 𝑘𝑖 < 𝑘𝑖+1)
Cada nodo hijo contiene claves que son mayores a su clave izquierda y menores a la clave
derecha. Ejemplo, el hijo (puntero) entre K1 y K2 contendrá claves menores a K2 y mayores a
K1.
Factor de ramificación: cuanto más claves podemos representar dentro de un nodo mayor
será el factor de ramificación.
Esto es positivo porque significa que desde un nodo podemos viajar a muchos otros y esto a su
vez reduce el número de accesos de disco.
Grado de un nodo:
análogamente a otros tipos de árboles representa el número de hijos que puede tener un nodo.
- Un nodo con K claves puede tener K+1 hijos.
- Dicho de otra forma, si tiene M hijos tendra M-1 claves.
Caracteristicas:
1. La raíz de T tiene al menos dos subárboles y a lo sumo M subárboles (hijos).
𝑀
2. Todos los nodos internos de T tienen entre 2
y 𝑀 hijos.
3. Todos los nodos externos (maximales) de T están al mismo nivel.
Operaciones
Soporta las operaciones habituales de búsqueda, insercion, eliminacion y recorrido más las
siguientes:
- Dividir: si un nodo ya está lleno y es necesario insertar un elemento es se debe
reestructurar el árbol.
- Reestructurar: al eliminar un nodo es necesario controlar que las propiedades o
características del árbol no se vean afectadas por lo que puede ser necesario
reestructurar.
- Inserciones: Suceden al nivel de los nodos hoja.
B-Tree Visualization
Altura:
Dado 𝑀 la cantidad de hijos de un determinado nodo se define como:
𝑛
- La altura ℎ en el peor caso será de: 𝑙𝑜𝑔 𝑀
𝑀 𝑛
- La altura ℎ en el mejor caso será de: 𝑙𝑜𝑔 ( 2
)
Este caso se debe a que si guardamos menos hijos en los nodos, se necesitarán más niveles
para almacenar todo.
Cantidad de claves:
Siendo ℎ la altura y 𝑛 el igual al grado del árbol.
ℎ
- El número máximo de claves está dado por: 𝑛 −1
𝑛 ℎ−1
- El número mínimo de claves está dado por: 2( 2 ) −1
B-Tree Vs B+ Tree
B-Tree B+Tree
Todos los nodos son puntos de datos Solo las hojas tienen datos
Como no todas las claves están disponibles Como toda la información está en las hojas y
en las hojas, las búsquedas suelen llevar están están linkeadas las búsquedas son
más tiempo más rápidas
Las eliminaciones son complejas Las eliminaciones son fáciles dado que todos
los nodos hojas tienen los datos
Los nodos hojas NO son linkeados mediante Los nodos hojas son linkeados mediante una
una lista enlazada lista enlazada
Se deben procesar la raíz del subárbol izquierdo y el derecho y dependiendo del orden en que
se procesen tendríamos las siguientes configuraciones:
- Preorden: El recorrido en preorden puede ser definido recursivamente de la siguiente
manera:
En el caso de un árbol binario, el algoritmo resulta:
1. Visitar primero la raíz
2. Recorrer el subárbol izquierdo
3. Recorrer el subárbol derecho.
- Inorden (Simétrico): El recorrido inorden solo puede ser usado en árboles binarios.
En este recorrido, se visita la raíz entre medio de las visitas entre el subárbol izquierdo y
el derecho.
1. Recorrer el subárbol izquierdo
2. Visitar la raíz
3. Recorrer el subárbol derecho.
Postorden 5-4-7-3-9-11-13-14-45-22-8
Inorden 3-4-5-7-8-9-11-13-14-22-45
Los algoritmos de barrido son siempre iguales, dado que un árbol se basa en la recursividad, lo
único que se modifica es el momento en que se lee el nodo.
𝑛𝑖𝑒𝑣𝑒𝑙𝑒𝑠
𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜𝑠 = 𝑔𝑟𝑎𝑑𝑜 −1
𝑛𝑖𝑒𝑣𝑒𝑙𝑒𝑠
𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜𝑠 + 1 = 𝑔𝑟𝑎𝑑𝑜
𝑙𝑜𝑔 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜𝑠 + 1 = 𝑛𝑖𝑣𝑒𝑙𝑒𝑠 * 𝑙𝑜𝑔 𝑔𝑟𝑎𝑑𝑜𝑠
𝑛𝑖𝑣𝑒𝑙𝑒𝑠 = 𝑙𝑜𝑔 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜𝑠 + 1 − 𝑔𝑟𝑎𝑑𝑜𝑠
conclusion:
𝑛𝑖𝑣𝑒𝑙𝑒𝑠 > 𝑙𝑜𝑔 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜𝑠
Ejemplo:
Una estructura de datos básica como por ejemplo una lista tiene una búsqueda secuencial, por
lo tanto, si tengo 10 elementos a lo sumo debería realizar 10 preguntas para encontrar un
elemento. En un árbol esa búsqueda no es lineal, sino que es logarítmica.
Clasificación de Algoritmos
Estabilidad: Un ordenamiento se considera estable si mantiene el orden relativo que tenían
originalmente los elementos con claves iguales. Si se tiene dos registros A y B con la misma
clave en la cual A aparece primero que B, entonces el método se considera estable cuando A
aparece primero que B en el archivo ordenado.
La mayoría de los métodos de ordenamiento simples son estables, pero gran parte de los
métodos complejos no lo son. Se puede transformar uno inestable en estable a costa de mayor
espacio en memoria o mayor tiempo de ejecución.
Una de las ventajas de los métodos estables es que permiten que un array se ordene usando
claves múltiples, por ejemplo, por orden alfabético del apellido, luego el nombre, luego el
documento, etc.
Ejemplo: tenemos el siguiente array de tuplas que se deben ordenar por el primer elemento de
cada tupla
(4, 1) (3, 7) (3, 1) (5, 6)
In situ:
Los métodos in situ son los que transforman una estructura de datos usando una cantidad extra
de memoria, siendo ésta pequeña y constante. Generalmente la entrada es sobrescrita por la
salida a medida que se ejecuta el algoritmo.
Por el contrario, los algoritmos que no son in situ requieren gran cantidad de memoria extra
para transformar una entrada.
Fundamental para optimización debido a que utilizar la misma estructura disminuye los tiempos
de ejecución, ya que no se debe utilizar tiempo en crear nuevas estructuras, ni copiar
elementos de un lugar a otro.
Complejidad
Trata de los recursos necesarios para resolver un problema. Normalmente se analizan los
siguientes.
- Tiempo: mediante una aproximación al número de pasos de ejecución de un algoritmo
para resolver un problema.
- Espacio: mediante una aproximación a la cantidad de memoria utilizada para resolver
un problema.
Clases de complejidad
Los problemas de decisión se clasifican en conjuntos de complejidad comparable llamados
clases de complejidad.
La clase de complejidad P es el conjunto de los problemas de decisión que pueden ser
resueltos en una máquina determinista en tiempo polinómico, lo que corresponde intuitivamente
a problemas que pueden ser resueltos aún en el peor de sus casos. Problemas solubles.
La clase de complejidad NP es el conjunto de los problemas de decisión que pueden ser
resueltos por una máquina no determinista en tiempo polinómico. Todos los problemas de esta
clase tienen la propiedad de que su solución puede ser verificada efectivamente. Solución
verificable.
Los problemas NP-completos pueden ser descritos como los problemas en NP que tienen menos
posibilidades de estar en P y pueden ser considerados intratables.
Intratabilidad: Los problemas que pueden ser resueltos en teoría, pero no en práctica, se
llaman intratables. Qué se puede y qué no en la práctica es un tema debatible, pero en general
sólo los problemas que tienen soluciones de tiempos polinomiales son solubles.
Métodos de Ordenamiento.
El tiempo de ejecución:
2
- En general: 𝑂(𝑛 )
- Mejor:
- Peor:
El tiempo de ejecución:
- En general: 𝑂 (𝑛 𝑙𝑜𝑔 𝑛)
- Mejor: 𝑂 (𝑛 𝑙𝑜𝑔 𝑛)
- Peor: 𝑂 (𝑛 𝑙𝑜𝑔 𝑛)
El tiempo de ejecución:
- En general: 𝑂 (𝑛 𝑙𝑜𝑔 𝑛)
- Mejor: 𝑂 (𝑛 𝑙𝑜𝑔 𝑛)
2
- Peor: 𝑂(𝑛 ) listas semi-ordenadas o ordenadas
Algoritmos de Compactación
Algoritmo de Huffman
Creado en 1952 por David Huffman este algoritmo, utilizado para compresión y encriptación
de datos, toma un alfabeto de n símbolos, junto con sus frecuencias de aparición asociadas, y
produce un código de Huffman para ese alfabeto y esas frecuencias. Se utiliza un árbol binario
y una tabla de frecuencias.
El algoritmo consiste en la creación de un árbol binario que tiene cada uno de los símbolos por
hoja, y construido de tal forma que siguiéndolo desde la raíz a cada una de sus hojas se
obtiene el código Huffman asociado a él.
1. Se crean varios árboles, uno por cada uno de los símbolos del alfabeto, consistiendo
cada uno de los árboles en un nodo sin hijos, y etiquetado cada uno con su símbolo
asociado y su frecuencia de aparición.
2. Se toman los dos árboles de menor frecuencia, y se unen creando un nuevo árbol. La
etiqueta de la raíz será la suma de las frecuencias de las raíces (ahora hojas) de los dos
árboles que se unen, y cada uno de estos árboles será un hijo del nuevo árbol. También
se etiquetan las dos ramas del nuevo árbol: con un 0 la de la izquierda, y con un 1 la de
la derecha.
3. Se repite el paso 2 hasta que solo quede un árbol.
Con este árbol se puede conocer el código asociado a un símbolo, así como obtener el símbolo
asociado a un determinado código.
Características:
- El algoritmo identifica cada carácter del archivo a comprimir y le asigna un código de
longitud variable según su frecuencia.
- A más ocurrencias del carácter más pequeño será la longitud del código asignado.
Aplicaciones:
- Conveniente cuando la cantidad de espacio en disco es insuficiente o los tiempos de
transmisión son prolongados con costos elevados.
- Muy eficiente con archivos de texto (txt, excel, word, pdf, etc)
E 3 00
N 3 01
U 2 10
Q 1 111
Nota: La columna Código puede rellenarse luego de crear el árbol ya que para ellos hay que
seguir las ramas codificadas en binario hacia cada símbolo que se encuentra en las hojas.
Hashing
Una 𝑓𝑢𝑛𝑐𝑖𝑜𝑛 ℎ𝑎𝑠ℎ es cualquier función que mapea cadenas de tamaño arbitrario a códigos
llamados valores hash los cuales normalmente tienen longitud fija.
Colisión
Sean k1 y k2 claves pertenecientes a los registros r1 y r2 respectivamente, con
k1≠ k2. Y sea h(k) la función de hash. Si h(k1)=h(k2) entonces decimos que se produce una
colisión.
Es matemáticamente imposible que una función de hash carezca de colisiones, ya que el
número potencial de posibles entradas es mayor que el número de salidas que puede producir
un hash.
El principal objetivo de una función de hash es minimizar la probabilidad de colisión sin ocupar
memoria innecesariamente. Existen distintos métodos pero en la práctica nunca se utiliza uno
en particular sino una combinación de varios de acuerdo a la aplicación que se esté analizando.
Este método produce claves aceptables cuando no existen muchos 0 hacia la izquierda o
derecha de la clave.
Clustering
Es un tipo de falla asociada a las soluciones de direccionamiento abierto que se aplican para
las colisiones.
Este fenómeno ocurre de la siguiente manera al tratar una colisión:
1. La función de hash arroja el mismo hash value para 2 registros distintos => colisión.
2. Se busca una posición contigua no ocupada para la clave que colisionó.
3. El cluster formado por estos registros es probable que crezca aún más por nuevas
colisiones.
4. De esta forma, puede suceder que los valores hash se terminen agrupando dentro de
ciertos valores y el resto de la tabla permanezca sin ocuparse.
5. Este fenómeno termina alargando el tiempo de las búsquedas.
Tratamiento de colisiones
Soluciones Estáticas
Utiliza lo que se llama Rehashing o Direccionamiento abierto (open addressing), lo cual
consiste en la utilización de una segunda función de hash hasta que se encuentre una posición
libre.
Soluciones de rehashing:
1. Trivial (linear probing): es la llamada solución lineal; si la posición de la tabla de
direcciones, table(dir), en el valor de subíndice obtenido al aplicar la función de hash a
una clave, dir, está ocupada, se ocupa la siguiente posición libre de la tabla. rhash(i) =
(i+1) % maxtab
2. Generalización de la solución lineal: Luego de aplicar Hash(key) = dir, resulta que dir
es una posición ocupada, se aplica nuevamente una función de hash sobre la hash
value anteriormente obtenida: rhash(dir) = (dir + c) mod maxtab donde c y maxtab son
números primos.
3. Doble hashing (para evitar el clustering): Este método utiliza en la función de
reasignación otra función de hash independiente que toma como argumento el valor de
la clave.
4. Hacer depender la función de reasignación del número de veces que es aplicada.
De esta manera, rhash(dir, arg1) tendrá dos argumentos. rhash(dir, i) = (i+1) * dir mod
maxtab donde i es una variable inicializada en 1.
Problemas y observaciones de soluciones estáticas
El principal problema del método de direccionamiento abierto, es que se basa en el uso de una
estructura estática, es decir una tabla, la cuál debe ser dimensionada previamente y que en
ocasiones puede resultar chica, en cuyo caso se deberá crear una tabla más grande y
reorganizar todos los punteros en función del nuevo valor que tome maxtab.
Otro problema es la dificultad que se presenta al dar de baja un elemento de la tabla. Este tipo
de inconvenientes podría solucionarse con el uso de marcas de estado pero el proceso de
recuperación sería cada vez más complejo y se perdería de vista los objetivos principales que
se plantearon en un comienzo respecto de disminuir la cantidad de accesos y disminuir el
espacio utilizado por las estructuras de datos auxiliares.
Debe prestarse especial atención en el diseño del proceso de reasignación pues puede darse
el caso de que un algoritmo busque eternamente un elemento disponible en la tabla o que
informe que no hay más espacio disponible cuando en realidad sí hay elementos vacíos. Un
ejemplo claro de una función de reasignación que pueda llegar a conclusiones equivocadas es
la función rhash(dir) = dir + 2. En este caso, llevado al extremo, puede darse que todos los
elementos de la tabla con subíndice par estén ocupados, que los impares estén vacíos y la
función indique que no existe más espacio disponible.
Soluciones Dinámicas
También llamado direccionamiento cerrado (closed addressing) consiste en utilizar
encadenamiento (chaining) método que se basa en enlazar entre sí los distintos pares de
clave/puntero que colisionan entre sí, de forma tal de agruparlos. El encadenamiento puede
darse en forma interna dentro de la misma tabla de hash, o también utilizando algún tipo de
estructura auxiliar, lo que se conoce como “separate chaining”.
Hash Dinamico
Las tablas hash se presentaron como una alternativa hacia las estructuras tipo árbol ya que
permitían el almacenamiento de grandes volúmenes de información y algoritmos eficientes para
la administración sobre estas estructuras (inserción, eliminación y búsqueda).
Sin embargo, presenta 2 grandes problemas:
1. No existen funciones hash perfectas que permitan asegurar que por cada
transformación de un elemento habrá una única correspondencia en la clave que
contiene este elemento.
2. Son estructuras estáticas que no pueden crecer ya que necesitan un tamaño fijo para el
funcionamiento de la estructura.
Para solucionar el segundo problema se implementa la utilización de métodos totales y
métodos parciales. Convirtiendo la tabla hash en una estructura dinámica capaz de almacenar
un flujo de información y no una cantidad fija de datos.
Métodos Totales
Método de las expansiones totales
El método de las expansiones totales consiste en realizar una duplicación del tamaño del
arreglo establecido para realizar la tabla hash, esta expansión se ejecuta cuando se supera la
densidad de ocupación . Así si se tiene una tabla hash de tamaño N, al realizar la expansión
total se obtendrá una tabla hash de 2N, al realizar una segunda expansión se obtendrá una
tabla hash de 4N, al realizar una tercera expansión se obtendrá una tabla hash de 8N y en
general el tamaño de la tabla para una iésima expansión se define como aparece a
continuación:
𝑖
𝑇 = 2 *𝑁
Dónde:
N: Tamaño de la Tabla.
i: Número de expansiones que se quieren realizar.
T: Nuevo tamaño de la Tabla.
La densidad de ocupación se define como el cociente entre el número de registros ocupados y
el número de registros disponibles; así se tiene que:
𝑟𝑜
𝑝𝑜 = ( 𝑟𝑑 ) * 100
Dónde:
po: Densidad de ocupación
ro: Registros Ocupados
rd: Registros Disponibles.
Cada vez que se pretende insertar un elemento es necesario calcular la densidad de
ocupación, si se supera esta densidad se procede a implementar la expansión. Al realizar cada
una de las expansiones es necesario volver a implementar la función hash para cada uno de
los registros almacenados en la tabla y volver a insertarlos de nuevo en la tabla.
Métodos Parciales
Método de las expansiones parciales
El método de las expansiones parciales consiste en incrementar en un 50% el tamaño del
arreglo establecido para realizar la tabla hash, esta expansión se ejecuta cuando se supera la
densidad de ocupación. Así si se tiene una tabla hash de tamaño N, al realizar la expansión
parcial se obtendrá una tabla hash de 1.5 N, al realizar una segunda expansión se obtendrá
una tabla hash de 2.25 N, al realizar una tercera expansión se obtendrá una tabla hash de
3.375 N y en general el tamaño de la tabla para una iésima expansión se define como:
𝑖
𝑇 = 1. 5 * 𝑁
Dónde:
N: Tamaño de la Tabla.
i: Número de expansiones que se quieren realizar.
T: Nuevo tamaño de la Tabla.
Cada vez que se pretende insertar un elemento es necesario calcular la densidad de
ocupación, si se supera esta densidad se procede a implementar la expansión. Al realizar cada
una de las expansiones es necesario volver a implementar la función hash para cada uno de
los registros almacenados en la tabla hash y volver a insertarlos de nuevo en la tabla.
- Clave Primaria (Primary Key - PK): Atributo o conjunto de atributos (en el que ninguno
puede ser nulo) que identifica unívocamente a cada tupla. Debe cumplir con
minimalidad y unicidad.
- Clave Foranea (Foreign Key - FK): Atributo o conjunto de atributos que es clave
primaria en otra relación y permite implementar el concepto de integridad referencial.
Tiene 3 opciones; RESTRICT, CASCADE, ANULACIÓN (ON DELETE SET NULL).
Caracteristicas
- Integridad referencial: es la característica que garantiza que la relación entre dos
tablas permanezca sincronizada en las operaciones de manipulación de datos, es decir,
al realizar una operación de inserción, actualización o eliminación se verifica que la tupla
o fila a la que hace referencia exista y sea válida.
- Independiente de la implementación: es independiente de la implementación física,
está abstraída.
- Independiente del Orden: los elementos de las relaciones no tienen un orden
determinado.
- Las tablas o relaciones deberían estar normalizadas.
Normalizacion
Proceso iterativo utilizado para quitar redundancias y mejorar la integridad de los datos en un
modelo relacional.
Su principal objetivo es remover del modelo las dependencias que requieran realizar
inserciones, actualizaciones o eliminaciones en unas relaciones cuando otras se modifican.
También se busca evitar tener que reestructurar las relaciones a medida que se agregan
nuevos atributos.
Ejemplo Práctico
Un videoclub almacena toda su información en una tabla sin normalizar.
Procedemos a aplicar 1FN y trabajamos primero sobre el campo multivalor “Movies Rented” y
nos queda:
Luego vemos que para identificar unívocamente un registro no podemos utilizar solo el nombre
porque se repite, por lo que también utilizamos la dirección:
Finalmente la PK queda formada por los campos “Full Name” y “Physical Address” y es una PK
compuesta.
Ya tenemos la tabla en 1FN, podemos aplicar 2FN, para ello hay que deshacerse de la
dependencia funcional. Aquí el atributo “Movies Rented” depende de un subset de la PK, es
decir, sólo depende del nombre de la persona que alquiló la película, y no de la dirección.
Para solucionar esto partimos la tabla en dos, y además por conveniencia agregamos un id
(que será nuestra nueva PK en la tabla 1) a cada persona que alquila películas en nuestro
videoclub de manera de identificarlos unívocamente de manera más fácil y utilizar este campo
para la integridad referencial.
Para dejar la tabla en 3FN debemos quitar la dependencia transitiva, en nuestro escenario la
tenemos entre los campos no clave “Full Name” y “Salutation”, si se realiza un cambio del
primero por consiguiente deberíamos actualizar también el segundo, si no lo hiciéramos
tendríamos un problema de consistencia.
Se llama dependencia transitiva ya que como podemos ver “Salutation” depende de “Full
Name” quien a su vez depende de la clave “Membership Id”, del modo
𝑠𝑖 𝐴 ⇒ 𝐵 𝑦 𝐵 ⇒ 𝐶 𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠 𝐴 ⇒ 𝐶. Para solucionar esto partimos nuevamente la tabla como
sigue:
Donde las diferentes opciones de saludo pasan a estar parametrizadas en una nueva tabla
indexadas por su correspondiente ID. Luego se cambia el atributo “Salutation” en la tabla
original para que contenga la referencia al ID correspondiente.
Arquitectura de Aplicaciones
Monocapa
Cliente-Servidor
- Arquitectura de 2 capas
- Capa de front-end o presentación instalada en el cliente (que puede ser pesado o ligero)
que se comunica con la capa de datos que se encuentra en el servidor.
- Son casi siempre multiusuario.
- El cliente envía requests (solicitudes) de información al servidor quien procesa y envía
una respuesta.
- La lógica de negocio puede estar distribuida entre la aplicación instalada en el cliente y
el servidor (implementada como por ejemplo, stored procedures).
Ventajas
- El servidor permite la concurrencia, es decir, que múltiples usuarios accedan a los
datos en simultáneo y al mismo tiempo resuelve cualquier problema de integridad de
los datos.
- Al separar responsabilidades el mantenimiento se hace más fácil.
Desventajas
- El cliente (cliente pesado) debe contar con suficientes recursos para correr la
aplicación que se instalará en él.
- Aumenta la complejidad de actualizaciones y seguridad
Multicapa
- Compuesto por tres capas:
- Aplicación Cliente: puede ser de instalable de escritorio (desktop) o web
accedida mediante un navegador.
- Servidor de aplicaciones: servidor donde se concentra la lógica de negocio o
lógica de aplicación.
- Capa de Base de Datos
-
Ventajas
- El cliente solo posee una interfaz del sistema reduciendo el consumo de recursos
(cliente liviano).
- Lógica de negocio implementadas en el servidor de aplicaciones.
- Mejora el encapsulamiento y seguridad alejando al cliente de la capa de datos, el
cliente solo puede comunicarse con el servidor de aplicaciones y este es quien accede
a los datos.
- Reduce el acoplamiento y permite la escalabilidad horizontal.
Desventajas
- Más complejo de implementar.
Para que un producto se considere DBMS debe cumplir con la propiedades ACID, en español
representan Atomicidad, Consistencia, Aislamiento, Durabilidad.
- Atomicidad: propiedad que garantiza que una operación o transacción se complete
enteramente o no, es decir, garantiza que una operación no pueda quedar a medias.
Por ejemplo, una transacción bancaria precisa ser atómica ya que el depósito en una
cuenta destino y deducción de la cuenta origen necesitan ocurrir en conjunto, ocurren
ambas o ninguna.
- Consistencia: también llamada integridad, propiedad que asegura que se ejecutarán
operaciones que no rompan reglas y directrices de integridad de la BD. Esta propiedad
sostiene que cualquier operación consistente llevará la BD de un estado valido a otro
estado valido.
- Aislamiento: propiedad que garantiza que una operación no puede afectar a otras.
Asegurando que dos transacciones sobre el mismo conjunto de datos son
independientes y no generen ningún tipo de error. Define cómo y cuándo los cambios
producidos por una transacción se hacen visibles para las demás transacciones
concurrentes.
- Durabilidad: también llamada persistencia, propiedad que garantiza que los datos una
vez confirmada (commit) la operación se preservarán en el tiempo.
Arquitectura ANSI - SPARC
ANSI SPARC es una arquitectura de DBMS. Fue creada por ANSI y sirve como una
estandarización de las arquitecturas de DBMS.
El DBMS se encarga de coordinar la acción de los tres niveles que componen
ANSI-SPARC.
Nivel Externo:
- El nivel externo comprende las vistas que los usuarios tienen de la base de
datos, es decir, la abstracción que se le permite ver al usuario de toda la base
de datos (depende de factores como la relevancia de los datos para el usuario)
- Diferentes vistas externas pueden usar el mismo nivel conceptual para satisfacer los
requerimientos de distintos usuarios.
- También llamado vista externa, nivel de vistas o esquema externo.
Nivel Conceptual:
- El nivel conceptual comprende la forma lógica en que todos los datos se
almacenan, sus relaciones y las reglas de integridad.
- Permite ocultar detalles físicos al nivel externo y trabajar con elementos lógicos como
tablas, relaciones.
- Nivel de abstracción utilizado por el DBA o arquitectos de datos quienes toman
decisiones como por ejemplo sobre qué información mantener en la Base de Datos.
- Conocido como vista lógica o simplemente esquema.
Nivel Interno:
- Comprende la forma física en que los datos se organizan y se almacenan.
- Incluye técnicas de compresión, almacenamiento y encriptamiento de datos.
- Generalmente dependiente del software y dispositivos de almacenamiento secundario.
Ventajas
- Abstracción: oculta los detalles de cómo la base de datos almacena los datos
físicamente. Esto hace que el usuario tenga menos en lo que pensar y pueda enfocarse
en sus tareas.
Usuarios finales y desarrolladores de aplicaciones pueden enfocarse en los datos que
desean consumir.
Los Arquitectos de Datos pueden concentrarse en las entidades y relaciones del modelo
de manera de mejorar la integridad de los datos.
DBA puede centrarse en la organización física de los datos (datafiles, tablespaces) y
supervisar el rendimiento del DBMS en general.
- Portabilidad: la base de datos es la misma en todos los sistemas, por lo que
hace fácil la migración .
- Independencia lógica: un cambio o actualización en el nivel conceptual no
modifica el nivel externo.
Por ejemplo, agregar una nueva entidad o quitar una relación del nivel conceptual no
interfiere con el nivel externo ya que los usuarios solamente ven lo que necesitan, por
ejemplo, un usuario sabe nada más que le puede pedir a la base de datos una
lista de clientes y sus nombre pero no sabe ni cómo está guardada, ni que existen
más campos, etc.
- Independencia física: un cambio o actualización en el nivel interno no modifica el
nivel conceptual ni externo.
Por ejemplo, el tipo de almacenamiento secundario utilizado (HDD o SSD) debe ser
indistinto para el nivel conceptual y externo.
Concepto de Base de Datos. Tipos de Bases de Datos. Modelo en Red (IDMS). Modelo
Jerárquico (IMS). Modelo de lista invertida (DATACOM/DB). Modelo Relacional. Modelo
orientado a objetos. Concepto de SQL. Concepto de PL-SQL. Recuperación y
Concurrencia, Seguridad e integridad de los datos. Aplicaciones con SQL y PL-SQL.
- Tipos de Lecturas:
- Sucia: permite leer datos que fueron modificados por otra transacción
concurrente aún no confirmada.
- No Repetible: ocurre cuando durante una transacción una fila se lee dos
veces con valores no coincidentes deB bido a que otras transacciones
posiblemente modificaron los datos.
- Fantasma: es un caso particular de lectura no repetible, durante una
transacción se realizan dos consultas idénticas y sus resultados no
coinciden. En este caso pueden haberse añadido datos desde otras
transacciones y estos datos cumplen los criterios de las consultas.
- Niveles de Aislamiento: a continuación se listan desde el más permisivo al más
restrictivo.
- Read Uncommitted (RU): es el más permisivo, permite leer cambios que
no fueron confirmados, se pueden producir lecturas sucias, no repetibles
y lecturas fantasma. No aplica locks por SELECT.
- Ve INSERT/UPDATE/DELETE confirmados y no confirmados
- Un SELECT no bloquea la tabla de la que tomó los datos
- Read Committed (RC): modo defecto de muchos DBMS asegura que no
existan lecturas sucias, no garantiza lecturas repetibles. Aplica el lock
durante la lectura, luego libera.
- Solo ve INSERT/UPDATE/DELETE confirmados
- Un SELECT no bloquea la tabla de la que tomó los datos
- Repeatable Read (RR): bloquea los registros seleccionados para lectura
y escritura. Asegura que no sucedan lecturas sucias y las lecturas son
repetibles (al estar los registros bloqueados dos lecturas secuenciales
arrojarian los mismos resultados), no garantiza que no sucedan lecturas
fantasmas.
- No ve INSERT/UPDATE/DELETE no confirmados
- No ve UPDATE/DELETE confirmados
- Ve INSERTS confirmados
- Un SELECT bloquea los registros seleccionados para
UPDATE/DELETE pero permite hacer SELECT/INSERT.
- Serializable Read (SR): es el único que asegura que no existan lecturas
sucias, ni lecturas fantasmas y que las lecturas puedan ser repetibles.
Puede afectar a otros usuarios en sistemas multiusuario debido a los
bloqueos ya que las transacciones se procesan en serie una después de
otra.
- No ve INSERT/UPDATE/DELETE ya sean confirmados o no
confirmados
- Un SELECT bloquea los registros seleccionados para
INSERT/UPDATE/DELETE solo permite hacer lecturas SELECT
Read Si No Si
Uncommitted
Read No No Si
Committed
Repeatable No Si Si
Read
Serializable No Si No
Read
¿Por qué se establece que las Reglas del Negocio deben estar en el Motor de Base de
Datos y no en la aplicación cliente?
Porque:
● Reglas de negocio: cada aplicación debe reflejar las restricciones que existen en el
negocio dado, de modo que nunca sea posible realizar acciones no válidas.
● La información puede ser manipulada por muchos programas distintos que podrán
variar de acuerdo a los departamentos de la organización, los cuales tendrán distintas
visiones y necesidades pero que en cualquier caso, siempre deberán respetar las reglas
de negocio.
● Es por lo anterior expuesto que las reglas del negocio deben estar en el motor de base
de datos.
NoSQL
También llamados Bases de Datos No Relacionales, es una amplia categoría que incluye BD
que no usan SQL para interactuar con la base de datos. Ideales para almacenar datos
semi-estructurados o no estructurados.
Ejemplos: Apache Cassandra, MongoDB, CouchDB, and CouchBase
Ejemplos de aplicaciones: plataformas de redes sociales utilizan este tipo de BD para
almacenar log de chats, videos e imágenes de sus usuarios.
Cloud DB
Se refiere a cualquier DBMS diseñado para correr en la nube. Son ideales para aplicaciones
que corren en la nube. Ofrece flexibilidad y escalabilidad junto con alta disponibilidad.
Requieren bajo o nulo mantenimiento ya que son ofrecidas a través de modelos SaaS.
Ejemplos: Microsoft Azure SQL Database, Amazon Relational Database Service, Oracle
Autonomous Database, Snowflake.
Object-Oriented DataBases
Asociada a la POO, todos los atributos son asociados a objetos los cuales se persisten.
Son administradas por OODBMS y trabajan bien con lenguajes de programación como C++ y
Java. Como las Bases de Datos Relacionales siguen los estándares ACID.
Ejemplos: Wakanda, ObjectStore, Smalltalk is used in GemStone, LISP is used in Gbase, and
COP is used in Vbase.
Ejemplos de aplicaciones: Algunas de las aplicaciones comunes que usan bases de datos de
objetos son sistemas en tiempo real, arquitectura e ingeniería para modelado 3D,
telecomunicaciones y productos científicos, ciencia molecular y astronomía.
OODBMS
Motor de base de datos orientado a objetos.
Almacena los objetos e incorpora todas las características del paradigma lo que
aumenta la flexibilidad y la seguridad. Por ejemplo, herencia, polimorfismo y poder
manejar objetos complejos aumentan la flexibilidad mientras que encapsulamiento
aumenta la seguridad. Las ventajas incluyen la posibilidad de usar los conceptos del paradigma
sin mapeos y de forma fluida (sin ORMs).
Las desventajas incluyen la carencia de estándares, experiencia y la falta de madurez del
paradigma.
Datawarehouse
Base de Datos corporativa que contiene datos históricos para su análisis. Puede integrar datos
de varias fuentes como ser sistemas externos y bases de datos transaccionales. Los datos
suelen ser explotados para la toma de decisiones estratégicas. Existen diferentes modelos:
- ROLAP: Relational Online Analytical Processing, modelo relacional.
- MOLAP: multidimensional.
- HOLAP: hibrido
Los DataWarehouses se crearon con un propósito diferente a las bases de datos
transaccionales:
- Las BD OLTP están diseñadas y optimizadas para cargas de trabajo conocidas, con
tamaños de bloque más pequeños en relación a OLAP así disminuir la fragmentación de
bloques y también posibilitar que la manipulación de datos sea más eficiente.
Orientadas al procesamiento de transacciones de forma eficiente.
- En las BD OLAP buscan mantener y explotar datos históricos, frecuentemente no
normalizados para reducir el número de joins, y se arrojan consultas que exploren tablas
con cientos de miles o millones de registros con tiempos de respuesta aceptables.
Además, en OLAP frecuentemente se integran datos de diferentes fuentes con el fin de
enriquecer la explotación y agregar valor. Orientadas a la reportería, análisis y toma de
decisiones.
Funciones Principales
Las funciones principales de un DW pueden subdividirse en 5 grandes grupos cada uno de
ellos con propósitos específicos.
● Acceso a fuentes (Source)
○ Esta etapa suele consumir hasta el 80% del esfuerzo para poblar el DW. Las
fuentes pueden ser no solo de la organización sino que también pueden ser
externas, como por ejemplo datos de distribución pública, o datos adquiridos a
terceros.
● Carga (Load)
○ Asociada a ETL (Extraction Transformation and Load), son procesos que se
encargan de preparar, depurar y finalmente transferir los datos.
● Almacenamiento (Storage)
○ Abarca la arquitectura de los modelos de datos.
● Consultas (Query)
○ Orientadas al análisis y producción de reportes.
● Metadatos (Meta Data)
○ Información descriptiva del contexto, calidad y características de los elementos.
Dicho de otra forma, son datos sobre los datos.
Caracteristicas:
1. Soporta el proceso de toma de decisiones: Es la principal función de un DW.
2. Orientada a sujetos: El DW está orientado a los mayores sujetos (procesos o
departamentos de la empresa) de la empresa para que tomen las decisiones más
convenientes.
3. Integrada: integra los datos de distintas fuentes para que los mismos sean
consistentes.
4. No volátil: Los datos utilizados para la toma de decisiones deben ser estables por lo
tanto no deben modificarse una vez almacenados.
Arquitectura Datawarehouse
Datamart
Vista multidimensional de cada área del DATA WAREHOUSE.
A diferencia del DATA WAREHOUSE, los DATA MARTS:
● Son pequeños sistemas de almacenamiento de datos.
● Se ajustan mejor a las necesidades que tiene una parte específica de la organización.
● Optimizan la distribución de información útil para la toma de decisiones.
● Se enfocan en el manejo de datos resumidos o de muestras (no en la historia en
detalle).
● Son menos costosos y tienen un alcance más limitado que los DW.
● Al igual que el Datawarehouse puede ser implementado en un modelo Relacional
(RDBMS) o multidimensional (MDBMS).
Data Mining
Se refiere a la aplicación de técnicas y tecnología para la búsqueda y explotación de
información implícita que puede ser relevante para el negocio.
- Ayudan a tomar decisiones basadas en los datos (data-driven).
- Exploran las BD en busca de patrones ocultos que pueden ser de interés para
solucionar requerimientos del negocio.
- Busca modelos desconocidos, analiza tendencias y predicciones de comportamiento
que puedan utilizarse y mejorar la toma de decisiones.
- Suelen implementarse y automatizarse.
- Por ejemplo, un Banco puede aplicar Minería de Datos para buscar clientes leales,
encontrar nuevos segmentos de clientes, hallar patrones para detectar fraude, etc.
- Algunas técnicas usadas son redes neuronales y árboles de decisión entre otras.
SNOWFLAKE - STAR
Para implementar un Datawarehouse en un RDBMS se utiliza el modelo estrella (STAR) que se
conforma por dos tipos de tablas; tablas de hechos y tablas de dimensiones.
● Tablas de Hechos (Fact Table): registra medidas (measures) o métricas de un Evento
específico, generalmente consisten de valores numéricos (datos asociados
específicamente con el evento), y claves foráneas que referencian a tablas de datos
dimensionales que guardan información descriptiva.
Se diseñan para contener detalles uniformes a bajo nivel (referidos como "granularidad"
o "grano"), o sea que los hechos pueden registrar eventos a un gran nivel de
atomicidad.
● Tablas de Dimensiones (Dimension Tables): guardan información descriptiva, pueden
definir una amplia variedad de características. Las tablas de Dimensiones generalmente
tienen un bajo número de registros, en comparación a las tablas de hechos, pero cada
registro puede tener un gran número de atributos para describir los datos del hecho.
STAR SNOWFLAKE
Esquemas
En algunos motores como Oracle, el DBMS crea una estructura contenedora llamada esquema
por cada usuario, la misma agrupa todos los objetos propiedad del usuario.
Tablas
Unidad básica de almacenamiento de datos. Poseen nombre identificatorio, filas y columnas
con su correspondiente tipo de datos. Llamadas relaciones en el modelo relacional. Existen
diferentes tipos de estructuras u organizaciones internas de tablas:
- Heap (montón): estructura por defecto en la que se persisten los datos sin un orden
determinado.
- Tablas Organizadas por índice (IOT): los registros son almacenados en una estructura
de índice B-Tree y ordenados por la clave primaria. Cada nodo hoja almacena ambas
columnas clave y no clave. Las principales ventajas es que se reduce el espacio
requerido para almacenar los datos, no requiere una estructura separada para el índice
de la PK y que los datos ya se encuentran organizados. Casos de Uso: para tablas de
lookup cuando los datos son accedidos por la PK y se retornan todas las columnas.
- Tablas externas: característica proporcionada por Oracle que permite leer ficheros
externos formateados como si fueran tablas, tiene limitantes como ser que no se
pueden crear índices ni realizar DML.
- Tablas Temporales: los datos están disponibles durante la duración de la sesión, al
desconectarse los datos son purgados. En algunos DBMS como MS SQL SERVER es
posible separar entre locales y globales, en este último caso los datos son purgados
cuando todos los usuarios referenciando la tabla se desconectan. Caso de Uso: carrito
de compras.
- Tablas Anidadas: algunos DBMS como Oracle brinda la posibilidad de crear tablas
anidadas, en los cuales un atributo de la tabla contiene la especificación de una nueva
dentro de ella.
Clusters
Un cluster es un grupo de tablas que comparten los mismos bloques de datos porque tienen
columnas comunes compartidas y que a menudo se usan juntas.
Beneficios:
- Reducción de E/S a disco para los joins de las tablas agrupadas
- Mejora en tiempos de acceso para los joins de las tablas agrupadas
- En un clúster, el valor de clave de clúster es el valor de las columnas clave del clúster
para una fila en particular. Cada valor de clave del cluster se guarda sólo una vez en el
cluster y en el índice del cluster, independientemente de cuántas filas de diferentes
tablas contengan dicho valor. Por lo tanto, se requiere menos espacio para almacenar
tablas relacionadas e índices de datos en un cluster.
Vistas
Son objetos que permiten almacenar la implementación de una consulta detrás de un
identificador el cual puede consumirse como una tabla, de este modo se pueden disponibilizar
el acceso a consultas complejas a usuarios con poca experiencia en SQL o agregar un control
de seguridad brindándole solo acceso a la vista y no a las tablas subyacentes, pudiendo así por
ejemplo, esconder campos con datos sensibles. La vista no almacena los datos sino que es
una ventana de acceso a la consulta a la cual está asociada.
Vistas materializadas
También llamadas Snapshots son un tipo especial de vistas en la que los datos si son
persistidos en una estructura separada de las tablas que son origen de los datos.
Se suele utilizar para consultas complejas en la que es necesario sumarizar o precomputar
datos y persistir sus valores en el tiempo. Un ejemplo de uso podría ser calcular facturaciones
diarias por sucursales, al almacenarse en una vista materializada que se refresque a cada
cierre de día podría historificar datos de facturación y evitar re-cálculos. Muy utilizados en
Datawarehouse.
Secuencias
Objetos que generan números según una secuencia especificada, un uso común es que sus
valores son utilizados para las claves primarias. Las secuencias permiten especificar valores
mínimos, máximos, valor de inicio e intervalo o salto entre otras opciones.
Indices
Los índices son objetos que son físicamente independientes de los datos en la tabla asociada.
Se puede crear o borrar un índice en cualquier momento sin afectar a las tablas base o a otros
índices.
Su función es la de permitir un acceso más rápido a los datos, se pueden crear distintos tipos
de índices sobre uno o más campos.
En Oracle al crear una clave primaria o clave única el motor crea automáticamente un índice
UNIQUE.
Los índices se mantienen sincronizados con los datos de las columnas a las que están
asociados por lo que deben ser mantenidos cuando se realiza operaciones DML sobre la tabla
base, siendo esto un overhead.
Tipos de Índices
1. Btree Index : Estructura de índice estándar.
2. Btree Cluster Index : La tabla se ordena igual que el índice.
3. Reverse Key Index (Oracle) : Son un tipo de índice B-Tree pero en este caso se
invierte los bytes de la clave a indexar. Esto sirve para los índices cuyas claves son una
serie constante con por ej. Crecimiento ascendente para que las inserciones se
distribuyan por todas las hojas del árbol de índice. Se utiliza para reducir la contención
de bloques.
4. Bitmap Index (Oracle) : Son utilizados para claves con muchas repeticiones de una
serie acotada de valores. Por ejemplo; estado civil, tipo de documento, etc.
Cada bit en el Bitmap corresponde a una fila en particular. Si el bit está en on significa
que la fila con el correspondiente rowid tiene el valor de la clave.
5. Function Base Index (Oracle): Implementa una función que se debe utilizar luego
también en las consultas que se desean que utilicen el índice. Pueden ser B-Tree o
Bitmap.
Beneficios
Permite aplicar controles de unicidad como así también mejora la performance de las consultas
para columnas que se usan en los siguientes casos:
- Joins
- Filtros
- Ordenamiento
Costos
- Mantención: al realizar operaciones de manipulación de datos es necesario mantener el
índice en sincronización con los datos de la tabla, esto es un overhead que se suma al
tiempo de la transacción.
- Espacio: la estructura del índice requiere espacio adicional.
Sinonimos
Es un alias definido sobre una tabla, vista ó snapshot. Dependiendo el motor de BD puede ser
también definido sobre un procedure, una secuencia, función o package. Se usan a menudo
por seguridad o por conveniencia (por ej. en entornos distribuidos). Permiten enmascarar el
nombre y dueño de un determinado objeto. Proveen de una ubicación transparente para
objetos remotos en una BD distribuida. Simplifican las sentencias SQL para usuarios de la BD.
Pueden ser públicos (visibles para todos los usuarios).
DB Links
Un database link es un puntero que define una ruta de comunicación unidireccional desde un
servidor de base de datos hasta otro. Para acceder al enlace, se debe estar conectado a la
base de datos local que contiene la entrada en el diccionario de datos que define dicho puntero.
Hay dos tipos de enlace según la forma en que ocurre la conexión a la base remota:
• Enlace de usuario conectado: el usuario debe tener una cuenta en la base remota con el
mismo nombre de usuario de la base local.
• Enlace de usuario fijo: el usuario se conecta usando el nombre de usuario y password
referenciados en el enlace.
Disparadores (Triggers)
Tipo especial de stored procedure que se dispara al suceder un evento determinado. Ejemplo,
conexión a la BD de un usuario o DML sobre una tabla o vista (trigger INSTEAD OF)
Directorios
Un directorio especifica un alias para un directorio en el file system del servidor, donde se
ubican archivos binario externos (BFILES) y datos de tablas externas.
Stored Procedures
Objetos que son almacenados en las Bases de Datos y que permiten aplicar capacidades de
los lenguajes procedurales como lógica condicional, bucles (loops), manejo de variables. Usan
lenguajes como PL/SQL (Oracle) o T-SQL (Microsoft) que son extensiones de SQL. Tipos de
SP son funciones, procedimientos, paquetes (subprogramas relacionados lógicamente).
Beneficios
- Permiten aplicar reglas de negocio en la capa de datos.
- Pueden reducir la complejidad en la programación. Creando SP con las funciones más
usadas.
- Pueden ganar perfomance en algunos casos
- Otorgan un nivel de seguridad extra
- Pueden definirse ciertas reglas de negocio independientemente de las aplicaciones.
- Diferentes aplicaciones acceden al mismo código ya compilado y optimizado.
- En un ambiente cliente servidor, no sería necesario tener distribuido el código de la
aplicación.
SQL
Verdadero - Falso
En Huffman si el código es 1001, Verdadero Dado que las hojas son los
entonces ningún otro carácter caracteres, para poder llegar al caso
puede tener el código 10011 10011, es necesario que exista un
hijo derecho al nodo 1001, pero
como la premisa dice que esa
codificación representa un carácter,
no es posible llegar a la otra
codificación
El árbol B+ nunca puede quedar Falso En este tipo de árboles todo nodo
lleno tiene entre n y n/2 hijos, ahora bien,
si todo nodo a excepción de las
hojas tuvieran hijos quedaría lleno.
REVISAR.
ABB, cuando un ABB se basa en Falso Un ABB en el mejor de los casos (si
un árbol AVL su orden de está balanceado) ofrece búsquedas,
complejidad será el inserciones y eliminaciones en orden
mejor, n log 2 n de complejidad O(log n), y en el peor
de los casos será lineal O(n).
Todo grafo de grado 1 es tambíen Falso Un grafo con un único nodo que
un árbol contiene un arco autoreferenciarse
(bucle) es un grafo de grado 1 y no
es un árbol.
Para que un grafo sea considerado
un árbol entre otras debe ser
acíclico, dirigido, el número de
nodos igual al número de arcos -1 y
debe existir un único camino entre
cualquier par de nodos.
Una tabla de Hash permite Verdadero Solo permite búsqueda por igualdad
desarrollar un mecanismo para recuperación de claves únicas
indexado para recuperación de
claves únicas
Dado el árbol {(c, a); (c, b); (c, d); Falso No se pueden realizar barridos
(c, e)} su barrido simétrico simetricos en un Arbol NO Binario
es a, b, c, d, e
Un AB con cuatro nodos nunca Falso Sí puede, ejemplo {(A,B), (A,C), (B,
puede ser completo D)}
Dada una tabla que tiene un Verdadero Si falla el trigger también fallara la
trigger de INSERT; Si al insertar sentencia que lo disparó.
una fila sin ninguna transacción
iniciada en la tabla, la acción
disparada por el trigger falla, el
insert de la fila no se inserta en la
tabla.
Sobre un árbol n-ario con n>2 se Falso Solo se puede aplicar dichos
pueden realizar los siguientes barridos para árboles binarios. El
barridos (recorridos) preorden, barrido simétrico solo se puede
simétrico, postorden, y por niveles realizar en árboles con n=2.
Para eso es que se usa el algoritmo
de Knuth, para transformar un árbol
n-ario en binario y poder aplicarle el
barrido simétrico.