1er Algoritmos y Estructuras de Datos II - DC - UBA cuatrimestre de 2016 Trabajo práctico 2: Especicación Base De Datos Normativa Límite de entrega: Miércoles 25 de mayo con asunto "Grupo N" siendo N hasta las 22:00 hs. Enviar PDF a [email protected] el número de grupo asignado. Normas de entrega: Ver Información sobre la cursada en el sitio Web de la materia. (http://www.dc.uba.ar/materias/aed2/2016/1c/cursada) Versión: 1.1 del 11 de mayo de 2016 (ver TP2_Changelog.txt) Especicación 1. TAD TAD Tipo Dato es Bool TAD Dato géneros dato usa string, nat, tipo exporta generadores, observadores básicos y otras operaciones igualdad observacional ≡ tipo?(d2 ) ∧L d2 ⇐⇒ ((Nat?(d1 ) ⇒L valorNat(d1 ) =obs valorNat(d2 )) ∧ (String?(d1 ) ⇒L valorStr(d1 ) =obs valorStr(d2 ))) tipo?(d1 ) (∀d1 , d2 : dato) d1 =obs generadores datoString : string datoNat : nat −→ −→ observadores básicos tipo? : dato valorNat : dato valorStr : dato −→ −→ −→ d d dato dato tipo nat {Nat?(d)} string {String?(d)} otras operaciones mismoTipo? : dato String? × dato : dato Nat? : dato min : conj(dato) max : conj(dato) •≤• : dato d1 × cd cd dato d2 −→ −→ −→ −→ −→ −→ bool bool bool {¬∅?(cd)} dato dato {¬∅?(cd)} bool {mismoTipo?(d1 ,d2 )} axiomas (∀s: string, ∀n: ∀d, d1 , d2 : dato, paratodoconj(dato)cd) tipo?(datoNat(n)) ≡ true tipo?(datoString(s)) ≡ false valorNat(datoNat(n)) ≡ n valorStr(datoString(s)) ≡ s mismoTipo?(d1 , d2 ) ≡ (Nat?(d1 ) ≡ Nat?(d2 )) Nat?(d) ≡ tipo?(d) String?(d) ≡ ¬Nat?(d) nat, 1/6 1er Algoritmos y Estructuras de Datos II - DC - UBA if ≡ min(cd) = #(cd) ∨L 1 if ≡ max(cd) #(cd) = 1 dameUno(cd) if ≤(d1 ,d2 ) ≡ String?(d1 ) dameUno(cd) min(sinUno(cd)) ∨L dameUno(cd) then valorStr(d1 ) ≤ ≤ ≤ then min(sinUno(cd)) then max(sinUno(cd)) valorStr(d2 ) else cuatrimestre de 2016 else dameUno(cd) else max(sinUno(cd)) valorNat(d1 ) ≤ valorNat(d2 ) Fin TAD 2. TAD TAD Registro Campo es String TAD Registro TAD Registro extiende a Diccionario(Campo, Dato) géneros registro usa string, dato, campo, dicc exporta otras operaciones otras operaciones campos : registro borrar? : registro criterio × registro r r1 × registro r2 conj(campo) cc × registro r1 × registro r1 × conj(campo) cc × agregarCampos : registro copiarCampos : coincideAlguno : registro registro r2 r2 −→ −→ −→ −→ −→ conj(campo) {#campos(criterio) bool : registro enTodos : campo combinarTodos : campo r1 × conj(campo) cc × registro r2 −→ bool −→ −→ bool cr conj(registro) registro r1 × conj(registro) cr ∈ campos(r2 )} campos(r1 ) ∩ campos(r2 )} campos(r1 ) ∩ campos(r2 )} bool {cc ⊆ c× c× 1} {cc registro {cc ⊆ coincidenTodos ≡ registro conj(registro) {c ∈ campos(r1 ) ∧ enTodos(c,cr )} axiomas (∀c: campo, ∀v, d1 , d2 : ∀r, r1 , r2 , crit: registro, ∀cc: conj(campo), ∀cr: conj(registro)) ≡ claves(r) borrar?(crit, r ) ≡ coincidenTodos(crit,campos(crit), r) agregarCampos(r1 , r2 ) ≡ copiarCampos(campos(r2 ) − campos(r1 ), r1 , r2 ) copiarCampos(cc, r1 , r2 ) ≡ if ∅?(cc) then r1 else copiarCampos(sinUno(cc), denir(dameUno(cc), obtener(dameUno(cc), r2 ), r1 ), r2 ) coincideAlguno(r1 , cc, r2 ) ≡ ¬ ∅?(cc) ∧L (obtener(dameUno(cc), r1 ) = obtener(dameUno(cc), r2 )) ∨ coincideAlguno(r1 , sinUno(cc), r2 ) ) coincidenTodos(r1 , cc, r2 ) ≡ ∅?(cc) ∨L (obtener(dameUno(cc), r1 ) = obtener(dameUno(cc), r2 ) ∧ coincidenTodos(r1 , sinUno(cc), r2 )) enTodos(c,cr) ≡ ∅?(cr) ∨L (c ∈ campos(dameUno(cr)) ∧ enTodos(c,sinUno(cr))) combinarTodos(c, r , cr ) ≡ if ∅?(cr) then ∅ dato, campos(r) else combinarTodos(c, Fin TAD obtener(c, r) r, then 2/6 sinUno(cr )) ∪ ( if obtener(c, dameUno(cr )) = {agregarCampos(r , dameUno(cr ))} else ∅ ) 1er Algoritmos y Estructuras de Datos II - DC - UBA 3. TAD cuatrimestre de 2016 Tabla TAD Tabla géneros tabla usa campo, clave, registro, conj, string exporta Generadores, observadores, otras operaciones igualdad observacional = nombre(t2 ) ∧ campos(t1 ) =obs campos(t2 ) ∧L (∀c: campo) ( c ∈ campos(t1 ) ⇒L tipoCampo(c, t1 ) =obs tipoCampo(c,t2 ) ) ∧ claves(t1 ) t2 ⇐⇒ =obs claves(t2 ) ∧ registros(t1 ) =obs registros(t2 ) ∧ indices(t1 ) =obs indices(t2 ) ∧ cantidadDeAccesos(t1 ) = cantidadDeAccesos(t2 ) nombre(t1 ) (∀t1 , t2 : tabla) t1 =obs observadores básicos nombre : tabla claves : tabla indices : tabla campos : tabla tipoCampo : campo registros : tabla c× tabla cantidadDeAccesos : tabla −→ −→ −→ −→ t −→ −→ −→ string conj(campo) conj(campo) conj(campo) {c tipo ∈ campos(t)} conj(registro) nat generadores nuevaTabla : string nombre × agregarRegistro : registro r× conj(campo) tabla −→ t claves × columnas −→ {claves 6= ∅ ∧ claves ⊆ registro tabla {campos(r) =obs borrarRegistro : registro indexar : campo crit × c× tabla tabla t tabla campos(columnas)} t −→ tabla {#campos(crit) = −→ tabla 1 campos(t) ∧ puedoInsertar?(r , ∧L dameUno(campos(crit)) ∈ t)} claves(t)} {puedeIndexar(c,t)} otras operaciones × tabla t registro × tabla campo c × tabla t campo c × tabla t campo c × tabla t puedoInsertar? : registro r compatible : minimo : maximo : puedeIndexar : : registro coincidencias : dameColumna : mismosTipos : bool bool dato {¬∅?(registros(t)) dato {¬∅?(registros(t)) ∧c∈ ∧c∈ indices(t) } indices(t) } bool × conj(campo) × conj(registro) −→ bool registro × conj(registro) −→ conj(registro) campo c × conj(registro) cr1 × conj(registro) cr2) −→ conj(registro) campo c × conj(registro) cr −→ conj(dato) registro r × tabla t −→ bool {campos(r) ⊆ campos(t)} hayCoincidencia combinarRegistros : −→ −→ −→ −→ −→ axiomas (∀cc, cp: conj(campo),∀t: tabla, ∀r: nombre(nuevaTabla(n, cc, r)) t)) nombre(borrarRegistro(crit, t)) nombre(indexar(c, t)) nombre(agregarRegistro(r , claves(nuevaTabla(n, cc, r)) t)) claves(borrarRegistro(crit, t)) claves(agregarRegistro(r , ∀cr: conj(registro) ∀n: ≡ n ≡ nombre(t) ≡ nombre(t) ≡ nombre(t) registro, ≡ cc ≡ claves(t) ≡ claves(t) 3/6 string) 1er Algoritmos y Estructuras de Datos II - DC - UBA claves(indexar(c, ≡ t)) claves(t) cc, r)) t)) indices(borrarRegistro(crit, t)) indices(indexar(c, t)) ≡ ∅ ≡ indices(t) ≡ indices(t) ≡ Ag(c,indices(t)) campos(nuevaTabla(n, cc, r)) campos(agregarRegistro(r , t)) campos(borrarRegistro(crit, t)) campos(indexar(c, t)) ≡ ≡ ≡ ≡ campos(r ) tipoCampo(c, nuevaTabla(n, cc, r)) tipoCampo(c, agregarRegistro(r , t)) tipoCampo(c, borrarRegistro(crit, t)) tipoCampo(c, indexar(c, t)) ≡ ≡ ≡ ≡ tipo?(obtener(c,r )) registros(nuevaTabla(n, ≡ ∅ ≡ Ag(r, registros(t)) ≡ registros(t) − coincidencias(crit, ≡ registros(t) indices(nuevaTabla(n, indices(agregarRegistro(r , cc, r)) registros(agregarRegistro(r , t)) registros(borrarRegistro(crit, t)) registros(indexar(c, t)) campos(t) campos(t) campos(t) tipoCampo(c,t) tipoCampo(c,t) tipoCampo(c,t) cantidadDeAccesos(nuevaTabla(n, cc, r)) cantidadDeAccesos(agregarRegistro(r , t) cantidadDeAccesos(borrarRegistro(crit, t) cantidadDeAccesos(indexar(c, t)) puedoInsertar?(r , t) compatible(r, t) puedeIndexar(c,t) combinarRegistros(c, cr1 , cr2 ) hayCoincidencia(r, cc, coincidencias(crit, cr) cr) cuatrimestre de 2016 ≡ ≡ ≡ ≡ registros(t)) 0 1 + cantidadDeAccesos(t) #coincidencias(crit, registros(t))+cantidadDeAccesos(t) cantidadDeAccesos(t) ≡ compatible(r,t) ∧ ¬ hayCoincidencia(r, claves(t), registros(t)) ≡ campos(r) = campos(t) ∧L mismosTipos(r,t) ≡ c ∈ campos(t) ∧L c 6∈ indices(t) ∧ (#indices(t) ≤1 ∧ (#indices(t)=1 ⇒L ¬ tipoCampo(c, t) ≡ tipoCampo(dameUno(indices(t)), t))) ≡ if ∅?(cr1 ) then ∅ else combinarTodos(c, dameUno(cr1 ), cr2 ) ∪ combinarRegistros(c, sinUno(cr1 ), t2 ) ≡ ¬∅?(cr) ∧L ( coincideAlguno(r, cc, dameUno(cr)) ∨ hayCoincidencia?(r, cc, sinUno(cr )) ) ≡ if ∅?(cr) then ∅ else if coincidenTodos(crit, campos(crit), dameUno(cr )) then Ag(dameUno(cr ), coincidencias(crit, sinUno(cr ))) else minimo(c,t) maximo(c,t) dameColumna(c,cr ) ≡ ≡ ≡ coincidencias(crit, sinUno(cr )) min(dameColumna(c,registros(t))) max(dameColumna(c,registros(t))) if ∅?(cr) then ∅ else {obtener(c,dameUno(cr ))} mismosTipos(r , t) ≡ ∅?(r) ∧ ∨L (if else c ∈ campos(dameUno(cr)) then ∅ ) ∪ dameColumna(c,sinUno(cr)) (mismosTipos(borrar(dameUno(campos(r )),r ),t) tipo?(obtener(dameUno(campos(r1 )),r1 ) tipoCampo(dameUno(campos(r1 )),t))) Fin TAD 4/6 ≡ 1er Algoritmos y Estructuras de Datos II - DC - UBA 4. TAD cuatrimestre de 2016 BaseDeDatos TAD BaseDeDatos géneros base usa Nat, String, Tabla, Registro, Campo, Dato exporta generadores, observadores básicos y otras operaciones igualdad observacional =obs tablas(b2 ) ∧L (∀t: string) t ∈ tablas(b1 ) ⇒L dameTabla(t,b1 ) =obs dameTabla(t, b2 ⇐⇒ b2 ) ∧ (∀t1 , t2 , c: string) {t1 , t2 } ⊆ tablas(b1 ) ⇒L hayJoin?(t1 , t2 , c, b1 ) =obs hayJoin?(t1 , t2 , c, b2 ) tablas(b1 ) (∀b1 , b2 : base) b1 =obs observadores básicos tablas db t × base db string t1 × string t2 × string t1 × string t2 × : base dameTabla : string hayJoin? : campoJoin : base base −→ −→ db −→ db −→ conj(string) {t tabla ∈ tablas(db)} bool {hayJoin?(t1 , campo t2 , db)} generadores nuevaDB −→ base −→ base {∅?(registros(ta))} −→ base {t ∈ tablas(db) ∧L puedoInsertar?(reg , t)} −→ base {#campos(cr)=1 ∧ t ∈ tablas(db)} db −→ base : ta × base db reg × string t × agregarTabla : tabla insertarEntrada : registro borrar : registro cr × string t× base base db db t1 × string t2 × campo c × base t1 6= t2 ∧ {t1 , t2 } ⊆ tablas(db) ∧L c ∈ claves(dameTabla(t1 , db)) ∧ c ∈ claves(dameTabla(t2 , db)) ∧ ¬hayJoin?(t1 , t2 , db) : string t1 × string t2 × base db −→ base {hayJoin?(t1 , t2 , db)} generarVistaJoin : string borrarJoin otras operaciones t × base db t1 × string t2 × base db string t × base db base db string t × conj(string) ct × base db registro criterio × string t × base db registros : string vistaJoin : string cantidadDeAccesos : tablaMaxima : encontrarMaximo : buscar : −→ −→ −→ −→ −→ −→ ∈ conj(registro) {t conj(registro) {hayJoin?(t1 , nat string string conj(registro) tablas(db)} t2 , db)} {t ∈ tablas(db)} {tablas(db)6= ∅} {{t} ∪ ct ⊆ tablas(db)} {t ∈ tablas(db)} axiomas (∀cp: conj(campo),∀t, t1 , t2 , t3 , t4 : string, tablas(nuevaDB) tablas(agregarTabla(tbl, db)) t, db)) tablas(insertarEntrada(reg, tablas(borrar(cr , t, db)) tablas(generarVistaJoin(t1 , tablas(borrarJoin(t1 , t2 , c, db)) t2 , db)) dameTabla(t, agregarTabla(tbl, dameTabla(t, borrarJoin(t1 , t2 , t2 , db)) t2 , db)) dameTabla(t, generarVistaJoin(t1 , hayJoin?(t1 , ≡ db)) dameTabla(t1 , insertarEntrada(reg, dameTabla(t1 , borrar(cr , ∀tbl: tabla, ∀reg : registro, ∀nom: ≡ ∅ ≡ Ag(nombre(tbl), tablas(db)) ≡ tablas(db) ≡ tablas(db) ≡ tablas(db) ≡ tablas(db) nuevaDB) t2 , c, db)) t2 , db)) if if nombre(tbl) ≡t string,∀cr1 , cr2 : conj(registro)) then tbl else dameTabla(t,db) t1 = t2 then agregarRegistro(reg, db)) else dameTabla(t1 , db) ≡ if t1 = t2 then borrarRegistro(cr, db)) else dameTabla(t1 , db) ≡ dameTabla(t, db) ≡ dameTabla(t, db) ≡ ≡ 5/6 false dameTabla(t1 , dameTabla(t1 , 1er Algoritmos y Estructuras de Datos II - DC - UBA hayJoin?(t1 , hayJoin?(t1 , hayJoin?(t1 , hayJoin?(t1 , hayJoin?(t1 , t2 , t2 , t2 , t2 , t2 , campoJoin(t1 , campoJoin(t1 , campoJoin(t1 , campoJoin(t1 , agregarTabla(tbl, db)) insertarEntrada(reg, t3, db)) borrar(cr , c, db)) generarVistaJoin(t3 , t4 , c2 , db)) borrarJoin(t3 , t4 , c2 , db)) t2 , t2 , t2 , t2 , cuatrimestre de 2016 ≡ hayJoin?(t1 , t2 , db) ≡ hayJoin?(t1 , t2 , db) ≡ hayJoin?(t1 , t2 , db) ≡ (t1 = t3 ∧ t2 = t4 )∨ hayJoin?(t1 , t2 , db) ≡ ¬(t1 = t3 ∧ t2 = t4 ) ∧ hayJoin?(t1 , t2 , db) agregarTabla(tbl, db)) insertarEntrada(reg, t, db)) borrar(cr , t, db)) generarVistaJoin(t3 , t4 , c, db)) ≡ ≡ ≡ ≡ campoJoin(t1 , t2 , db) campoJoin(t1 , t2 , db) campoJoin(t1 , t2 , db) if t1 = t3 ∧ t2 = t4 then c else campoJoin(t1 , registros(t, t2 , borrarJoin(t3 , db) cantidadDeAccesos(t, db) tablaMaxima(db) ≡ t4 , db)) campoJoin(t1 , ct, db) t2 , db) t2 , db) ≡ ≡ registros(dameTabla(t, ≡ dameTabla(encontrarMaximo(dameUno(tablas(db)), ≡ db)) cantidadDeAccesos(dameTabla(t, sinUno(tablas(db)), encontrarMaximo(t, campoJoin(t1 , if ∅?(ct) t then db)) db), db) else if cantidadDeAccesos(t, db) ≥ cantidadDeAccesos(dameUno(ct),db) then encontrarMaximo(t, sinUno(ct), else vistaJoin(t1 , t2 , db) ≡ buscar(r ,t,db) ≡ encontrarMaximo(dameUno(ct), sinUno(ct), combinarRegistros( campoJoin(t1 , db)), db) registros( dameTabla(t2 , db) t2 , db), ) ) coincidencias(r ,registros(dameTabla(t,db))) Fin TAD 6/6 db) registros(dameTabla(t1 ,