¿Cuáles son las formas normales de la base de datos y puede dar ejemplos?

En el diseño de bases de datos relacionales, existe un concepto de normalización de base de datos o simplemente normalización, que es un proceso de organización de columnas (atributos) y tablas (relaciones) para reducir la redundancia de datos y mejorar la integridad de los datos. (como está escrito en Wikipedia ).

Como la mayoría de los artículos son algo técnicos y, por lo tanto, más difíciles de entender, estoy pidiendo a alguien que escriba una explicación más fácil de entender basada en ejemplos sobre lo que significan 1NF, 2NF, 3NF, incluso 3.5NF (Boyce-Codd).

1NF es la forma más básica de las formas normales: cada celda de una tabla debe contener solo una información y no puede haber filas duplicadas.

2NF y 3NF se tratan de depender de la clave principal. Recuerde que una clave principal puede estar formada por varias columnas. Como Chris dijo en su respuesta:

Los datos dependen de la clave [1NF], la clave completa [2NF] y nada más que la clave [3NF] (así que ayudame Codd ).

2NF

Digamos que tiene una tabla que contiene los cursos que se toman en un cierto semestre, y usted tiene los siguientes datos:

|-----Primary Key----| uh oh | V CourseID | SemesterID | #Places | Course Name | ------------------------------------------------| IT101 | 2009-1 | 100 | Programming | IT101 | 2009-2 | 100 | Programming | IT102 | 2009-1 | 200 | Databases | IT102 | 2010-1 | 150 | Databases | IT103 | 2009-2 | 120 | Web Design | 

Esto no está en 2NF , porque la cuarta columna no depende de la clave completa , sino de una parte. El nombre del curso depende de la identificación del curso, pero no tiene nada que ver con el semestre en el que se tomó. Por lo tanto, como puede ver, tenemos información duplicada, varias filas que nos dicen que IT101 está progtwigndo e IT102 son bases de datos. Así que lo solucionamos al mover el nombre del curso a otra tabla, donde CourseID es la clave COMPLETA.

 Primary Key | CourseID | Course Name | ---------------------------| IT101 | Programming | IT102 | Databases | IT103 | Web Design | 

Sin redundancia!

3NF

De acuerdo, digamos que también agregamos el nombre del profesor del curso y algunos detalles al respecto en el RDBMS:

 |-----Primary Key----| uh oh | V Course | Semester | #Places | TeacherID | TeacherName | ---------------------------------------------------------------| IT101 | 2009-1 | 100 | 332 | Mr Jones | IT101 | 2009-2 | 100 | 332 | Mr Jones | IT102 | 2009-1 | 200 | 495 | Mr Bentley | IT102 | 2010-1 | 150 | 332 | Mr Jones | IT103 | 2009-2 | 120 | 242 | Mrs Smith | 

Ahora, con suerte, debería ser obvio que TeacherName depende de TeacherID, por lo que no está en 3NF . Para solucionar esto, hacemos más o menos lo mismo que hicimos en 2NF: saque el campo TeacherName de esta tabla y colóquelo en su propio, que tiene TeacherID como clave.

  Primary Key | TeacherID | TeacherName | ---------------------------| 332 | Mr Jones | 495 | Mr Bentley | 242 | Mrs Smith | 

Sin redundancia !!

Una cosa importante para recordar es que si algo no está en 1NF, tampoco está en 2NF o 3NF. Entonces, cada Forma Normal adicional requiere todo lo que tenían las formas normales inferiores, más algunas condiciones adicionales, que deben cumplirse todas .

Nunca he tenido una buena memoria para la redacción exacta, pero en mi clase de base de datos creo que el profesor siempre dijo algo como:

Los datos dependen de la tecla [1NF], la clave completa [2NF] y nada más que la tecla [3NF].

Aquí hay una respuesta rápida, ciertamente asesinada , pero en una oración:

1NF: su tabla está organizada como un conjunto de datos desordenados, y no hay columnas repetitivas.

2NF: no repites datos en una columna de tu tabla debido a otra columna.

3NF: cada columna de su tabla se relaciona solo con la clave de su tabla: no tendría una columna en una tabla que describa otra columna en su tabla que no sea la clave.

Para más detalles, ver wikipedia …

1NF: solo un valor por columna

2NF: todas las columnas de clave no primaria en la tabla deben depender de la clave primaria completa.

3NF: todas las columnas de clave no primaria en la tabla deben depender DIRECTAMENTE de la clave primaria completa.

He escrito un artículo con más detalle aquí