relational database - learning - Descomponiendo una relación en BCNF
normalization forms in dbms (2)
Tengo problemas para establecer cuándo una relación está en la Forma normal de Boyce-Codd y cómo descomponerla en BCNF si no lo está. Dado este ejemplo:
R (A, C, B, D, E) con dependencias funcionales: A -> B, C -> D
¿Cómo hago para descomponerlo?
Los pasos que he tomado son:
A+ = AB
C+ = CD
R1 = A+ = **AB**
R2 = ACDE (since elements of C+ still exist, continue decomposing)
R3 = C+ = **CD**
R4 = ACE (no hay cierres FD residen en esta relación)
Así que ahora sé que ACE compondrá toda la relación, pero la respuesta para la descomposición es: AB, CD, ACE.
Supongo que estoy luchando con la forma de descomponer correctamente una relación en el formulario BCNF y cómo saber cuándo ha terminado. Apreciaría mucho a cualquiera que pueda guiarme a través de su proceso de pensamiento al resolver estos problemas. ¡Gracias!
1NF -> 2NF -> 3NF -> BCNF
Según el conjunto de FD dado, "ACE" forma la clave. Claramente, R (A, B, C, D, E) no está en 2NF. La descomposición 2NF da R1 (A, B), R2 (C, D) y R3 (A, C, E). esta descomposición las relaciones descompuestas están en 3NF y también en BCNF.
Aunque la pregunta es antigua, las otras preguntas / respuestas no parecen proporcionar una respuesta general paso a paso muy clara sobre la determinación y descomposición de las relaciones con BCNF.
1. Determine BCNF:
Para que la relación R esté en BCNF, todas las dependencias funcionales (FD) que se mantienen en R deben satisfacer la propiedad de que los determinantes X son todas las superclaves de R. es decir, si X-> Y se mantiene en R, entonces X debe ser una superclave de R para estar en BCNF.
En su caso, se puede mostrar que la única clave candidata (clave mínima) es ACE. Por lo tanto, ambos FD: A-> B y C-> D están violando BCNF, ya que tanto A como C no son superclaves ni R.
2. Descomponer R en forma BCNF:
Si R no está en BCNF, descomponemos R en un conjunto de relaciones S que están en BCNF.
Esto se puede lograr con un algoritmo muy simple:
Initialize S = {R}
While S has a relation R'' that is not in BCNF do:
Pick a FD: X->Y that holds in R'' and violates BCNF
Add the relation XY to S
Update R'' = R''-Y
Return S
En su caso los pasos iterativos son los siguientes:
S = {ABCDE} // Intialization S = {R}
S = {ACDE, AB} // Pick FD: A->B which violates BCNF
S = {ACE, AB, CD} // Pick FD: C->D which violates BCNF
// Return S as all relations are in BCNF
Por lo tanto, R (A, B, C, D, E) se descompone en un conjunto de relaciones: R1 (A, C, E), R2 (A, B) y R3 (C, D) que satisfacen BCNF.
Tenga en cuenta también que en este caso, la dependencia funcional se conserva, pero la normalización a BCNF no garantiza esto.
Espero que esto ayude.