/* SEGUNDA FORMA NORMAL * * TODO Atributo no primo de la relacion debe depender de la ClavePrimaria * ** Ningun Atributo debe depender parcialmente de la ClavePrimaria */ private void segundaFormaNormal() { //Normalizamos Cada Tabla de la 1FN foreach (Tabla tabla in PRIMERAFN) { Atributo PK = tabla.getClavePrimaria(); Tabla tablaIn = new Tabla(); tablaIn.setClavePrimaria(PK); //Para cada columna de la tabla revisamos si cumple la 2FN foreach (Atributo attr in tabla.getColumnas()) { if (!cumple2FN(attr, PK)) { if (!estaEnTabla2FN(attr)) { Atributo subPK = calculaSubPK(attr, PK); if (subPK != null) { Tabla t; Tabla nuevaTabla = ( (t = tabla2FNConPK(subPK)) == null ? new Tabla():t); nuevaTabla.setClavePrimaria(subPK); nuevaTabla.addColumna(attr); foreach (Atributo athijo in attr.getDependientes()) { if (athijo.esConjunto()) continue; nuevaTabla.addColumna(athijo); } if(!SEGUNDAFN.Contains(nuevaTabla)) SEGUNDAFN.Add(nuevaTabla); } } } else { tablaIn.addColumna(attr); } }//For:columnas SEGUNDAFN.Add(tablaIn); }//For:tablas normal.Text += "\nTablas Segunda Forma Normal \n"; String ntabla = ""; foreach (Tabla x in SEGUNDAFN) { ntabla = "| " + x.getClavePrimaria().getValor() + "(PK)|"; foreach (Atributo C in x.getColumnas()) { ntabla += " "+ C.getValor() + " |"; } normal.Text += ntabla + "\n"; } }
/* TERCERA FORMA NORMAL * No debe de existir ninguna dependencias transitiva */ private void terceraFormaNormal() { //Normalizamos Cada Tabla de la 2FN foreach (Tabla tabla in SEGUNDAFN) { Atributo PK = tabla.getClavePrimaria(); Tabla tablaIn = new Tabla(); tablaIn.setClavePrimaria(PK); //Para cada columna de la tabla revisamos si cumple la 3FN foreach (Atributo attr in tabla.getColumnas()) { if (!cumple3FN(attr, tabla)) { if (!estaEnTabla3FN(attr)) { Atributo FK = calcularFK(attr, tabla); if (FK != null) { Tabla t; Tabla nuevaTabla = ((t = tabla3FNConPK(FK)) == null ? new Tabla() : t); nuevaTabla.setClavePrimaria(FK); List<Atributo> cols = nuevaTabla.getColumnas(); foreach (Atributo athijo in FK.getDependientes()) { if (athijo.esConjunto() || cols.Contains(athijo)) continue; if (!estaEnTabla3FN(athijo) && tabla.getColumnas().Contains(athijo)) nuevaTabla.addColumna(athijo); } if (!TERCERAFN.Contains(nuevaTabla)) TERCERAFN.Add(nuevaTabla); if(!tablaIn.contains(FK)) tablaIn.addColumna(FK); } } } else { if (!tablaIn.contains(attr) && !estaEnTabla3FN(attr)) tablaIn.addColumna(attr); } }//For:columnas TERCERAFN.Add(tablaIn); }//For:tablas normal.Text += "\nTablas Tercera Forma Normal \n"; String ntabla = ""; foreach (Tabla x in TERCERAFN) { ntabla = "| " + x.getClavePrimaria().getValor() + "(PK)|"; foreach (Atributo C in x.getColumnas()) { ntabla += " " + C.getValor() + " |"; } normal.Text += ntabla + "\n"; } }
private void primeraFormaNormal() { Atributo atributo; //Tabla Principal es la tabla que tiene la llave primaria y los atributos que no son multivaluados. Tabla TablaPrincipal = new Tabla(); TablaPrincipal.setClavePrimaria(clavePrimaria); // Por cada atributo de el Diccionario , si es multivaluado crear una tabla nueva con el atributo y la llave primaria. foreach (var key in mapaAtributos.Keys) { atributo = mapaAtributos[key]; if (atributo.esConjunto()) continue; if (atributo.esMultivaluado()) { Tabla T = new Tabla(); T.addColumna(atributo); T.setClavePrimaria(clavePrimaria); PRIMERAFN.Add(T); } else { // si el atributo no es multivaluado solamente lo agrega a la tabla principal. // solo si no es parte de la clave primaria if(!xSubY(atributo,clavePrimaria)) TablaPrincipal.addColumna(atributo); } } // Agregando la tabla principal ya completa con todos los atributos no multivaluados. PRIMERAFN.Add(TablaPrincipal); normal.Text += "\nTablas Primera Forma Normal \n"; String ntabla = ""; foreach (Tabla x in PRIMERAFN) { ntabla ="| "+ x.getClavePrimaria().getValor() + "(PK)|"; foreach (Atributo C in x.getColumnas()) { ntabla += " " + C.getValor() + " |"; } normal.Text += ntabla + "\n"; } }