Base de Datos
Base de Datos
05)
Resumen
El licenciante no puede revocar estas libertades en tanto usted siga los términos de la licencia
NoComercial — Usted no puede hacer uso del material con fines comerciales.
CompartirIgual — Si usted mezcla, transforma o crea nuevo material a partir de esta obra,
usted podrá distribuir su contribución siempre que utilice la misma licencia que la obra original.
No hay restricciones adicionales — Usted no puede aplicar términos legales ni medidas tecnológicas que
restrinjan legalmente a otros hacer cualquier uso permitido por la licencia.
Aviso:
Usted no tiene que cumplir con la licencia para los materiales en el dominio público o cuando su uso esté
permitido por una excepción o limitación aplicable.
No se entregan garantías. La licencia podría no entregarle todos los permisos que necesita para el uso que
tenga previsto. Por ejemplo, otros derechos como relativos a publicidad, privacidad, o derechos morales pueden
limitar la forma en que utilice el material.
ÍNDICE
Índice
Acerca del proyecto 4
2. BDs y SGBDs 5
2.1. Base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. ¿Por qué una base de datos y no un sistema de archivo? . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Diseño de una base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4. Modelos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1. Operaciones en una base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.2. Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5. Modelos de bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4. Modelo Relacional 18
4.1. Estructura del modelo relacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2. Restricciones del modelo relacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3. Operaciones del modelo relacional: álgebra relacional . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3.1. Operadores básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3.2. Operadores secundarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4. Operadores extendidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.5. Actualizaciones a bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.5.1. Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.5.2. Insert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.5.3. Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.6. Vistas (views) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5. Cálculo relacional 24
6. Lenguajes de consulta 24
7. Integridad y seguridad 24
7.1. Restricciones de dominio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
7.2. Restricciones de integridad referencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
7.2.1. Acciones referenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7.3. Seguridad y autorizaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
8. Triggers 25
9. Dependencias funcionales 26
9.1. Axiomas de Armstrong . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
9.2. Clausura y superclaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
9.3. Cubrimiento minimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
15.Dependencias multivaluadas 36
15.1. Propiedades de las DMVs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
15.2. Preservación de dependencias multivaluadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
15.3. Base minimal de Dependencias e Implicación de DMVs . . . . . . . . . . . . . . . . . . . . . . . . 38
17.Dependencias de junta 40
17.1. Dependencias de junta embebidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
III SQL 44
19.DDL 44
19.1. Tipos de dominios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
19.2. Create table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
19.3. Drop table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
19.4. Alter table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
20.DML 45
20.1. Consultas anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
20.2. Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
20.3. Insert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
20.4. Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
IV Procesamiento de Consultas 49
21.Índices 50
21.1. Estructuras de índices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
23.Algoritmos 52
23.1. Selección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
23.2. Junta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
24.Evaluación de expresiones 54
25.Optimización de consultas 54
25.1. Reglas de equivalencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
25.2. Heurísticas de optimización de consultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
V Control de Concurrencia 58
27.Transacciones 58
28.Problemas de concurrencia 59
28.1. Atributos de una transacción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
29.Schedules de transacciones 61
VI Técnicas de Recuperación 67
31.Necesidad de Recuperación 67
32.Archivo de Log 67
32.1. Checkpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
32.1.1. Checkpoints bloqueantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
32.1.2. Checkpoints no bloqueantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
33.Protocolos de Recuperación 69
33.1. Deferred update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
33.2. Immediate update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
33.2.1. UNDO/REDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
33.2.2. UNDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Colaboradores 74
Historial de cambios 75
LaTeX es libre, por lo que existen multitud de utilidades y herramientas para su uso, se dispone de mucha
documentación que ayuda al enriquecimiento del estilo final del documento sin demasiado esfuerzo.
Esta herramienta es muy utilizado en el ámbito científico, para la publicación de papers, tesis u otros docu-
mentos. Incluso, en FIUBA, es utilizado para crear los enunciados de exámenes y apuntes oficiales de algunos
cursos.
Su uso es relativamente sencillo y su filosofía colaborativa permite que se sumen colaboradores a un proyecto
fácilmente.
GitHub es una plataforma que, además de ofrecer los repositorios git, ofrece funcionalidades adicionales muy
interesantes como gestor de reporte de errores.
Dato tupla <nombre de objeto, propiedad de objeto, valor de la propiedad del objeto, instante>.
Dato elemental terna <nombre de objeto, propiedad de objeto, valor de la propiedad del objeto>.
Modelo de datos herramienta intelectual que provee una interpretación del mundo real. Es un dispositivo de
abstracción.
2. BDs y SGBDs
Sistema de Base de Datos está formado por cuatro componentes:
1. Hardware
2. Software
3. Datos
4. Personas
b) Usuarios
Sistema de Gestión de Base de Datos (SGBD) Ejemplos: Oracle, MySQL, SQL Sever, DB2, Access, Pos-
greSQL. Sistema formado por datos y los programas que acceden a los datos. Su objetivo es almacenar y
permitir consultas en formas convenientes y eficientes.
Está formado por tres capas, las abstracciones:
1. Nivel exterior : “vistas” que ven los usuarios. Solo ven una parte de la base de datos, la que les interesa
2. Nivel lógico: cómo se agrupan lógicamente los datos, las entidades y sus relaciones. Ejemplo: tablas,
grafos.
3. Nivel físico: como se organizan físicamente los datos. Ejemplos: bitmaps, árboles.
Gestión de Base de Datos está formada por las siguientes herramientas:
1. Compiladores: proveen el lenguaje de consulta.
2. Catálogo: provee información de la base de datos; por ejemplo, para sacar estadísticas de consultas.
3. Optimizador de consultas
4. Manejador de transacciones: asegura que una transacción se ejecute completamente o permita una
vuelta atrás.
5. Manejador de concurrencia: asegura la integridad de la base de datos ante usuarios concurrentes.
6. Manejador de seguridad :
a) Contra hechos no intencionales. Ejemplo: fallas de energía.
b) Contra hechos intencionales. Ejemplo: ataques de terceros para robar información.
Figura 2: SGBD
Esquema de la base de datos descripción de la base de datos. La base de datos física varía con el tiempo
(porque se producen altas, bajas y modificaciones), pero el esquema es fijo (o se cambia en raras ocasiones).
Modelo conceptual: representación de alto nivel, que concentra los requerimientos del cliente. Utiliza
el modelo Entidad-Relación.
Inconsistencia y redundancia, porque se usan muchos archivos, y tal vez tienen distintos formatos
Dificultad para acceder a los datos, porque se necesitan programas para acceder a los archivos
Problemas de integridad, porque es difícil cambiar todos los programas para que adopten restricciones de
consistencia
Problemas de seguridad
La potencia semántica de un modelo de datos está determinada por su capacidad de representar, además
de la estructura de los datos, el significado de los mismos y sus interrelaciones.
2.4.2. Restricciones
Tipos de restricciones sobre una base de datos:
5. De objetos: existe una persistencia de los objetos más allá de la existencia en memoria
3.1. Entidades
El modelo entidad-interrelación se basa en la idea de que el mundo real está compuesto por objetos (las
entidades) y las interrelaciones que hay entre las entidades.
Entidad algo que existe, concreto o abstracto. Ejemplo: una persona Juan, la cuenta bancaria n°4500011.
Conjunto de entidades / tipo de entidad conjunto de entidades del mismo tipo. Ejemplo: el conjunto de
entidades “cliente” abarca todas las personas que tienen cuenta en un banco.
Un conjunto de entidades E tiene un predicado asociado p para probar si una entidad e pertenece al conjunto.
E = {e/p(e)}
Los conjuntos de entidades no necesitan ser disjuntos. Ejemplo: “animales” y “mamíferos” no son disjuntos.
Un tipo de entidad queda definido por:
1. Nombre: en singular o frase simple en singular. Ejemplos: “cliente”, “cuenta corriente”
2. Significado: texto preciso, conciso y claro. Debe indicar, si existieran, dependencias con otros tipos de
entidades
3. Atributos: características de todas las entidades de ese tipo. Ejemplo: para el conjunto de entidades
“cliente”, posibles atributos son “nombre”, “DNI”, “calle”, “ciudad”, etc. Cada atributo tiene un conjunto
de valores permitidos, denominado el dominio del atributo. Ejemplo: el DNI debe ser un número positivo.
Los atributos deben ser atómicos (es decir, que no se pueden descomponer), y no pueden estar repetidos.
Formalmente, un atributo es una función que hace corresponder un conjunto de entidades a un dominio o
producto cartesiano de dominios. Ejemplo: una entidad “empleado” está descrita por el conjunto {(nombre,
Juan), (apellido, Cancela), (DNI, 5.678.901)}.
Un atributo puede tener el valor nulo, por varias razones:
a) No aplica
b) Faltante
c) Desconocido
Tipos de atributos:
a) Simple vs compuesto. Ejemplo: nombre puede descomponerse en primer nombre, segundo nombre, y
apellido.
b) Un valor vs Multivaluado: se repite varias veces en la entidad. Ejemplo: número de teléfono.
c) Derivable: su valor puede calcularse a partir de otros atributos. Debe evitarse. Ejemplo: si tengo el
atributo “fecha de nacimiento”, “edad” es un atributo derivable.
4. Identificador: atributo o conjunto de atributos que permiten distinguir a cada entidad dentro del conjunto
de entidades del mismo tipo.
3.2. Interrelaciones
Interrelación asociación entre dos o más conjuntos de entidades.
Conjunto de interrelaciones / tipo de interrelación conjunto de interrelaciones del mismo tipo. Si E1 , E2 , . . . , En
son conjuntos de entidades, entonces el conjunto de interrelaciones R es un subconjunto del producto car-
tesiano
{(e1 , e2 , . . . , en ) /e1 ∈ E1 , e2 ∈ E2 , . . . , en ∈ En }
Un tipo de interrelación puede tener atributos descriptivos. Ejemplo: la interrelación “tenencia” puede
tener un atributo “fecha último movimiento”.
Características:
Cardinalidad de una interrelación cantidad de tipos de entidades con las que puede estar relacionado.
Rol función que desempeña una entidad en una interrelación. Normalmente no se especifica porque está implí-
cito. Ejemplos: un cliente “tiene” una cuenta, un empleado “es jefe de” n empleados.
Instancia de una interrelación asociación entre dos o más entidades. Debe ser unívocamente identificable
sin usar los atributos descriptivos de la interrelación.
1. Un atributo propio, o
2. Una clave primaria, formada por los atributos de las claves primarias de los tipos de entidad que asocian.
Ejemplo: “DNI” es la clave primaria de “cliente”, y “nro cuenta” es la clave primaria de “cuenta”. La clave
primaria del tipo de interrelación “tenencia” es (DNI, nro cuenta)
La estructura de la clave primaria de una interrelación R depende de las restricciones de cardinalidad del
conjunto de interrelaciones.
3.3. Restricciones
3.3.1. Restricciones de participación
Se dice que la participación de un conjunto de entidades E en un conjunto de interrelaciones R es total
cuando cada entidad en E participa en al menos una interrelación en R. Si solo algunas entidades participan,
la participación es parcial.
Para una interrelación binaria R entre dos tipos de entidades A y B, la cardinalidad puede ser:
1. Uno a uno (1 : 1): Una entidad en A está asociada como máximo a una entidad en B, y una entidad en
B está asociada como máximo a una entidad en A.
Figura 7: Cardinalidad 1 : 1
2. Uno a muchos (1 : M ): Una entidad en A está asociada como máximo con cualquier cantidad de entidades
en B, y una entidad en B está asociada como máximo a una entidad en A.
También existe la restricción “muchos a uno” (M : 1).
Figura 8: Cardinalidad 1 : M
3. Muchos a muchos (M : M ): Una entidad en A está asociada como máximo con cualquier cantidad de
entidades en B, y una entidad en B está asociada como máximo con cualquier cantidad de entidades en
A.
Figura 9: Cardinalidad M : M
Para una interrelación ternaria R entre tres tipos de entidades A, B y C, la cardinalidad puede ser:
N:N:N
Figura 11: Las fábricas le compran insumos a proveedores. Una fábrica no puede comprar el mismo insumo a
más de un proveedor.
Figura 12: Las fábricas le compran insumos a proveedores. Una fábrica no puede comprar el mismo insumo a
más de un proveedor. Un proveedor no puede venderle el mismo insumo a más de una fabrica.
Figura 13: Las fábricas le compran insumos a proveedores. Una fábrica no puede comprar el mismo insumo a
más de un proveedor. Un proveedor no puede venderle el mismo insumo a más de una fabrica. Una
fábrica no puede comprarle más de un insumo a cada proveedor.
Claves candidatas de “Compra”: {idf ábrica , idinsumo } ; {idproveedor , idinsumo } ; {idf ábrica , idproveedor }
Teorema: en las relaciones ternarias, las restricciones de cardinalidad no imponen restricciones en las
relaciones binarias. En el ejemplo anterior, una fábrica puede comprar N insumos. Una fábrica puede comprarle
a N proveedores. Un proveedor puede proveer N insumos.
Superclave conjunto de uno o más atributos que, tomados en conjunto, permiten identificar unívocamente
una entidad o una interrelación en el conjunto de entidades o interrelaciones del mismo tipo.
Clave candidata superclaves minimales; aquellas para las cuales ningún subconjunto propio es una superclave.
1. Unicidad : en todo momento, no existen dos tuplas distintas de R que tengan el mismo valor para
Ai , donde i ∈ [1, k].
2. Minimalidad : ningún atributo de K puede ser eliminado sin que se pierda la propiedad de unicidad.
Clave primaria aquella clave candidata que es elegida por el diseñador del modelo de datos para identificar
entidades dentro del conjunto de entidades. Esta clave no debería cambiar en el tiempo. Ejemplo: la
dirección de un cliente no es una buena clave primaria, porque se puede mudar
Clave foránea atributo o conjunto de atributos que es clave primaria en otra relación. Ejemplo: en una relación
“autos”, puede haber una clave foránea “DNI” que es la clave primaria en otra relación “personas”, y que
indica el dueño de ese auto
Entidad débil entidad que tiene dependencia de identificación, porque no es identificable por sus propios
atributos. Está subordinada a otro tipo de entidad, la entidad fuerte.
El concepto de entidades fuertes y débiles está relacionado con el concepto de dependencia de existencia.
Una entidad débil es, por definición, una entidad subordinada a la entidad dominante de la cual depende
su identidad. Toda dependencia de identidad es una dependencia de existencia, pero una dependencia de
existencia no implica necesariamente una dependencia de identidad.
Discriminador atributo o conjunto de atributos de una entidad débil que lo distingue de otras entidades
débiles que dependen de la misma entidad fuerte.
Para una entidad débil, su clave primaria está formada por su identificador más la clave primaria de la
entidad fuerte de la cual depende.
Figura 15: Simbología en los diagramas E-R para entidades fuertes (cuenta) y débiles (transacción). La clave
primaria de la entidad fuerte se identifica con el atributo subrayado (nro. cuenta). La dependencia a
la entidad fuerte se identifica con arcos dobles. El discriminador de la entidad débil se identifica con
el atributo subrayado a medias (nro. transacción). El identificador de la entidad débil es la suma
de su discriminador y de la clave primaria de la entidad fuerte (nro. cuenta + nro. transacción)
D1 × . . . × Dn
Representación de generalización
Hay dos métodos:
1. Una tabla para la superclase + una tabla para cada subclase, que incluya una columna con la clave
primaria de la superclase
2. Si la generalización es disjunta y completa, no se crea una tabla para la superclase. Se crea una tabla
para cada subclase, que incluya todos los atributos de la superclase.
Representación de agregación
La tabla de la interrelación R entre la agregación A y el conjunto de entidades B incluye una columna
por cada clave primaria de B y A.
4. Modelo Relacional
4.1. Estructura del modelo relacional
El modelo relacional es un ejemplo de modelo basado en registros. Usa un grupo de tablas para representar
los datos y las relaciones entre los datos. Cada tabla tiene múltiples columnas. Cada tabla contiene registros de
un tipo en particular. Cada registro tiene atributos (las columnas).
Esquema de relación descripción de una relación. Es el nombre de la relación seguido de la lista de los
atributos con sus dominios. Ejemplo: Estudiante (Padrón, nombre, dirección, fechaIngreso)
Relación instancia de un esquema. Subconjunto del producto cartesiano de una lista de dominios. Sea el
esquema de relación R, denotamos a la instancia r mediante r(R).
Tabla representación de una relación. Se pueden relacionar entre sí al compartir atributos. Una tabla de n
atributos es un subconjunto de D1 × D2 × · · · × Dn . Notar que al ser un conjunto, el orden no interesa.
Operaciones unarias
Proyección
ℵ
Selección
Selección: σp (r)
Devuelve una relación r0 con el mismo esquema que r, en la que las tuplas son aquellas pertenecientes
a r que satisfacen la condición o el predicado p. La condición puede ser de dos estilos:
1. Atómica: expresión lógica simple del tipo que utiliza un operador de comparación θ, tal que
θ ∈ {=, 6=, <, >, ≤, ≥}. Se permiten dos tipos de expresiones:
a) Atributo θ atributo
b) Atributo θ constante
2. Compuesta: utiliza conectores and, or, not.
ℵ
Renombre
Operaciones binarias
Unión
[
Unión: r s
Sean r y s instancias homogéneas a de las relaciones R y S respectivamente. r contiene m tuplas y s
contiene n tuplas. La unión se define como:
[
r s = {x : x ∈ r ∨ x ∈ s}
ℵ
Diferencia
Diferencia: r − s
Sean r y s instancias homogéneas de las relaciones R y S respectivamente. La diferencia se define
como:
r − s = {x : x ∈ r ∧ x 6∈ s}
ℵ
Producto cartesiano
Producto cartesiano: r × s
Sean r y s instancias de las relaciones R y S respectivamente. El producto cartesiano es el conjunto
de tuplas que resulta de concatenar cada tupla de r con cada tupla de s.
Dadas las relaciones r1 y r2 con el mismo esquema, devuelve una relación r con igual esquema, tal que
r = {x : x ∈ r1 ∧ x ∈ r2 } \
r s ≡ r − (r − s)
2. Junta (join) (r ./ s)
La junta de dos relaciones r y s según un predicado P es una relación de esquema igual al producto
cartesiano r × s, cuyas tuplas son el conjunto de tuplas de r × s que satisfacen el predicado P .
r ./p s ≡ σp (r × s)
a) Equi-join: dadas las relaciones r y s, es el join según el predicado r.Ai = s.Aj
b) Auto-join: dada la relación r, es el join de r consigo mismo según el predicado 1.Ai θ 2.Ai donde 1
y 2 son aliases de r.
c) Natural
T join (r ∗ s). Requiere que haya atributos compartidos entre las relaciones r y s, y además
que R S 6= ∅.
r ∗ s ≡ πR∪S (σr.c1 =s.c1 ∧r.c2 =s.c2 ∧···∧r.ch =s.ch (r × s))
El join natural es una operación asociativa, por lo tanto, (r ∗ s) ∗ t = r ∗ (s ∗ t).
3. División (r/s).
Sean las relaciones r ∈ R con n atributos y s ∈ S con m atributos, tal que m < n y S ⊂ R. La división
son todas las tuplas t tales que, multiplicadas por todas las filas u de s, me dan filas que están en r. El
esquema de la división es R − S.
4. Asignación (r ← s)
r no cambia al ejecutar operaciones de actualización sobre s.
donde E es una expresión de álgebra relacional, y Fi es una expresión aritmética que involucra constantes
y atributos del esquema E.
donde E una expresión de álgebra relacional; Gi es un atributo para formar grupos, Fi es una función
agregada, y Ai es un atributo. Las tuplas de la relación resultado de E se particionan en grupos de tal
forma que
Para cada grupo, la relación tendrá una tupla (g1 , . . . , gn , a1 , . . . , am ) donde para cada i, ai es el resultado
de aplicar la función Fi en el multiconjunto, para el atributo Ai del grupo.
Ejemplo: dada la relación EmpleadosPartTime(nombre,sucursal,salario), la siguiente expresión devuelve
una relación con un solo atributo (sin nombre) y una sola fila, que contiene el valor de la suma de todos
los salarios:
Gsum(salario) EmpleadosP artT ime
Se puede usar el operador de grupos para particionar una relación y computar una función agregada a
cada grupo.
Ejemplo: con la misma relación anterior, la siguiente expresión devuelve una relación con dos atributos
(sin nombres), que contiene la suma de salarios de cada sucursal:
3. Join externo (outer join): es una extensión de la operación de join que lidia con información faltante
(null s).
a) Left outer join (r1 ./ r2 ): hace un join natural, y toma todas las tuplas de r1 que no matchearon con
ninguna tupla de r2 , les agrega valores null a los atributos de r2 , y los agrega al resultado.
b) Right outer join (r1 ./ r2 ): hace un join natural, y toma todas las tuplas de r2 que no matchearon
con ninguna tupla de r1 , les agrega valores null a los atributos de r1 , y los agrega al resultado.
1 Un multiconjunto es un conjunto en el que un valor puede aparecer muchas veces.
4.5.2. Insert
En álgebra relacional se expresa como r ← r ∪ E, donde r es una relación y E es una expresión de consulta,
o una relación constante con una sola tupla.
4.5.3. Update
En álgebra relacional se expresa como r ← πF1 ,...,Fn (r), donde r es una relación y cada Fi es, o el atributo
i-ésimo de r, o una expresión que involucra solo constantes y el nuevo valor de r, que da el nuevo valor del
atributo i-ésimo.
Vista materializada vista que se evalúa y se almacena físicamente. Los cambios a estas vistas se realizan de
forma incremental (no se reconstruye toda la vista desde cero)
5. Cálculo relacional
COMPLETAR
6. Lenguajes de consulta
Query expresión que solicita una porción de información.
7. Integridad y seguridad
En SQL, tenemos las siguientes restricciones:
NOT NULL: indica que un atributo no puede tener el valor null
UNIQUE: asegura que para todas las tuplas, el valor del atributo es único
PRIMARY KEY: asegura que una o varias columnas tengan una identidad única, no nula
FOREIGN KEY: asegura la integridad referencial de una tabla
CHECK: asegura que el valor de un atributo satisface una condición especificada
DEFAULT: especifica un valor por defecto cuando no se especifique ninguo
SET DEFAULT / SET NULL: se fija el valor predeterminado o nulo en la fila referenciante.
CASCADE: al eliminar una tupla referenciada, las tuplas referenciantes son eliminadas. Al modificar la clave
en la tabla referenciada, el correspondiente valor de la clave foránea es actualizado.
Para eliminar autorizaciones se usa el comando REVOKE. Por defecto, este comando tiene el efecto de revocar
los privilegios que el usuario le brindó a otros. Para evitar este efecto cascada, se usa la opción RESTRICT.
1 REVOKE < privilegios >
2 ON <[ relacion | vista ] >
3 FROM <[ usuario | rol ] >
4 [ RESTRICT ];
8. Triggers
Trigger: comando que el sistema ejecuta automáticamente si un evento satisface cierta condición. Son un
conjunto de acciones; por ejemplo, enviar un e-mail, ejecutar el rollback de una transacción, o crear una copia
de la base de datos.
1 CREATE TRIGGER chequear_horario
2 [ BEFORE | AFTER ] [ UPDATE | INSERT | DELETE ] [ OF atributo ] ON curso
3 WHEN condicion
4 BEGIN
5 acciones
6 END
ℵ
Notación
Nombre de esquemas: R, S, R1 , . . . , Rn , S1 , . . . , Sn
Instancias de esquemas: r, s, r1 , . . . rn , s1 , . . . , sn
Conjuntos de atributos: α, β, γ
Atributos: A, B, C
Tuplas: t1 , t2
9. Dependencias funcionales
Dependencia funcional sea el esquema R, y sean α ⊆ R y β ⊆ R. La dependencia funcional α → β se cumple
si para cada par de tuplas t1 , t2 tal que t1 [α] = t2 [α], también se cumple que t1 [β] = t2 [β].
Una dependencia funcional es trivial si β ⊆ α. En particular, α → α es trivial.
Un conjunto K es superclave de R si K → R.
Un conjunto J es clave candidata de R si J → R y además 6 ∃γ ⊂ J/γ → R.
Una dependencia funcional, a diferencia de una diferencia multivaluada o de junta, prohíbe que ciertas
tuplas existan.
Dependencias funcionales implicadas sea el esquema R. Una dependencia funcional f está lógicamente
implicada por un conjunto de dependencias F , si para cada instancia de relación r(R) que cumple F ,
también cumple f .
Axiomas de Armstrong
1. Regla de reflexividad
Si α es un conjunto de atributos y β ⊆ α, entonces (α → β) ∈ F +
2. Regla de aumento
Si α → β es una dependencia funcional y γ es un conjunto de atributos, entonces (γα → γβ) ∈
F+
3. Regla de transitividad
Si α → β es una dependencia funcional y β → γ es otra dependencia funcional, entonces
(α → γ) ∈ F +
ℵ
Propiedades deducidas de los axiomas de Armstrong
1. Regla de unión
Si se cumplen α → β y α → γ, entonces también se cumple α → βγ
2. Regla de descomposición
Si se cumple α → βγ, entonces también se cumplen α → β y α → γ
3. Regla de pseudotransitividad
Si se cumplen α → β y γβ → δ, entonces también se cumple γα → δ
ℵ
Teorema: R satisface la dependencia funcional X → Y sí y sólo sí R descompone sin pérdida sobre los
esquemas XY y X(R − XY ), es decir, si R satisface la dependencia de junta ∗ (XY, X(R − XY ))
Algoritmo 1 Computar F +
Entrada: relación R, conjunto de dependencias funcionales F
Salida: F +
1. F + = F
2. Repetir hasta que F + no varíe:
a) Para cada dependencia funcional f en F + :
Aplicar reglas de reflexividad y aumentación a f
Agregar las dependencias funcionales restantes a F +
b) Para cada par de dependencias funcionales f1 , f2 en F + :
Si f1 , f2 pueden combinarse usando el axioma de transitividad:
Agregar la dependencia funcional resultante a F +
3. Devolver F +
Algoritmo 2 Computar α+
Entrada: relación R, conjunto de dependencias funcionales F , atributo α
Salida: αF
+
1. a+ = a
2. Repetir hasta que a+ no varíe:
a) Para cada dependencia funcional B → Y ∈ F :
Si B ⊆ a+ : a+ = a+ ∪ Y
3. Devolver a+
Clave y Superclave
Y es superclave para R si solo cumple la condición 1, otra manera de decirlo es que Y es superclave si
es superconjunto de una clave.
4. K = {}
5. Repetir hasta que no se pueda agregar nada a K:
a) CC = todos los atributos de Vni
b) Agregar a CC un atributo de R que no esté en Voi ni Vni
c) K = K ∪ CC
6. Devolver K
• Fmin − {A → D} = {A → B, B → C, B → D, A → E}
• A+
Fmin −{A→D} = ABCDE
Fmin = {A → B, B → C, B → D, A → E}
Una relación con esquema R está en 1FN si los dominios de sus atributos son atómicos, y si no hay
atributos similares repetidos.
ℵ
Ejemplo: la siguiente relación no está en 1FN.
ID libro Autor
ID libro Título Libro 1 Avi Silberschatz
1 Database System Concepts 1 Henry Korth
2 Applied Cryptography 1 S. Sudarshan
2 Bruce Schneier
r ⊆ r1 ./ r2 ./ . . . ./ rn
Es decir, r es un subconjunto de la junta de la descomposición (la junta podría tener tuplas que no
están en r).
1. Fi = {}
2. Para cada conjunto de atributos X que es un subconjunto de atributos de Ri :
a) Calcular XF+
b) Fi = Fi ∪ {X → A}, tal que A ⊆ XF+ y A ⊆ Ri
3. Devolver Fi
3. Si B ⊆ Z: devolver “verdadero”
4. Si no: devolver “falso”.
R1 ∩ R2 → R1 − R2
R1 ∩ R2 → R2 − R1
R1 ∩ R2 = D
R1 − R2 = AEF
R2 − R1 = BC
Como DF+ = {D}, vemos que no se cumplen ni R1 ∩ R2 → R1 − R2 ni R1 ∩ R2 → R2 − R1 . Por lo tanto,
esta descomposición no es SPI.
2. i = 1
3. Obtener T (i) :
Aplicamos CD → A. Las filas 1 y 3 tienen mismo valor para c y d, pero distinto valor para a. Por lo tanto,
cambiamos b31 por a1 en la tercera fila.
A B C D
R1 (A, D) a1 b12 a3 a4
R2 (A, C) a1 b12 a3 b24
R3 (B, C, D) a1 a2 a3 a4
En este punto notamos que la fila 3 tiene valores de la forma aj . Como son todas variables distinguidas, la
descomposición es sin pérdida de información.
Sea R una relación y F el conjunto de sus dependencias funcionales. R estará en 2FN si para
toda dependencia funcional X → Y que está en en F + , se cumple al menos una de las siguientes
condiciones:
1. X → Y es trivial
2. Y es un atributo primo,
3. X no es un subconjunto de una clave candidata
ℵ
Ejemplo: la siguiente relación no está en 2FN porque Dirección de local depende sólo de ID de local, que
no es una clave.
ID de cliente ID de local Dirección de local
1 1 Los Angeles
1 3 San Francisco
2 1 Los Angeles
F = {Id cliente, Id local → Direccion local; Id local → Direccion local}.
La segunda dependencia funcional no es trivial, el lado derecho no pertenece a una clave candidata, y el lado
izquierdo es un subconjunto de la clave candidata.
Para normalizarla, hay que dividirla en dos relaciones.
ID de cliente ID de local
ID de local Dirección de local
1 1
1 Los Angeles
1 3
3 San Francisco
2 1
Para verificar si una dependencia funcional α → β viola FNBC, alcanza con computar α+ y ver si es R.
Para verificar si una relación R está en FNBC, alcanza con ver si las dependencias de F no violan FNBC.
Para verificar si una descomposición Ri está en FNBC, para cada subconjunto α de atributos de Ri , verificar
que αF
+
o no incluya atributos de Ri − α, o incluya todos los atributos de Ri .
A statement of Codd’s definition of 3NF, paralleling the traditional pledge to give true evidence in a
court of law, was given by Bill Kent: [Every] non-key [attribute] must provide a fact about the key,
the whole key, and nothing but the key. A common variation supplements this definition with the
oath: so help me Codd.
Requiring existence of the key ensures that the table is in 1NF; requiring that non-key attributes be
dependent on the whole key ensures 2NF; further requiring that non-key attributes be dependent on
nothing but the key ensures 3NF.
Dicho de otra forma, R no debe tener dependencias funcionales transitivas: todos los atributos que
no son clave deben depender funcionalmente de la clave primaria.
ℵ
Propiedades de la tercera forma normal (3FN)
1. ρ = {}
2. Para cada dependencia funcional X → Y ∈ Fmin :
ρ = ρ ∪ Ri (XY )
3. Si existen Ri , Rj ∈ ρ tal que Ri ⊆ Rj :
ρ = ρ − Ri
4. Si ninguna relación es una superclave de R, y K es una clave para R
ρ=ρ∪K
5. Devolver ρ
Ejemplo: la siguiente relación no está en 3FN porque Fecha de nacimiento del ganador depende sólo de
Ganador, que depende de la clave candidata {Torneo, Año}.
Torneo Año Ganador Fecha de nacimiento de ganador
Indiana Invitational 1998 Al Fredrickson 21 Julio 1975
Cleveland Open 1999 Bob Albertson 28 Septiembre 1968
Des Moines Masters 1999 Al Fredrickson 21 Julio 1975
Indiana Invitational 1999 Chip Masterson 14 Marzo 1977
F = {T orneo, Año → Ganador, Ganador → F echa nacimiento ganador}. La segunda dependencia funcio-
nal no es trivial, el lado derecho no pertenece a una clave candidata (no es atributo primo), y el lado izquierdo
no es una superclave.
Para normalizarla, hay que dividirla en dos relaciones.
t3 [B] = t1 [B]
t3 [U − A − B] = t2 [U − A − B]
t4 [B] = t2 [B]
t4 [U − A − B] = t1 [U − A − B]
Ejemplo: sea R(curso, libro, prof esor) una relación que indica una lista de cursos universitarios, los libros
que se usan en el curso, y los profesores que la dictan.
Dado que los profesores de un curso y los libros de un curso son independientes entre sí, esta relación tie-
ne una DMV. Si tuviésemos que agregar un nuevo libro al curso “Álgebra II”, deberíamos agregar una tupla
para cada profesor del curso. Es decir, formalmente, hay dos DMV en esta relación: {curso} {libro} y
{curso} {prof esor}. Esta relación exhibe redundancia.
Dependencia multivaluada: no existen en el esquema original pero son satisfechas por la descomposición
del mismo.
Teorema: las únicas DMVs implicadas por un conjunto de DFs son de la forma X Y , donde Y ⊆ X + o
R − XY ⊆ X + .
Teorema: las únicas DFs implicadas por un conjunto de DMVs son las triviales.
Teorema: un conjunto de DFs de tipo xi → yi sólo implica DMVs de tipo xi yi .
Teorema: sea r una instancia del esquema de relación R, X, Y subconjuntos de R, y Z = R − XY . La
relación r satisface la DMV X Y sí y solo sí R1 = XY y R2 = X ∪Z descomponen sin pérdida de información
a r.
2. Calcular R1 ./ R2
3. Si r = R1 ./ R2 devolver “verdadero”
Ejemplo: sea S = {ABCD, CDE, AE} y U = ABCDE. Entonces la base de S es Base(S) = {A, B, CD, E}.
1. T = R − X
2. Mientras T varíe:
Si ∃V ∈ T y Y Z ∈ M tal que (V ∩ Y = ∅) y (V ∩ Z 6= ∅)
Reemplazar V por {V ∩ Z} y {V − Z}
3. Bdep(X) = T ∪ {A/A ∈ X}
1. T (0) = BDEI
3. T (2) = {EI, B, D}
ℵ
Propiedades de la cuarta forma normal (4FN)
ℵ
Ejemplo: la siguiente relación no está en 4FN. La clave es {N ° V uelo, Dia de la semana, T ipo de avión}.
1. R1 ∩ R2 R1 − R2
2. R1 ∩ R2 R2 − R1
La dependencia de junta ∗ (R1 , . . . , Rk ) se satisface para R si restringe los valores de toda instancia r(R) tal
que, si existen k tuplas t1 , . . . , tk que satisfacen ti [Ri ∩ Rj ] = tj [Ri ∩ Rj ], luego también existe en r otra tupla
tk+1 definida por tk+1 [Ri ] = ti [Ri ] para 1 ≤ i ≤ k.
Propiedades:
Si una de las Ri es R, la dependencia de junta es trivial.
Toda dependencia de junta ∗(R1 , R2 ) es equivalente a la dependencia multivaluada R1 ∩ R2 R2 .
No existen un conjunto de reglas para inferir dependencias de juntas.
Teorema: R satisface la dependencia multivaluada X Y sí y sólo sí R descompone sin pérdida sobre los
esquemas X ∪ Y y X(R − XY ), es decir, si R satisface la dependencia de junta ∗ (XY, X(R − XY ))
Teorema: si una relación R puede descomponerse SPI en 3 esquemas, pero no puede hacerlo sobre 2, esa
relación solo satisface DMVs triviales.
r A B C
t1 1 2 3
4 5 6
t2 4 2 7
t3 1 8 7
Una relación R está en 5FN con respecto a un conjunto de dependencias funcionales, multivaluadas
y de junta D, si para todas las dependencias de junta en D+ de la forma ∗ (R1 , . . . , Rn ) donde cada
Ri ⊆ R y R = R1 ∪ · · · ∪ Rn , al menos una de las siguientes condiciones se cumple:
ℵ
Propiedades de la quinta forma normal (5FN)
a) Elegir una dependencia de junta ∗ (DJ1 , . . . DJk )que viole 5FN sobre ρi
b) Descomponer ρi en k relaciones:
R1 (DJ1 )
Rk (DJk )
c) En ρ, reemplazar ρ por R1 , . . . , Rk
3. Devolver ρ
∗ (ABCD, CDE, BDI)
∗ (AB, BCD, AD)
Ejemplo: sea D = sobre el esquema de relación R = ABCDEI.
A → BCDE
BC → AI
Las clave candidata de R son, por las dependencias funcionales, {A, BC}.
R no está en 5FN porque la dependencia de junta ∗ (ABCD, CDE, BDI) no es trivial, y CDE, BDI no
son superclaves de R.
R1
= ABCD
La descomposición R = R2 = CDE sí está en 5FN porque:
R3 = BDI
Para R1 aplica la dependencia de junta ∗ (AB, BCD, AD), y todos los miembros son superclaves de R,
por lo tanto está en 5FN.
3. CL (Control Language)
19. DDL
DDL: Lenguaje de definición de datos para especificar el esquema de la base de datos, eliminar relaciones,
modificar esquemas, crear vistas, crear restricciones de integridad, especificar derechos de acceso, etc.
nvarchar(n): texto de longitud variable, con un máximo de n caracteres, utilizando el formato Unicode
int
smallint
numeric(p,d): p dígitos con signo, y d de los p dígitos están a la derecha del punto decimal.
float(n)
date
time
timestamp
La instrucción anterior crea una tabla llamada r con atributos Ai , y Di es el dominio del atributo Ai .
Las restricciones de integridad pueden ser:
primary key (Aj1 , Aj2 , . . . , Ajm ): los atributos Aji , con i ∈ [1, m] forman la clave primaria de cada tupla.
No pueden ser null, y deben ser únicos.
foreign key:
Se establece que el atributo atr es una clave primaria en la relación rel. Se puede especificar lo que sucede
si se produce una actualización o un borrado de dicho valor en la relación rel:
Diccionario de datos: contiene metadatos (información sobre los datos), en particular, sobre el esquema
de la misma.
20. DML
DML: lenguaje de manipulación de datos para expresar las consultas a la base de datos.
Operaciones CRUD (Create, Read, Update, Delete)
La expresión
1 SELECT a1 , a2 , ... , an
2 FROM r1 , r2 , ... , rm
3 WHERE p ;
El resultado de una expresión SQL puede contener tuplas duplicadas. Para eliminar los duplicados, se
utiliza la cláusula SELECT DISTINCT.
Una cláusula de tipo SELECT * indica que se seleccionan todos los atributos de las relaciones en la cláusula
FROM.
El operador like se puede usar dentro de una cláusula where para buscar valores que cumplan un patrón,
especificado con los siguientes caracteres especiales:
El operador order by <atributo(s)>[asc|desc] ordena el resultado de una consulta por uno o varios
de los atributos, de forma ascendente o descendente (ascendente por default).
• Union
• Intersect
• Except
El operador group by permite agrupar tuplas en base a uno o más atributos (las tuplas con el mismo valor
para los atributos en esta cláusula se ponen en un mismo grupo). Los atributos en la cláusula select, por
fuera de las funciones agregadas, deben estar en el operador group by. La sintaxis es:
1 SELECT expr1 , ... , exprN , funcionAgregada ( expr )
2 FROM tablas
3 WHERE condiciones
4 GROUP BY expr1 , ... , exprN ;
Ejemplo: encontrar el promedio del saldo de las cuentas en cada sucursal de un banco.
1 SELECT sucursal - nombre , AVG ( saldo )
2 FROM cuentas
3 GROUP BY sucursal - nombre ;
El operador having permite seleccionar a grupos formados con group by que cumplan una condición.
Cualquier atributo que esté presente en la cláusula having sin agregar, debe aparecer en el operador group
by.
1 SELECT columna , funcion_agregada ( columna )
2 FROM tabla
3 WHERE columna operator value
4 GROUP BY columna
5 HAVING funcion_agregada ( columna ) operator value ;
Ejemplo: encontrar los nombres de las sucursales del banco que tengan un promedio general de saldo mayor
a $1200.
1 SELECT sucursal - nombre
2 FROM cuentas
3 GROUP BY sucursal - nombre
4 HAVING AVG ( saldo ) > 1200
Nota: si se utilizan el operador where y el operador having, primero se aplica el where y luego se filtra por
having.
El conector in permite verificar la pertenencia de un valor a un conjunto que es resultado de una cláusula
select. De forma equivalente, existe el conector not in.
Ejemplo: encontrar los nombres de los clientes que tienen un préstamo y una cuenta en el banco.
1 SELECT DISTINCT cliente - nombre
2 FROM pidio - prestamo
3 WHERE cliente - nombre IN ( SELECT cliente - nombre
4 FROM tiene - cuenta ) ;
El operador de comparación some en una cláusula where de un select externo devuelve verdadero si el
valor del atributo en cuestión es mayor o menor que al menos un valor de la cláusula select interna.
Ejemplo: encontrar los nombres de las sucursales del banco que tienen activos mayores que los de al menos
una sucursal en Brooklyn.
1 SELECT sucursal - nombre
2 FROM sucursales
3 WHERE activos > SOME ( SELECT activos
4 FROM sucursales
5 WHERE sucursal - nombre = ’ Brooklyn ’) ;
El operador de comparación all en una cláusula where de un select externo devuelve verdadero si el
valor del atributo en cuestión es mayor a todos los valores de la cláusula select interna.
Ejemplo: encontrar los nombres de las sucursales del banco que tienen activos mayores que los todas las
sucursales en Brooklyn.
1 SELECT sucursal - nombre
2 FROM sucursales
3 WHERE activos > ALL ( SELECT activos
4 FROM sucursales
5 WHERE sucursal - nombre = ’ Brooklyn ’) ;
20.2. Delete
Sintaxis para el borrado de tuplas de la relación r para las cuales P es verdadera:
1 DELETE FROM r
2 WHERE P
Primero se buscan todas las tuplas que satisfacen P , y luego se borran todas ellas.
20.3. Insert
Sintaxis para la inserción de tuplas en la relación r:
1 INSERT INTO r ( nombreAtributo1 , ... , nombreAtributoN )
2 VALUES ( valor1 , ... , valorN )
1 INSERT INTO r
2 SELECT (...)
Primero se buscan todas las tuplas que satisfacen el select, y luego se insertan todas ellas.
20.4. Update
Sintaxis para la actualización de un atributo de una tupla de r:
1 UPDATE r
2 SET atributo = valor
3 WHERE condicion
1 UPDATE r
2 SET atributo = CASE
3 WHEN condicion1 THEN valor1
4 WHEN condicion2 THEN valor2
5 ELSE valor3
6 END
Procesamiento de Consultas
lr × n r
br =
tam bloque en bytes
nr
fr =
br
21. Índices
Ciertas consultas sobre algunos atributos son más frecuentes que otras. Para acelerar estas consultas, se
utilizan los índices. Podemos tener más de un índice sobre una relación.
Índice Estructura de datos (usualmente árbol B+) que permiten encontrar rápidamente las tuplas de una
relación que tengan un valor especifico para un atributo o atributos (el/los que el índice almacena), con
la desventaja de que cada modificación a la relación requiere actualizar el índice.
Un registro de un índice tiene un valor de la clave de búsqueda, y punteros a uno o más tuplas con esa
clave de búsqueda.
Tipos de índices:
Según la clave:
• Clusterizado / primario: índice cuya clave de búsqueda define el orden secuencial del archivo de
la tabla. Sólo puede haber uno de estos índices para cada relación
• Clusterizado / secundario.
◦ El orden físico de las tuplas no es igual al orden del índice
◦ Las columnas que se indexan son, típicamente, atributos no claves
◦ Siempre son densos
• Denso: tiene un registro para cada valor posible de la clave de búsqueda. Si es clusterizado, tiene
un puntero al primer registro con ese valor. Si es no clusterizado, tiene punteros a todos los registros
con ese valor.
• Esparcido: tiene registros para algunos valores de la clave de búsqueda. Solo se pueden usar si el
archivo de datos está ordenado por la clave de búsqueda.
Esparcido =⇒ P rimario
Secundario =⇒ Denso
Índice compuesto índice cuya clave de búsqueda está formada por más de un atributo. Conviene que los
atributos de más a la izquierda sean más discriminantes que los de la derecha. Ejemplo: para una relación
pelicula(nombre, año), es esperable que haya más consultas sobre el nombre que sobre el año. Entonces,
un índice (nombre, año) sería mejor que (año, nombre).
Índice cubridor Es un índice que contiene todas las columnas de una consulta, y por ende no se necesita
realizar búsquedas adicionales en el índice clusterizado.
Tabla de hash
Ventajas Desventajas
Árbol B+ Soporta búsquedas por rango Operaciones más costosas
Tabla de hash La búsqueda típica requiere solo No soporta búsquedas por rango.
una operación de I/O
2. Usando índices
3. Hashing
4. Ordenamiento
Los algoritmos pueden asumir que una relación entra completamente en memoria, o que son muy grandes.
22.1. Operadores
Scan
23. Algoritmos
23.1. Selección
σA=a (r)
• Si la relación es clusterizada: br
• Si la relación no está clusterizada: nr
23.2. Junta
R(X, Y ) ./ S(Y, Z), donde R es la relación más pequeña. Suponemos que la memoria está formada por M
buffers.
• costo ns × nr
• Costo br + br
m−1 × bs (R se lee una vez, S se lee por cada pedazo de R, cada pedazo es de tamaño
m−1 )
br
Indexed nested-loop join: suponer que se tiene un índice sobre S del atributo Y .
Método Simple de Junta Hash: utiliza una función de hash h. Requiere que la relación R entre en memoria.
h → [0, M − 1].
• Costo: br + bs
1 TH = {} // en memoria
2
3 // fase constructiva . Costo : bR
4 para cada bloque de R :
5 para cada tupla r del bloque :
6 calcular h ( r [ Y ])
7 guardar TH [ Y ] = r
8
9 // fase exploratoria . Costo : bS
10 para cada bloque de S :
11 para cada tupla s del bloque :
12 calcular h ( s [ Y ])
13 agregar al resultado las tuplas de TH [ Y ] join " s "
Método GRACE:
El método de junta Hash versión GRACE se usa para calcular la junta R ./R.A=S.A S cuando ninguna
de las tablas entran en memoria. Lo que se hace es generar 2 conjuntos de M particiones. Se utilizan dos
funciones de hash: una para generar las particiones h : A → [0, M − 1], y otra para calcular qué tuplas
hacen join.
Etapa 1: Particionamiento
- Por cada tupla t de R se aplica la función de hashing h(t) para saber a qué partición enviar la
tupla, sí la partición se completa se graba en disco. Al finalizar la etapa, se graban las M particiones a
disco.
- Se hace lo mismo con S, pero con otros M archivos. La clave está en que si dos tuplas hacen join,
entonces necesariamente deben estar en el mismo número de partición.
De este modo R queda particionada en Ri subconjuntos con 0 ≤ i ≤ M − 1, del mismo modo que S queda
particionada en Si subconjuntos.
Etapa 2: Junta (para cada i)
- Para cada tupla de un Ri se le aplica la función de hash h2 para saber dónde guardarla en una
tabla de hash en memoria (T H).
- Se calcula h2 para cada tupla de un Si y se verifica si en T H existe alguna tupla juntable, si es
así se emite una tupla de resultado y se continua con la siguiente tupla de Si .
• Costo: 3 (bs + br )
1 EXPLAIN consulta
• Si R ∩ S = ∅: nr × ns
• Si R ∩ S = P KR : ≤ nS (porque podría haber nulls)
• Si R ∩ S = P KS : ≤ nR (porque podría haber nulls)
• Si R ∩ S = F KS : nS
• Si R ∩ S = F KR : nR
• Si #(R ∩ S) = 1: ns ×nr
máx(V (S,R∩S),V (R,R∩S)) ≈ ns ×nr
V (S,R∩S) ≈ ns ×nr
V (R,R∩S)
• Si #(R ∩ S) = 2 y el join es de tipo R.A1 = S.A2 ∧ R.B1 = S.B2 :
nr × ns
máx (V (R, A1 ), V (S, A2 ) × máx (V (R, B1 ), V (S, B2 ))
0 1 2 5 “Otros”
R.B 150 200 ? 100 550 (11 valores)
S.B 100 80 70 ? 250 (10 valores)
Suponemos que cada valor que aparece en la relación con menos valores de B (en este caso, S) también
aparecen en la otra relación (en este caso, R). También suponemos que la distribución de los valores dentro de
“Otros” es uniforme, y estimamos la frecuencia de los datos desconocidos:
0 1 2 5 Otros
R.B 150 200 550
11 = 50 100 550 (10 valores)
S.B 100 80 70 250
10 = 25 250 (9 valores)
1. Si R(X, Y ) y S(Y, Z), y V (R, Y ) ≤ V (S, Y ) entonces cada valor de Y en R será un valor de Y en S.
2. Si A es un atributo de R pero no de S, V (R ./ S, A) = v (R, A)
Ejemplo: sean las relaciones Enero(dia, temp) y Julio(dia, temp). Sea la consulta
1 SELECT Enero . dia , Julio . dia
2 FROM Enero , Julio
3 WHERE Enero . temp = Julio . temp
Sabemos que si dos bandas tienen T1 y T2 tuplas respectivamente, y la cantidad de valores de la banda es V ,
entonces la estimación del tamaño de la junta es T1VT2 .
En el ejemplo anterior, las únicas bandas que contribuyen al resultado son las de [2,6] y [7,11]. Entonces, el
tamaño de la junta es:
T [R ./ S] = T R ./temp∈[2,6] S + T R ./temp∈[7,11] S
5 × 10 20 × 5
= +
4 4
= 12, 5 + 25
= 37, 5
Figura 24: El manejador de transacciones (a) le emite órdenes al manejador del log, (b) se asegura que tran-
sacciones concurrentes no interfieran entre ellas. El scheduler permite o bloquea transacciones
27. Transacciones
Transacción unidad lógica de procesamiento. Está formada por una o más operaciones que acceden a la base
de datos. Tiene un identificador único de transacción.
start
leer(X): lee un item de dato de la base de datos a una variable local a la transacción, que está en memoria
commit: marca el fin exitoso de una transacción. Los cambios que introdujo son seguros para guardar en
la base de datos.
abort: marca el fin con errores de una transacción. Los cambios que introdujo se deben revertir.
Partially committed : luego de que se ejecutó la última instrucción pero antes de ejecutar el commit o
abort
Aborted : se ejecutó un roll back de la transacción y la base de datos se restauró a su estado original
Una transacción llega al punto de commit cuando todas sus operaciones se ejecutaron correctamente y se
grabaron todos sus registros de operaciones en el log. Luego de este punto, la transacción está commiteada y
se debe almacenar permanentemente en la base de datos. Esto se marca agregando un registro [commit,T] en
el log.
1. Si ocurre una falla y la transacción aún no grabó [commit,T], se debe ejecutar un rollback de esta
transacción.
2. Si ocurre una falla y la transacción ya había grabado [commit,T] en el log, se debe rehacer esta transacción.
El protocolo WAL (Write-Ahead Logging ) indica que antes de commitear una transacción se debe guardar
el log en memoria al log en disco.
4. The Unrepeatable Read Problem: dos Lecturas consecutivas que producen resultados distintos, por
haber una transacción intermedia que cambió el valor.
Nivel de isolation:
estricto =⇒ serializable
Conflicto dos operaciones en un schedule entran en conflicto cuando se cumplen todas las condiciones siguien-
tes:
1. Corresponden a distintas transacciones
2. Acceden al mismo ítem de dato X
3. Al menos una de esas operaciones es escribir(X)
Dicho de otra forma, están en conflicto cuando, si alteramos el orden de ejecución, cambia el resultado
final de X.
Un schedule es serial cuando ejecuta primero todas las operaciones de T1 , luego todas las operaciones de
T2 , ..., y finalmente todas las operaciones de Tn . Cualquier esquema serial preserva la consistencia de la base de
datos.
Un schedule es serializable cuando es equivalente a algún schedule serial con las mismas transacciones.
Dos schedules son conflicto-equivalentes si el orden de las operaciones en conflicto es la misma en ambos.
Es decir, si podemos transformar uno en el otro mediante una secuencia de swaps de acciones adyacentes que
no están en conflicto.
Figura 29: Convirtiendo un schedule conflicto-serializable en uno serial mediante swaps de acciones adyacentes.
A cada paso están subrayadas las acciones a punto de ser swappeadas
1 Entrada : schedule S
2 Salida : " verdadero " si es conflicto serializable
3
4 para cada transaccion Ti en S :
5 crear un nodo Ti en el grafo de precedencia
6 para cada caso donde Ti ejecuta READ ( X ) y luego Tj ejecuta WRITE ( X ) :
7 agregar una arista ( Ti -> Tj ) en el grafo de precedencia
8 para cada caso donde Ti ejecuta WRITE ( X ) y luego Tj ejecuta READ ( X ) :
9 agregar una arista ( Ti -> Tj ) en el grafo de precedencia
10 para cada caso donde Ti ejecuta WRITE ( X ) y luego Tj ejecuta WRITE ( X ) :
11 agregar una arista ( Ti -> Tj ) en el grafo de precedencia
12
13 si el grafo es aciclico :
14 devolver " verdadero "
15 si el gafo es ciclico :
16 devolver " falso "
Si el grafo de precedencia es acíclico, el schedule serial equivalente puede construirse utilizando un orden
topológico de la siguiente forma: siempre que exista una arista Ti → Tj , Ti debe preceder a Tj en el schedule
serial.
En la práctica, los DBMS no utilizan este algoritmo para garantizar la serializabilidad (porque habría que
verificarlo para cada schedule).
30.1. Lock
Lock variable que se asocia a un ítem de dato. Describe el estado del ítem con respecto a las posibles operaciones
que pueden aplicarse a el. Generalmente hay un lock por item de dato.
2. Compartidos/Exclusivos (Lectura/Escritura): es más laxo que los locks binarios porque permite que
varias transacciones que solo van a ejecutar leer(X) tengan acceso a X. El lock puede tener dos valores:
read-locked o write-locked.
El registro este tipo de lock tiene la forma <Item de dato, LOCK, # de lecturas, Transaccion(es)
con lock>
Reglas que deben aplicarse a cada transacción:
Figura 30: El uso de locks no garantiza la serializabilidad. Si se produce una actualización a A entre unlock(A)
y lock(B), A + B sería incorrecto
2. Deadlock : ocurre cuando cada transacción en un schedule está esperando que se libere un lock que fue
adquirido por otra transacción del schedule.
Para detectar y/o prevenir un deadlock, el gestor de concurrencia puede mantener un grafo de espera.
Cuando una transacción T está esperando a que la transacción S libere un lock, se dibuja una arista
T → S. Cuando S libera el lock, la arista se borra. El deadlock se detecta cuando el grafo es cíclico.
Cuando ocurre un deadlock, el sistema debe ejecutar el rollback de alguna de las dos transacciones, y
liberar los locks que ésta poseía.
También se pueden arreglar deadlocks especificando un timeout para cada transacción. Si se ejecutan por
más tiempo que este timeout, es abortada y sus locks se liberan.
3. Starvation: ocurre cuando una transacción se queda esperando indefinidamente a que se libere un lock.
Se puede evitar de la siguiente forma: cuando una transacción Ti solicita un lock sobre X en un modo M ,
el gestor de concurrencia se lo provee si se verifica que:
a) No hay otra transacción con un lock sobre X en un modo que conflictúe con M .
b) No hay otra transacción esperando obtener un lock sobre X antes que Ti
Lock table tabla que utiliza el gestor de concurrencia para almacenar el estado de los locks activos.
Para cada ítem de dato con locks activos, mantiene una lista de transacciones que solicitaron el lock, en
el orden en que llegaron los pedidos. Se registra qué transacción es y qué modo de lock solicitó. También
se registra si el lock le fue concedido.
Una transacción cumple con el protocolo two-phase locking (2PL) si todas las operaciones de lock
(read_lock, write_lock) preceden al primer unlock de la transacción. Se dice entonces que la transacción
se divide en dos fases: la creciente (donde se adquieren los locks) y la decreciente (donde se liberan los locks).
Si cada transacción de un schedule cumple el protocolo 2PL, se garantiza que el schedule es serializable.
De hecho, las transacciones se pueden ordenar de acuerdo a sus lock points (el punto donde termina la fase
creciente).
Este protocolo limita la cantidad de concurrencia que se permite, porque una transacción no puede liberar
un lock hasta que haya adquirido un lock para todos los demás ítems, y entonces puede haber muchas otras
transacciones esperando que se libere el primer lock. Además, no se previene el deadlock, ni los rollbacks en
cascada.
Para prevenir el problema de deadlock, este protocolo puede ampliarse y exigir que las transacciones adquieran
por adelantado todos los locks que se necesitan; si un lock no se puede conseguir, no se adquiere ninguno. Esto
limita aún más la concurrencia.
Para prevenir el problema de rollbacks en cascada, existe el protocolo 2PL estricto. Este modo, además de
requerir lo mismo que 2PL, requiere que todos los locks exclusivos adquiridos por una transacción se mantengan
hasta que la misma ejecute commit.
Si una transacción quiere insertar un registro, debería adquirir un lock exclusivo de la raíz, ergo de todo el
árbol, y por ende estaría bloqueando a todas las demás transacciones.
Puede aprovecharse la estructura de árbol del índice de la siguiente forma:
Cuando se adquiere un read_lock en un nodo hijo, el lock del nodo padre puede liberarse porque no se
usará más.
Cuando se adquiere un write_lock en un nodo hoja (para realizar una inserción), se debe adquirir un lock
exclusivo en el nodo hoja.
Utilizar la técnica de index locking soluciona el problema de registros phantom.
El protocolo de árbol garantiza un orden serial en las transacciones. El orden de precedencia se define así:
si Ti y Tj adquieren un lock sobre X y Ti adquiere el lock primero, entonces Ti → Tj .
2. Los locks subsiguientes pueden otorgarse sólo si se posee un lock sobre el nodo padre.
3. Se puede ejecutar unlock de un nodo en cualquier momento.
4. No se puede adquirir lock de un nodo 2 veces, incluso cuando se tiene un lock sobre el nodo padre.
Para alcanzar el objetivo de transacciones atómicas, primero se debe guardar en disco información sobre las
modificaciones, sin modificar la base de datos en sí. Para eso se utiliza un archivo de log. Este archivo permite:
Deshacer (undo) cambios hechos por transacciones que deben ser abortadas
Rehacer (redo) cambios hechos por transacciones que ejecutaron commit pero cuyos cambios no fueron
almacenados en la base de datos en disco.
Log archivo secuencial al que solo se le pueden agregar registros.
Decimos que una transacción ejecutó commit cuando su registro [commit,T] fue almacenado en disco. Si
hay una falla luego de esto, se ejecuta un redo. Si hay una falla antes de esto, se hace undo.
Redo debe hacerse en el orden en el que los cambios fueron hechos originalmente.
Undo escribe registros especiales llamados “redo-only”, que no tienen el valor viejo del item de dato. Al
finalizar las escrituras, se escribe un registro <abort,T> para indicar que el undo finalizó.
32.1. Checkpoints
Cuando se produce una caída del sistema, hay que consultar el log para determinar aquellas transacciones que
deben rehacerse o deshacerse. En principio, habría que buscar en todo el log para determinar esta información.
Hay dos grandes dificultades con este enfoque:
1. El proceso de búsqueda lleva mucho tiempo.
2. La mayor parte de las transacciones ya han escrito sus actualizaciones en la base de datos.
Para reducir este tipo de gastos generales, se usan los checkpoints. La periodicidad con que se ejecutan
checkpoints la decide el administrador de base de datos.
• Deferred update
• Immediate update
Write-Ahead Logging (WAL): se deben grabar en disco todos los registros de log sobre las actualización
(incluyendo <UPDATE T,X,Nuevo_valor> y <COMMIT T>), y luego actualizar X en disco.
Tipos de registros
<START T>
<COMMIT T>
<ABORT T>
<UPDATE T,X,Valor_Nuevo>
1 t r a n s a c c i o n e s _ c o m mi t e a d a s = identificarlas
2 t r a n s a c c i o n e s _ i n c om p l e t a s = identificarlas
3
4 desde el comienzo del log hasta el fin :
5 si hay un registro < UPDATE <T ,X , Valor_Nuevo >:
6 si T esta en ‘‘ transacciones_commiteadas ’ ’:
7 escribir ‘‘ Valor_Nuevo ’ ’ en X
8 si no :
9 no hacer nada
10
11 para cada T en ‘‘ transacciones_incompletas ’ ’:
12 escribir < ABORT T >
13
14 flush_log ()
1 t r a n s a c c i o n e s _ c o m mi t e a d a s = identificarlas
2 t r a n s a c c i o n e s _ i n c om p l e t a s = identificarlas
3
4 desde el comienzo del log hasta el fin :
5 si hay un registro < UPDATE <T ,X , Valor_Nuevo >:
6 si T esta en " t r a n sa c c i o n e s _ c om m i t e a d a s ":
7 escribir " Valor_Nuevo " en X
8 si no :
9 no hacer nada
10 si el ultimo registro de checkpoint es < END CHECKPOINT >:
11 // se debe mirar el log hasta el < START Ti > que se ejecuto primero
12 si el ultimo registro de checkpoint es < START CHECKPOINT T1 ,... , TK >:
13 // la caida se produjo durante el checkpointing
14 // buscar el registro < END CHECKPOINT > anterior y su par < START CHECKPOINT
S1 ,... , SK >
15 // rehacer todas las transacciones commiteadas que empezaron despues de ese
START
16 // o son Si
17 // ( si no hay , rehacer desde el principio del log )
18
19 para cada T en t r a n sa c c i o n e s _ i nc o m p l e t a s :
20 escribir < ABORT T >
21
22 flush_log ()
El algoritmo anterior puede ser más eficiente si se ejecuta, para cada item de dato, sólo el último REDO
existente (porque todos los anteriores serían sobrescritos por éste).
33.2.1. UNDO/REDO
Las transacciones y el manejador de buffer obedecen 1 regla:
Si la transacción T modifica el ítem de dato X, el registro de log <UPDATE T,X,Valor_Viejo,Valor_Nuevo>
debe ser escrito al disco antes que el ítem X sea escrito al disco.
Tipos de registros
<START T>
<COMMIT T>
<ABORT T>
<UPDATE T,X,Valor_Viejo,Valor_Nuevo>
33.2.2. UNDO
1. Si la transacción T modifica el ítem de dato X, el registro de log <UPDATE T,X,Valor_Viejo> debe ser
escrito al disco antes que el ítem X sea escrito al disco.
2. Force Log at Commi t (FLC): si la transacción ejecuta commit, los ítems de datos actualizados por la
transacción se deben escribir en el disco, y luego el registro de log <COMMIT T> debe ser escrito al disco.
Tipos de registros
<START T>
<COMMIT T>
<ABORT T>
<UPDATE T,X,Valor_Viejo>
1 t r a n s a c c i o n e s_ c om pl e ta s = {}
2 t r a n s a c c i o n e s _ i n c om p l e t a s = {}
3
4 desde el fin del log hasta el comienzo : // o hasta que se encuentre un registro
< CHECKPOINT >
5 si hay un registro < COMMIT T > o < ABORT T >:
6 t r a n s a c c io ne s_ c om pl e ta s += T
7 si hay un registro < UPDATE <T ,X , Valor_Viejo >:
8 si T esta en " tr an sa c ci on e s_ co mp l et as ":
9 no hacer nada
10 sino :
11 t r a n s a c c i o n e s _ i n c om p l e t a s += T
12 escribir " Valor_Viejo " en " X "
13
14 para cada T en " t r a ns a c c i o n e s _ in c o m p l e t a s ":
15 escribir < ABORT T >
16
17 flush_log ()
1 t r a n s a c c io ne s _c om pl e ta s = {}
2 t r a n s a c c i o n e s _ i n c om p l e t a s = {}
3
4 desde el fin del log :
5 si hay un registro < COMMIT T > o < ABORT T >:
6 t r a ns a cc io ne s _c om pl e ta s += T
7 si hay un registro < UPDATE <T ,X , Valor_Viejo >:
8 si T esta en " tr an sa c ci on es _ co mp le t as ":
9 no hacer nada
10 sino :
11 t r a n s a cc i o n e s _ i n c om p l e t a s += T
12 escribir " Valor_Viejo " en " X "
13 si hay un registro < END CHECKPOINT >:
14 // se debe mirar el log hasta el < START CHECKPOINT > correspondiente
15 si hay un registro < START CHECKPOINT T1 ,... , TK > pero no un < END CHECKPOINT >:
16 // la caida se produjo durante el checkpointing
17 // se debe mirar el log hasta el comienzo de la primera transaccion incompleta
18
19 para cada T en " t r a ns a c c i o n e s _ i nc o m p l e t a s ":
20 escribir < ABORT T >
21
22 flush_log ()
Es necesario que las operaciones de UNDO y REDO sean idempotentes: ejecutarlas una vez debe ser igual
a ejecutarlas muchas veces. De hecho, todo el proceso de recuperación debe ser idempotente para garantizar
que si existe una falla durante la recuperación de una falla, la misma se pueda recuperar también.
Es necesario que el DBMS mantenga:
Lista de transacciones activas
Lista de transacciones que ejecutaron commit
Lista de transacciones abortadas desde el último checkpoint
Colaboradores
Quienes se mencionan a continuación han colaborado y aportado tanto al proyecto FIUBA Apuntes como
en este apunte, redactándolo, corrigiéndolo, agregando gráficos, etc.
Historial de cambios