/*  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;
 }