/* cumple3FN * Todo atributo que dependa transitivamente de la ClavePrimaria * No cumple la 3FN */ private bool cumple3FN(Atributo attr, Tabla tabla) { /* Si existe algun Atributo X que determine a Y, que no pertenezca a la clavePrimaria * Decimos que Y depende transitivamente de la clavePrimaria. */ foreach (Atributo at in attr.getDeterminantes()) { if (tabla.contains(at)) return false; } return true; }
/* 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 Atributo calcularFK(Atributo attr, Tabla tabla) { foreach (Atributo at in attr.getDeterminantes()) { if (tabla.contains(at)) return at; } return null; }