/* determinatesPorTransitividad(Atributo attr) * attr: Atributo del cual se quiren conseguir los Atributos que lo determinan * retorna todos los Atributos que determinan a 'attr' * *Es Recursivo, tomando la dependencia A>B>C>D, el metodo va 'escalando' desde D hasta A * Tomando cada uno de sus determinantes. */ private List<Atributo> determinatesPorTransitividad(Atributo attr,List<Atributo> attrAnalizados) { List<Atributo> todos = new List<Atributo>(); todos = todos.Concat(attr.getDeterminantes()).ToList(); attrAnalizados.Add(attr); foreach (Atributo det in attr.getDeterminantes()) { if (attrAnalizados.Contains(det)) continue; todos = todos.Concat(determinatesPorTransitividad(det, attrAnalizados)).ToList(); } return todos; }
/* 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; }
private Atributo calculaSubPK(Atributo attr, Atributo pk) { foreach (Atributo at in attr.getDeterminantes()) { if (xSubY(at, pk)) return at; } return null; }
//========================================================================= /* cumple2FN * 1. Todo atributo no primo de la relacion debe depender de la clave primaria * 2. Todo atributo que dependa parcialmente de la clavePrimaria no cumple 2FN */ private bool cumple2FN(Atributo attr, Atributo pk) { /*Si algun Atributo X que Determine a Y, es Subconjunto de la ClavePrimaria * Decimos que Y depende parcialmente de la Clave Primaria * entonces no cumple la 2FN */ foreach (Atributo at in attr.getDeterminantes()) { if (xSubY(at, pk)) return false; } return true; }
private Atributo calcularFK(Atributo attr, Tabla tabla) { foreach (Atributo at in attr.getDeterminantes()) { if (tabla.contains(at)) return at; } return null; }