Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MODELO RELACIONAL
⧫ RELACIONES: Es un conjunto de instancias del mismo tipo definido en base a los atributos que la
componen. Tablas que se describen a través de los atributos o campos. Las instancias que las
componen se las denomina tuplas o filas. Las entidades pasan a ser relaciones.
⧫ ATRIBUTOS: describen y diferencian las instancias entre las distintas relaciones. Se escriben al lado del
nombre de la relación, entre paréntesis.
⧫ CLAVE PRIMARIA: Se subrayan los atributos que la componen con una sola línea simple.
⧫ CLAVE FORÁNEA: Se subrayan los atributos que la componen con una sola línea punteada.
⧫ CLAVE PRIMARIA Y FORÁNEA: Se subrayan los atributos que la componen con doble línea, una simple y
una punteada.
⧫ RELACIONES UNARIAS 11/1N/N1: Los atributos clave se marcan solo como PRINCIPAL y se pone como
FORÁNEA la misma PK pero con otro nombre. Esta clave foránea es la misma que la PK pero con otro
nombre y hace referencia a la clave de la misma relación.
⧫ RELACIONES UNARIAS NN: Se crea una nueva relación y como atributos se pone la misma clave dos
veces (una se llama igual y la otra se cambia de nombre) como PRINCIPAL Y FORÁNEA.
⧫ RELACIONES BINARIAS 11: Se elige cualquiera de las dos entidades para agregar la PK de la otra
relación COMO FORÁNEO. Si hubiera opcionalidad en solo un extremo se pasa la PK como foránea a la
relación que NO es opcional. Si la opcionalidad esta en ambos extremos, se elige uno de los dos.
⧫ RELACIONES BINARIAS 1N/N1: No se tiene en cuenta la opcionalidad. Se pasan los atributos PK de la
relación 1 y se ponen como FORÁNEOS en la relación N.
⧫ RELACIONES BINARIAS NN: Se crea una nueva relación que tenga como atributos FORÁNEOS Y
PRINCIPALES las PK de ambas relaciones, y como atributos normales los atributos de la relación
misma. Y solo como PRINCIPAL la PK de la relación, si tuviese.
⧫ ATRIBUTOS COMPUESTOS: Se elimina ese atributo agrupador, y todos los atributos que componen ese
atributo se agregan de forma normal y como cualquier otro atributo, a la relación de la que forman
parte.
⧫ ATRIBUTOS MULTIVALUADOS: Se lo transforma en una entidad débil y luego se transforma esa entidad
débil.
⧫ ATRIBUTOS CALCULADOS: No se modelan.
⧫ ENTIDAD DÉBIL: Se crea una nueva relación para esta entidad. La clave parcial de esta entidad queda
como FORÁNEA y los atributos clave de la entidad padre pasan como FORÁNEA Y PRINCIPAL.
⧫ RELACIONES TERNARIAS: Siempre se crea una nueva relación. La diferencia esta en que la clave de la
entidad que tiene como cardinalidad 1, solo es FORÁNEA, mientras que las PK de las entidades N son
PRINCIPALES. Siempre necesito, como mínimo, dos claves PRINCIPALES Y FORÁNEAS. Si tuviera
relaciones 111, elijo dos claves que sean PRINCIPAL Y FORÁNEA y la otra solo es FORÁNEA. Si tuviera
11N, la clave N es PRINCIPAL Y FORÁNEA y después elijo una de las de 1 para que también sea
FORÁNEA Y FORÁNEA, la que queda es solo FORÁNEA.
⧫ JERARQUÍAS: La partición y el solapamiento no inciden en la transformación. El atributo discriminante
se agrega como un atributo más en la supraentidad. Se crea una relación con la SUPRAENTIDAD y una
relación diferente por cada SUBENTIDAD. La clave en la SUPRAENTIDAD es una clave PK normal. En las
SUBENTIDADES, se agregan los atributos clave de la supraentidad como PRINCIPAL Y FORÁNEA.
CLAUSURAS:
❖ CLAUSURA DE UN CONJUNTO DE DEPENDENCIAS: Todas las dependencias posibles que se pueden
inferir de F.
❖ CLAUSURA DE UN CONJUNTO DE ATRIBUTOS: Conjunto de atributos que se pueden determinar con un
atributo X.
EQUIVALENCIA ENTRE DOS CONJUNTOS DE Df:
Dos conjuntos son equivalentes cuando sus clausuras son iguales. teniendo F y G, F puede inferirse en G (G
cubre a F) y G puede inferirse en F (F cubre a G).
CONJUNTO MÍNIMO DE Df (Fmin):
Es un conjunto de dependencias funcionales sin redundancia. Puede haber más de una cobertura minimal.
Todas las dependencias tienen un solo atributo en la parte derecha. no se puede reemplazar la Df XY ³ A
por Y ³ A y que siga siendo una Df equivalente. No se puede quitar ninguna Df y seguir teniendo un
conjunto equivalente. Fmin no tiene Df triviales.
FORMAS NORMALES:
❖ 1FN: Admite atributos con valores atómicos. No admite los atributos multivaluados, los atributos
compuestos ni sus combinaciones. Si en una Df, X SI pertenece a la clave candidata entonces esa Df está
en 1FN. Todas las Df son 1FN
❖ 2FN: Se basa en el concepto de dependencia parcial. Si en una Df, X NO pertenece a una clave, entonces
esa Df está en 2FN. 2FN no admite dependencias parciales. Esta en 2FN cuando X no es superclave, Y no
es primo o X no pertenece a ninguna clave.
❖ 3FN: Se basa en el concepto de dependencias transitivas. Si hay Df transitivas, NO es 3FN. La Df es 3FN si
X no es superclave o Y es primo.
❖ FNBC: una Df es FNBC cuando X es superclave.
ALGORITMOS DE NORMALIZACIÓN:
ALGORITMO DE 3FN: Asegura que no hay perdida de Df ni de Información.
ALGORITMO DE FNBC: Asegura la no perdida de información, pero puede haber perdida de Df.
ALGEBRA RELACIONAL:
DADAS LAS RELACIONES R(AB) Y S(AC)
MÍNIMOS EN AR:
El Atributo B de menor valor
máximosR ÿ πA (σ ((2) > (4) (R x R))) // Obtengo todos los que son mayores a alguien
Rta ÿ (πA (R) - máximosR) // Obtengo el/los que sean más chicos que el resto.
MÁXIMOS EN AR:
El atributo B de mayor valor
mínimosR ÿ πA (σ ((2) < (4) (R x R))) // Obtengo todos los que son menores a alguien
Rta ÿ (πA (R) - mínimosR) // De todos los que tengo, saco los más chicos que el resto.
EXACTAMENTE 2:
Atributo A que tenga exactamente 2 del atributo B.
porLoMenos2 ÿ ( σ (1) = (3) AND (2) <> (4) (R x R))
masDe2 ÿ (σ (1) = (3) AND (1) = (5) AND (2) <> (4) AND (2) <> (6) AND (4) <> (6) (R x R x R))
Rta ÿ masDe2 – porLoMenos2
MAS DE DOS:
Atributo A que tenga más de 2 del atributo B. Mas de dos se puede interpretar como 3 o más. y se hace el mismo
procedimiento que en porLoMenos2, pero con tres tablas.
porLoMenos2 ÿ ( σ (1) = (3) AND (2) <> (4) (R x R))
porLoMenos3 ÿ (σ (1) = (3) AND (1) = (5) AND (2) <> (4) AND (2) <> (6) AND (4) <> (6) (porLoMenos2 x R))
COCIENTE:
Todos los atributos A que se relacionan con el atributo C.
todosLosA ÿ πA (R)
todosLosC ÿ πC (S)
todasLasPosibilidades ÿ (R x S)
noExisten ÿ todasLasPosibilidades – S // S son las relaciones entre A y C que si existen.
Rta ÿ todasLasPosibilidades - noExisten
OPERADORES DE ALGEBRA DE
R y S deben tener el mismo grado y mismo dominio.
Obtener un conjunto compuesto por las tuplas que están en R
y además están en S (tuplas exactamente iguales). El nombre
∩
CONJUNTOS
INTERSECCIÓN de las columnas se define por el primer conjunto. Si no hay
tuplas iguales, devuelve un conjunto vacío. Es conmutativa y
asociativa. R y S deben ser unión compatible
El conjunto resultante son los elementos que están en R, pero
no están en S. Se genera una nueva relación. Es anti
conmutativa, si se cambia el orden se obtiene otro resultado y
DIFERENCIA - no es asociativa.
R y S deben ser unión compatible: mismo grado y mismo
dominio.
Teniendo una relación (T) que indica como se relaciona R y S,
OPERADOR DE ALGEBRA
SQL:
VISTAS: Son consultas almacenadas en la base de datos con un nombre, no contienen información, sino que
devuelven el resutlado de la consulta la cual se ejecuta cada vez que la vista es invocada.
Se usan principalmente para almacenar consultas que utilizamos con frecuencia y para restruingir permisos sobre
ciertos datos.
TRUNCATE: Permite eliminar todas las filas de una tabla. La diferencia con el delete es que truncate elimina todas las
tablas y no algunas, no permite ROLL BACK y libera el espacio físico que ocupan las filas.
STORED PROCEDURES: es un programa que esta almacenado físicamente en una base de datos. Se ejecutan
directamente en el motor de base de datos. Poseen acceso directo a los datos que necesitan manipular y solo
necesitan enviar sus resultados de regreso al usuario. Se usan para procesos complejos o grandes que podrían
requerir ejecutar varias sentencias SQL. tienen un nombre y se ejecutan a petición del usuario/cliente. Se puede
llamar a un SP dentro de otro.
Ventajas: Reutilizacion de código, mayor redimiento y trafico de red.
Desventajas: lógica de la aplicación termina distribuida parte en la BD y parte en el código de la aplicación, Aumenta
la dependencia del repositorio de datos.
TRIGGERS: se ejecutan por algún evento de la BD. Se usan para hacer validaciones de datos. Se pueden definir varios
triggers del tipo FOR/AFTER para un mismo objeto y un mismo evento pero para INSTEAD OF solo se puede definir
uno para un mismo objeto y evento. Dentro del trigger se pueden usar las tablas inserted y deleted, no existe
updated.
FUNCIONES: Las funciones siempre retornan un valor como resultado. Se usan en las sentencias SELECT. Las
funciones escalares devuelve un único valor y las funciones de tabla devuelven una tabla, tabla de varias
instrucciones (se define una tabla y se carga con datos para retornarla como resultado) o tabla en línea (solo
devuelve el resultado de una consulta).
COSTOS: Se mide en accesos a bloques. El bloque es la mínima unidad de almacenamiento y lectura. Cada
vez que el SGBD accede a disco, lee o escribe N bloques.
COSTO DE ACCESO AL ALMACENAMIENTO SECUNDARIO: Es el costo de buscar, leer y escribir bloques de datos
generalmente en disco.
COSTO DE ALMACENAMIENTO: costo de almacenar cualquier dato intermedio apra poder ejecutar una consulta.
COSTO DE COMPUTO: costo de ejecutar las operaciones de una consulta.
COSTO DE USO DE MEMORIA: costo relacionado con el uso de la memoria para poder llevar a cabo la consulta.
COSTO DE COMUNICACIÓN: Costo de enviar los datos de resultado de donde se origino la consulta.
TIPO DE COSTOS:
COSTO DE ESCRITURA (CE): COSTO DE LECTURA (CL): cuando COSTO TOTAL (CT): CE + CL
Cuando escribimos bloques a leemos bloques del disco.
disco.
TABLAS EMPAQUETAS: esta empaquetada cuando ocupa la menor cantidad de bloques posibles.
Tr: cantidad de tuplas de la Br: Cantidad de bloques de la FBr: Factor de bloqueo. Indica la
relación R. relación R. cantidad de tuplas por bloque de
la relación R.
tamanioDeNtuplas tamanioDeNtuplas
tamanioDeUnbloque
ý�㕎þ�㕎ÿ�㕖ĀýþĀÿ�㕎ÿþāý�㕎 ý�㕎þ�㕎ÿ�㕖ĀýþĀÿ�㔵ýĀĂþþ
ý�㕎þ�㕎ÿ�㕖ĀýþĀÿ�㕎ÿþāý�㕎
PROCESAMIENTO DE CONULTAS:
I. se valida la sintaxis y semántica de la consulta SQL.
II. La consulta validad es convertida a AR.
III. El AR obtenido se conviente en árbol canocnico.
IV. El SGBD determina el algoritmo a utilizar en cada operador del árbol.
PLAN DE EJECUCION: es el camino mas eficiente que encontró el SGBD para ejecutar una consulta.
HEURISTICAS: Son reglas que generalmente ayudan al SGBD a optimizar las consultas y tomar el camino mas
eficiente.
1. EJECUTAR OPERACIONES DE SELECCIÓN TAN PRONTO COMO SEA POSIBLE.
2. EJECUTAR PRIMERO LAS SELECCIONES MAS RESTRICTIVAS (LAS QUE PRODUCEN LA MENOR CANTIDAD DE
TUPLAS).
3. UTILIZAR JUNTAS EN LUGAR DE PRODUCTOS CARTESIANOS.
4. EJECUTAR PROYECCIONES TAN PRONTO COMO SEA POSIBLE PERO NO DIRECTO SOBRE LAS TABLAS.
ESTADISTICAS: Información estadisiticas sobre la distribución de los valores de una o mas columnas de una tabla
dentro de la base de datos. Se usa para estimar la cardinalidad del resultado de una operación.
▪ nr: número de tuplas de la relación R. ▪ σA = V(r): numero de filas que satisfacen la condición
▪ br: número de bloques de la relación R. (nr / V (A, r)). Lo ideal seria que este valor sea 1.
▪ fr: Factor de bloqueo. Indica la cantidad de tuplas por ▪ lr: tamaño de una tupla de la relación R.
bloque de la relación R. ▪ mínimo/ máximo valor.
▪ cantidad de valores nulos.
INDICES: son estructuras generadas sobre una clave de búsqueda para una tabla o vista. Se puede crear multiples
índices sobre la misma tabla/vista y cada índice contendrá uno o varios atributos. se deberían crear en tablas que
tengan una imagen grande. Las PK siempre tienen un índice asociado. Lo campos que se ponen en el where, order by
o group by son candidatos a índices. Los valores NULL no están indexados. Cuando se actualiza la tabla se tiene que
regenerar el índice. Se pueden crear sobre una o varias columnas de una tabla. Se usan frecuentemente en los
campos de búsquedas, campos donde sus valores no se modifican demasiado, tienen una imagen muy grande.
Ventajas: Aceleran el tiempo de respuesta de las consultas.
Desvenajas: ocupan espacio físico, retardan las operación de actualización de datos porque se regera el índice,
tienen un costo de lectura adicional asociado.
Se clasifican en:
I. INDICES ORDENADOS (cluster o agrupammiento): Se utilizan en atributos que tengan una inserción en forma
ordenada. La tabla se encuentra ordenada físicamente por el inidice. Solo puede existir uno de estos por tabla.
A. Densos: cada valor de cada fila aparece dentro del índice.
B. Dispersos: Se posee una entrada solo para algunos valores de las filas. Se busca la clave de acceso mas
cercana al valor buscadoy luego se recorre a partir de ese valor hasta encontrar el deseado, dado que están
ordenados.
II. INDICES HASH (no cluster o no agrupamiento): no se encuentran ordenados sino que se basan en una funcion
hash ara poder distribuir los valores. Es un índice lógico. Se pueden tener varios por tabla.
TRANSACCIONES: unidad lógicay atómica de procesamiento que puede incluir una o mas
operaciones.
PROBLEMAS DE CONCURRENCIA:
I. LOST UPDATE: Se lee un dato que esta siendo modificado por otra transacción. Esto produce que modifique
valores viejos, porque la acutalizacion todavía no fue comiteada.
II. DIRTY READS: Se lee un dato que luego fue rollbackeado y por lo tanto es basura y no es valido.
III. NON REPEATABLE READS: lee dos veces un recursos y obtiene en cada una un valor distinto.
EQUIVALENCIA DE PLANES:
EQUIVALENTE POR RESULTADOS: producen el mismo estado al final del plan.
EQUIVALENTES POR CONFLICTOS: cuando el orden de dos operaiones cualquiera en conflicto es el mismo en ambos
planes.
LOCKEOS: Mecanismo que permite que las transacciones puedan ejecutar en forma serializable, controlando el uso
de los recursos para las transacciones que necsitan el mismo elelemnto que pueden aguantar a obtenerlo si otra
transacción lo tiene en uso. Principios: Obtener un lockeo antes de acceder al recurso. Luego de usuarlo, liberar el
recurso.
LOCK ESCALATION: Se da cuando la T1 tiene que aumentar el nivel de lockeo que tiene establecido.
TIMEOUT: es el tiempo que espera un lockeo la liberación de un recurso antes de rollbackearse por no poder
acceder a ese recurso.
GRANULARIDAD DEL LOCKEO: Es el objeto que bloqueara: database – table – page – row
DEADLOCK: Es un bloqueo infinito que se da cuando una T1 espera que T2 libere un recurso y al mismo tiempo T2
espera que T1 libere un recurso. Un deadlock se ignora (se deja que los programadores lo manejen), se previenen
(defino el orden de los lockeos para que no se produzcan deadlocks), se evitan (detectar potenciales deadlocks y
tomar una acción sobre las transacciones) o se detectan y recuperan (permitir deadlcoks, detener y recuperar las
transacciones).
PROTOCOLO DE LOCKEOS:
BLOQUEO BINARIO: limita a que los bloqueos no peuydan ser tomados en un mismo elemento por mas de una
transacción. Bloquea o desbloquea un elemento
BLOQUEO COMPARTIDO/EXCLUSIVO: Este bloquea la lectura o la escritura de un elemento y la desbloquea.
PROTOCOLO DE DOS FASES: todas las operaciones de bloqueo preceden a la primera operación de desbloqueo de la
transacción.
FASE DE EXPANSION: Se adquieren los bloqueos en los elementos pero no se liberan.
FASE DE CONTRACCION: se pueden liberar bloqueos, pero no se pueden adquirir nuevos
PROTOOLO DE DOS FASES ESTRICTO: Libera los recursos de la transacción una vez que se hizo commit.
NIVELES DE AISLAMIENTO:
DIRTY READS: la T1 lee un dato actualizado por una T2, pero ese update es rollbackeado y la transacción T1 sigue
trabajando con ese dato que ahora es basura.
REPEATABLE READ: T1 lee un valor, T2 actualiza ese valor y despues T1 lo vuelve a leer y no tiene el mismo valor que
leyó antes.
PHANTOM READ: T1 opera con un conjunto de registros a través de una clausula where, si T2 esta actualizando esa
tabla al mismo tiempo y hay valores que cumplen la condición del where, y T1 se vuelve a ejecutar, podría no darnos
el mismo resultado, estaría leyedo registros fantasmas.
LOGS: es una bitácora de todas las operaciones que se van realizando en el motor. A medida que se inicia una T que
realiza cambios, los cambios se van almacenando en le archivo log. El log garantiza la consistencia de la BD, si no hay
log no puedo reestablecer la BD.
CIRCULARES: Active logs va pisando el log a medida que se van haciendo checkpoints. Tengo un solo archivo de logs
que se va pisando.
SECUENCIALES: asgino un tamaño para los logs, a medida que se van llenando se van creando nuevos logs. Puedo
recuperar toda la BD si uso esto pero consumo espacio.
CHECKPOINT: es un evento por el cula los bloques modificados que están en memoria son llevados al disco. Se peude
modificar el tiempo cada cuando se hace.
PROCESO DE COMMIT:
1. Genera una entrada en el log de commit
2. Actualiza todas las paginas que hayan sido utilizadas en la T al log en disco.
3. retorna el commit.
4. fin de la T en el log.
PROCESO DE ROLLBACK.
1. Gener auna entrada en el log de abort.
2. Obtiene el ultimo lastLSN que haya generado la T.
3. Recorre cada pagina afectada tomando el previo LSN de cada una de las entradas.
4. Genera un CLR. Por cada una de las ioperaciones de actualización.
5. Deshacer la operación, utilizando la imagen anterior.
6. Fin de la T en el log.
SEGURIDAD:
AMENAZAS A LAS BASES DE DATOS:
PERDIDA DE INTEGRIDAD: se elimina o modifica información involuntariamente. Se evita registringiendo permisos y
teniendo varias instancias/entonnos de base de datos. Para recuperar la inforamcion se puede usar un backup. Se
puede hacer <en caliente=.
PERDIDA DE DISPONIBILIDAD: la BD deja de funcionar por una falla del disco rigido. Se puede evitar teniendo un
sistema RAID: RAID 1 (se usan dos discos espejados, si se rompe uno se usa el otro hasta arreglar el primero) y
RAID 5 (los datos se distribuyen en varios discos con suficiente redundancia como para reemplazar un solo disco).
Tambien se evita usando un sistema de almacenamiento independiente. Servidores especialmente disenados para
almacenar información y si se va la luz el servidor se puede mantener con un UPS y un generados.
PERDIDA DE CONFIDENCIALIDAD: Alguien no autorizado accede a información confidencial. Se pueden usar los
mecanismo de seguridad:
DAC: otorga y revoca privilegios a los distintos usuarios con GRANT y REVOKE.
RBAC: usa un sistema de roles. Los permisos se asignan a los roles y a los usuarios se les asigna esos roles.
MAC: consiste en clasificar los objetos de la BD en topSecret – Secrete – Classified – Unclassified. A los usuarios se les
asigna un nivel de seguridad y pueden acceder a ese nivel de seguridad o menor.
SQL INJECTION: Es una técnica que aporvecha las vulnerabliaddes de una aplicación que tiene sentencias SQL
embebidas en su código fuente. Se inyecta fragmentos de código SQL donde se deberían ingresar valores de
parámetros. Se evita validando los datos ingresados por el usuario y no permitir símbolos especiales, evitar armar
consultas SQL en el código fuente y usar SP, usar binding de variables para los parámetros.
EJEMPLO:
CREATE PROCEDURE pNombreProc (@nombreParam1 tipoDato, @nombreParam2 tipoDato)
AS
sentenciasSQL
VARIABLES:
DECLARE @nombreVar AS tipoDato
DECLARE @id in, @vnombre varchar(100)
WHILE <CONDICION>
sentenciasSQL
IF <condicion>
sentenciasSQL
ELSE
sentenciasSQL
FUNCTION:
es aquello que en realidad puede devolver algo en su nombre. conjunto de sentencias SQL, igual que SP pero la
función devuelve algo en su nombre y ese valor puede ser interpretado por quien lo llamo. SIEMPRE RETORNAN
ALGO EN SU NOMBRE. No son performantes. si se puede hay que evitarlo. Dif con SP, las funciones siempre retornan
algo, SP no.
CREATE FUNCTION nombreFuncion (@param1 tipo, @param2 tipo, &)
RETURNS return_tipoDeDatps // pongo el tipo de dato de lo que retorna.
AS
BEGIN
setenciasSQL.
return valor // tiene que ser del mimo tpo de dato que se puso en el returns.
END
Funciones escalares:
devuelven tipos de datos esacalares(texto, int, etc.) devuelve un unico valor, simple
Table functions:
devuelve un tipo de dato table. RETURNS table|@vartable
Con vartable yo creo una tabla y en <definicion> pongo como quiero que sea la tabla (nombre y tipo de dato), es una
tabla en memoria, es una variable. table es una tabla que está definida.
CREATE FUNCTIONS nombreF ()
RETURNS table
AS
return (select idCliente from Cliente)
table functions:
SELECT *
FROM f_clientes() // se pone aca porque devuelve una tabla, la tabla se muestra con el select.
scalar function: no pueden ir en el from porque edvuelven valores específicos.
INSERT INTO clientes values (f_proximocliente(),9Juan9) // si la función devuelve un numero, pone ese numero la
tabla.
-- DROP FUNCTION nombreFunction
-- ALTER FUNCTION nombreFunction (params). Se cambia todo, se hace como un reemplazo, igual que SP.
RETURNS table|vartable
AS
BEGIN
RETURN
END
TRIGGER:
conjunto de sentencias que se disparan cuando ocurre un evento. Los eventos pueden ser insert, delete o update.
pueden tener 1 o n sentencias SQL, se puede usar técnicas de programación, se peude usar el mismo trigger para
distintos eventos, se utiliza para una sola vista o tabla, puede utilizar tablas temporales deleted, inserted para
verificar lo que está tratando de cambiarse en el trigger. no se invoca específicamente para usarlo, se activa y se
desactiva. For|after lo hace DESPUÉS de que se haga la acción. INSTEAD OF en lugar de hacer la acción ejecutada
hace el trigger. inserted y deleted son tablas temporales que solo existen dentro del trigger. son mas para auditoria y
no son tan recomendables.
CREATE TRIGGER nombreTrigger ON table|view
FOR|AFTER|INSTEAD OF
INSERT,UPDATE,DELETE
AS
sentenciasSQL
R(ABCDE)
F = {A³BCD, AB³DE, BE³AC}
1) Descompongo la parte derecha de cada dependencia. Todas las Df tienen que tener un solo atributo en la parte
derecha.
F1 = {A³B, A³C, A³D, AB³D, AB³E, BE³A, BE³C}
2) Eliminar redundancia en la parte izquierda. Tomo solo las Df con dos o más atributos del lado izquierdo y me fijo si
con cada atributo POR SEPARADO puedo llegar a la misma letra. Con AB llego a D, lo que tengo que averiguar es si
puedo llegar a D solo con A o solo con B.
AB ³ D ➔ ➔ A+ = ABCD ÿ Solo con A, ya llego a D, entonces B es redundante y lo saco de la Df.
AB ³ D ➔ ➔ B+ = B ÿ Solo puedo llegar a B, como no llego a D.
Si con B también hubiera llegado a D, entonces A seria redundante. Si se llega a D con los dos, elijo solo uno. Sin
embargo, con resolver uno solo y ver que la otra letra es redundante es suficiente.
F2 = {A³B, A³C, A³D, A³D, A³E, BE³A, BE³C}
En este último conjunto me quedaron dos Df iguales, saco una. Igualmente, si no lo hago, en el siguiente paso
cuando elimine Df redundantes, estas se van a eliminar, quedando solo una de esas.
F2 = {A³B, A³C, A³D, A³E, BE³A, BE³C}
3) Elimino las dependencias redundantes. Tomo una Df y veo si con el determinante puedo llegar al mismo
determinado, pero sin usar la Df que estoy analizando.
A ³ B, calculo la clausura de A (A+) en F2, pero sin usar la Df <A ³ B=, si en esa clausura llego a B, entonces la Df es
redundante. Si no llego, no es redundante. A ³ B, A+F2 – {A ³ B} = ACDE. No llegue a B, no es redundante.
A ³ C, A+F2 – {A ³ C} = ABCDE. Llegue a C, es redundante.
Como A ³ C es redundante, para las siguientes comprobaciones además de no usar la que no tengo que usar en ese
momento tampoco tengo que usar esta Df. A ³ D, A+F2 – {A ³ C, A ³ D} = ABEC. No llegue a D, no es
redundante.
Finalmente, el ultimo conjunto que queda es Fmin:
Fmin = {A³B, A³D, A³E, BE³A, BE³C}
Sirve para transformar a 3FN una relación que está en una forma normal menor a 3FN. La
relación resultante que queda en 3FN sería la unión de cada relación que queda luego de hacer el algoritmo
Sirve para transformar a FNBC una relación que está en una forma normal menor a
FNBC. La relación resultante que queda en FNBC sería la unión de cada relación que queda luego de hacer el
algoritmo.
R (M, N, O, P, Q, S)
F ={ M ³ON, N ³MO, O ³MN, MQ ³SO, OP ³Q} CC = {PM, PN, PO}
1) No es obligatorio calcular Fmin, pero es recomendable para no tener redundancia y tener el menor F posible.
Fmin = {M ³N, N ³O, O ³ M, MQ³S, OP ³Q}
2) Calculo la forma normal de cada Df y solo hago el algoritmo para aquellas que no sea FNBC. Si la Df es FNBC, sigo
con la siguiente. La primera Df que no es FNBC es M ³ N. A partir de acá, divido el esquema en dos. Descompongo
al lado izquierdo esta Df que no es FNBC como una relación nueva. Del lado derecho Hago una nueva relación con las
mismas Df que la original, pero sin incluir EL ATRIBUTO DETERMINADO de la Df que mandamos al lado izquierdo. Si
mandamos M ³ N al lado izquierdo, entonces del lado derecho nos va a quedar una relación sin el atributo N y sin
las Df que incluyen la N. Estas Df se pierden, se pueden <conseguir= más Df infiriéndolas con las Df que tengo antes
de sacar la N. Para la siguiente relación tendría que aplicar el algoritmo en para todas las Df menos en la última que
ya se encuentra en FNBC.
Fmin = {M ³N, N ³O, O ³ M, MQ³S, OP ³Q} ➔ Esta en 2FN.
3FN 3FN 3FM 2FN FNBC
R1(M,N) R2(M,O,P,Q,S)
F1 = {M³N} F2 = {O³M, MQ³S, OP³Q}
CC1 = {M} CC2 = {PO}
Si del lado derecho quedan Df que no sean FNBC, repito el proceso. Ver que en R2 quedaron las mismas letras
menos la N que fue la que se tuvo que sacar. Lo mismo con la Df N ³ O que se perdió porque como la N se sacó, se
pierde esa Df también. Al igual que en 3FN, si hay más de una Df con las mismas letras con las que se está operando,
mando todas del lado derecho a una misma relación, pero si esa relación no queda en FNBC, tengo que hacer el
mismo algoritmo para esa relación hasta que queden todas las relaciones en FNBC y despues sigo con la relación del
lado izquierdo haciendo el mismo algoritmo.
Con este método verifico si en la relación hay perdida de información o no. El proceso
termina cuando toda una fila de la tabla queda completada con a (no hubo perdida de información) o cuando se
hace el algoritmo y para cada una de las Df de la relación, no hubo ningún cambio en la tabla (hubo perdida de
información)
R(A,B,C,D,E)
F={C³E, E³D,AD³B, B³E }
R1(A,B,C) R2 (C,D) R3 (A,D,E)
1) Armar una tabla las columnas son los atributos de R y las filas son las relaciones R1, R2, & ,Rn. (Es mas cómodo
armarlo en un Excel).
A B C D E
R1
R2
R3
2) Para cada letra que esta en una relación, le pongo la letra 8a9 y el numero es el numero de la columna en la que
esta. Para la primera fila en la R1 solo esta A, B y C, entonces pongo solo esas letras. Como 8a9 esta en la columna 1
pongo 8a19, lo mismo para las demás. Las celdas que no tengan 8a9 se completan con 8b9, y el número que acompaña
esa b es el numero de fila y columna. En la primera fila queda b14, por estar en la fila 1 y columna 4.
A B C D E
R1 a1 a2 a3 b14 b15
R2 b11 b12 a3 a4 B25
R3 a1 b32 b33 a4 a5
3) Para cada Df de la relación R, voy recorriendo la tabla viendo si se cumple. La primera Df es C ³ E, voy a la
columna C y a la columna E y veo que es (1) a3 ³ b15,
(2) a3 ³ b25,
(3) b33 ³ a5
Solo me fijo en las filas que tienen A, (la (1) y (2)). Acá tengo que decir si a3 implica b15 (fila 1) entonces a3 (fila 2)
también debería implicar b15. Entonces tacho el b25 de la fila 2 y pongo b15. Porque un mismo valor de X tiene que
determinar un mismo valor de Y (definición de dependencia funcional). Se podría hacer al revés también, si a3
determina b25, entonces a3 debería determinar b25, tacharía b15 y pondría b25. Es lo mismo.
4) Repito 3) con todas las Df. Si antes de terminar las Df llego a una fila completa con 8a9, termino el algoritmo y
concluyo que no hubo perdida de información. Si al recorrer desde la primera Df hasta la ultima no hago NINGÚN
cambio, entonces termino el algoritmo y concluyo que SI HUBO perdida de información.
C³E AD³B
A B C D E (1) a1 a4 ³ a2
R1 a1 a2 a3 b14 b15 (2) b11 a4 ³ b12
R2 b11 b12 a3 a4 b15 (3) a1 a4 ³ b32
R3 a1 b32 b33 a4 a5 A B C D E
R1 a1 a2 a3 a4 b15
E³D: Un mismo determinante implica un mismo R2 b11 b12 a3 a4 b15
determinado. Siempre predomina la a, pero aca, los R3 a1 a2 b33 a4 a5
mismos determinantes son b no a. Acá no podría ser
al revés de escribir en lugar de b15 ³ a4 hacer B³E
b15 ³ 14, porque siempre predomina la a. (1) a2 ³ b15 ➔ a2 ³ a5
(1) b15 ³ a4 (2) b12 ³ b15
(2) b15 ³ b14 ➔ b15 ³ a4 (3) a2 ³ a5
(3) a5 ³ a4 A B C D E
A B C D E R1 a1 a2 a3 a4 a5
R1 a1 a2 a3 a4 b15 R2 b11 b12 a3 a4 b15
R2 b11 b12 a3 a4 b15 r3 a1 a2 b33 a4 a5
R3 a1 b32 b33 a4 a5
Como la primera fila quedo toda con a, entonces termino de verificar y digo que NO HUBO perdida de información.
Con el árbol optimizado obtengo la forma mas eficiente de hacer una consulta. A
diferencia del canónico que no esta optimizado ni tampoco es eficiente.
1) Acomodar las tablas de menor a mayor según la cantidad de bloques que ocupa cada tabla. Para obtener la
cantidad de bloques (si es que no me los dan como dato):
Si tengo que 1 registro = tamReg, que esa tabla tiene cantReg registros y que el tamaño del bloque = tamBloque.
Entonces: (A) 1 reg ----------- tamReg
cantReg reg ----------- X = (cantReg * tamReg) / 1 reg ³ X: tamCantRegs
Ejemplo:
Tabla (campo1 (5), campo2 (5), campo3 (4), campo5 (6)) // 10 tuplas/registros
TamBloque = 10B
Luego (B): si 1 bloque ocupa 10, cuantos bloques son 200 bytes.
Y = (200 * 1) / 10 ³ Y = 20B.
Entonces los 20 registros de 10 Bytes cada uno, ocupan un total de 200 Bytes lo que serian 20 bloques de 10 bytes.
Con esta información de la cantidad de bloques, puedo ubicar en que posición va la tabla en el árbol.
2) Siempre se busca ubicar las tablas de menor a mayor, pero si la tabla mas chica solo se junta con la tabla mas
grande, entonces pongo esas dos tablas primero. Sin embargo, la tercera tabla que se vaya a usar tiene que ser la
mas chica que se combine con el resultado de las primeras dos. Siempre voy buscando la tabla más pequeña posible
para combinar con la tabla que tengo.
3) Como regla, se tienen que aplicar selecciones y proyecciones lo mas pronto posible pero las proyecciones no
directamente sobre la tabla, sino que previamente tengo que hacer algún select o alguna junta para aplicar la
proyección sobre ese resultado y no sobre la tabla.
4) A medida que vaya haciendo las juntas voy proyectando solo las columnas que necesito para mostrar el resultado
final y las que necesito para hacer las juntas con la tabla siguiente.