¿Qué es la normalización (o normalización)?

Respuestas:

171

La normalización consiste básicamente en diseñar un esquema de base de datos tal que se eviten datos duplicados y redundantes. Si algún dato se duplica en varios lugares de la base de datos, existe el riesgo de que se actualice en un lugar pero no en el otro, lo que da lugar a la corrupción de los datos.

Hay varios niveles de normalización desde 1. forma normal hasta 5. forma normal. Cada formulario normal describe cómo deshacerse de algún problema específico, generalmente relacionado con la redundancia.

Algunos errores típicos de normalización:

(1) Tener más de un valor en una celda. Ejemplo:

UserId | Car
---------------------
1      | Toyota
2      | Ford,Cadillac

Aquí la columna "Coche" (que es una cadena) tiene varios valores. Eso ofende la primera forma normal, que dice que cada celda debe tener un solo valor. Podemos normalizar este problema al tener una fila separada por automóvil:

UserId | Car
---------------------
1      | Toyota
2      | Ford
2      | Cadillac

El problema de tener varios valores en una celda es que es difícil de actualizar, difícil de consultar y no se pueden aplicar índices, restricciones, etc.

(2) Tener datos no clave redundantes (es decir, datos repetidos innecesariamente en varias filas). Ejemplo:

UserId | UserName | Car
-----------------------
1      | John     | Toyota
2      | Sue      | Ford
2      | Sue      | Cadillac

Este diseño es un problema porque el nombre se repite en cada columna, aunque el nombre siempre está determinado por el UserId. Esto hace que sea teóricamente posible cambiar el nombre de Sue en una fila y no en la otra, lo cual es corrupción de datos. El problema se resuelve dividiendo la tabla en dos y creando una relación de clave primaria / clave externa:

UserId(FK) | Car               UserId(PK) | UserName
---------------------          -----------------
1          | Toyota            1          | John
2          | Ford              2          | Sue
2          | Cadillac

Ahora puede parecer que todavía tenemos datos redundantes porque los UserId se repiten; Sin embargo, la restricción PK / FK garantiza que los valores no se puedan actualizar de forma independiente, por lo que la integridad es segura.

¿Es importante? Si, es muy importante. Al tener una base de datos con errores de normalización, corre el riesgo de obtener datos inválidos o corruptos en la base de datos. Dado que los datos "viven para siempre", es muy difícil deshacerse de los datos corruptos cuando ingresan por primera vez a la base de datos.

No tengas miedo a la normalización . Las definiciones técnicas oficiales de los niveles de normalización son bastante obtusas. Parece que la normalización es un proceso matemático complicado. Sin embargo, la normalización es básicamente el sentido común, y encontrará que si diseña un esquema de base de datos usando el sentido común, normalmente estará completamente normalizado.

Hay una serie de conceptos erróneos sobre la normalización:

  • algunos creen que las bases de datos normalizadas son más lentas y la desnormalización mejora el rendimiento. Sin embargo, esto solo es cierto en casos muy especiales. Normalmente, una base de datos normalizada también es la más rápida.

  • a veces la normalización se describe como un proceso de diseño gradual y hay que decidir "cuándo parar". Pero en realidad, los niveles de normalización solo describen diferentes problemas específicos. El problema resuelto por las formas normales por encima de la 3ª NF son problemas bastante raros en primer lugar, por lo que es probable que su esquema ya esté en 5NF.

¿Se aplica a algo fuera de las bases de datos? No directamente, no. Los principios de normalización son bastante específicos para las bases de datos relacionales. Sin embargo, el tema subyacente general, que no debería tener datos duplicados si las diferentes instancias pueden desincronizarse, se puede aplicar ampliamente. Este es básicamente el principio DRY .

JacquesB
fuente
4
El ejemplo que dio para la primera normalidad no es exactamente correcto. Siempre recuerdo las tres primeras formas normales con los términos repetidos, redundantes, no dependientes. La repetición de datos se refiere a cuando los desarrolladores de bases de datos novatos escriben definiciones de tabla que incluyen columnas como DogName1, DogName2, DogName3, etc.
Bill
2
@Bill: ¿Por qué crees que el ejemplo que proporciono no es correcto? ¿Conoce una definición de 1NF donde el ejemplo estaría bien?
JacquesB
¿Por qué la normalización no es necesaria en la programación orientada a objetos, sino solo cuando se trata de bases de datos? Creo que ya hay un proceso de normalización integrado con el núcleo de lo que es la programación orientacional de objetos, ¿no es así?
Lealo
@Lealo No, en absoluto. Siempre puede mapear el estado de un diseño OO trivialmente a una base de datos / diseño "relacional" con tablas - eso es lo que es ORM - pero la base de datos / diseño que obtiene es una representación relacional del diseño OO, no una representación relacional de el negocio , y no solo la representación relacional del diseño OO está claramente sujeta a anomalías de actualización y redundancia que administra la normalización, sino que los métodos OO tienen que hacer cumplir las restricciones apropiadas (no documentadas) (complejas) ("representación invariante") a mano.
philipxy
@Lealo: El principio se aplica a la programación orientada a objetos en la medida en que nunca debe tener la misma información (en forma mutable) en dos objetos diferentes, ya que pueden perder la sincronización.
JacquesB
45

Las reglas de normalización (fuente: desconocida)

  • La llave ( 1NF )
  • Toda la clave ( 2NF )
  • y nada mas que la llave ( 3NF )

... Así que ayúdame Codd.

PreocupadoDeTunbridgeWells
fuente
12
Creo que esto es un poco vago sin un contexto adecuado, ¿no crees?
Rik
3
Puede ser un poco vago, pero es un gran recordatorio para quienes conocen el contexto. Sé qué es la normalización y cómo hacerlo, pero nunca puedo recordar cuáles son cada una de las formas.
Benjamin Autin
1
wikipedia explica esto aquí: "Requerir la existencia de" la clave "asegura que la tabla esté en 1NF; requerir que los atributos no clave dependan de" la clave completa "asegura 2NF; además, requiere que los atributos no clave dependan de" nada pero la clave "asegura 3NF".
Kcats Wolfrevo
Según wikipedia, la fuente es Bill Kent: "[Cada] [atributo] que no sea clave debe proporcionar un hecho sobre la clave, la clave completa y nada más que la clave".
apteryx
19

Lo más importante es que sirve para eliminar la duplicación de los registros de la base de datos. Por ejemplo, si tiene más de un lugar (mesas) donde podría aparecer el nombre de una persona, mueva el nombre a una tabla separada y haga referencia a él en cualquier otro lugar. De esta manera, si necesita cambiar el nombre de la persona más adelante, solo tiene que cambiarlo en un lugar.

Es crucial para el diseño adecuado de la base de datos y, en teoría, debe usarlo tanto como sea posible para mantener la integridad de sus datos. Sin embargo, al recuperar información de muchas tablas, está perdiendo algo de rendimiento y es por eso que a veces puede ver tablas de bases de datos desnormalizadas (también llamadas aplanadas) utilizadas en aplicaciones críticas para el rendimiento.

Mi consejo es comenzar con un buen grado de normalización y solo hacer la desnormalización cuando sea realmente necesario

PD también consulte este artículo: http://en.wikipedia.org/wiki/Database_normalization para leer más sobre el tema y sobre las llamadas formas normales

Ilya Kochetov
fuente
También se sorprendería bastante de la poca desnormalización que se necesita realmente en las aplicaciones transaccionales. En una aplicación monstruosa para la que hice el modelo de datos, un esquema con 560 tablas tenía solo 4 elementos de datos desnormalizados.
ConcernedOfTunbridgeWells
Previene "anomalías de actualización". Lo hace eliminando ciertos tipos de duplicación.
S.Lott
"Mi consejo es comenzar con un buen grado de normalización y solo hacer la desnormalización cuando sea realmente necesario". ¡Este consejo es muy malo! Todavía no vi ninguna ilustración adecuada de esta "pseudo-teoría". Menos 1.
Philippe Grondier
7

Normalización procedimiento utilizado para eliminar la redundancia y las dependencias funcionales entre columnas de una tabla.

Existen varias formas normales, generalmente indicadas por un número. Un número más alto significa menos redundancias y dependencias. Cualquier tabla SQL está en 1NF (primera forma normal, prácticamente por definición) Normalizar significa cambiar el esquema (a menudo particionando las tablas) de manera reversible, dando un modelo que es funcionalmente idéntico, excepto con menos redundancia y dependencias.

La redundancia y dependencia de los datos no es deseable porque puede dar lugar a inconsistencias al modificar los datos.

Rik
fuente
5

Está destinado a reducir la redundancia de datos.

Para una discusión más formal, consulte Wikipedia http://en.wikipedia.org/wiki/Database_normalization

Daré un ejemplo algo simplista.

Suponga la base de datos de una organización que generalmente contiene miembros de la familia

id, name, address
214 Mr. Chris  123 Main St.
317 Mrs. Chris 123 Main St.

podría normalizarse como

id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27

y una mesa familiar

ID, address
27 123 Main St.

La normalización casi completa (BCNF) generalmente no se usa en producción, pero es un paso intermedio. Una vez que haya puesto la base de datos en BCNF, el siguiente paso suele ser Des-normalizarla de forma lógica para acelerar las consultas y reducir la complejidad de ciertas inserciones comunes. Sin embargo, no puede hacer esto bien sin normalizarlo correctamente primero.

La idea es que la información redundante se reduzca a una sola entrada. Esto es particularmente útil en campos como direcciones, donde el Sr. Chris envía su dirección como Unit-7 123 Main St. y la Sra. Chris enumera Suite-7 123 Main Street, que aparecería en la tabla original como dos direcciones distintas.

Normalmente, la técnica utilizada es encontrar elementos repetidos y aislar esos campos en otra tabla con identificadores únicos y reemplazar los elementos repetidos con una clave principal que haga referencia a la nueva tabla.

Chris Cudmore
fuente
1
BCNF no es "perfecto". Existen formas normales superiores, hasta 6NF, donde todas sus tablas son solo una clave y un valor de datos. Sin embargo, rara vez se usa
Rik
No estoy de acuerdo con que el BCNF se utilice con poca frecuencia y que normalmente se desnormalice. De hecho, su ejemplo normalizado ya está en BCNF, y si lo desnormaliza, volvería al punto de partida.
JacquesB
3

Citando a CJ Fecha: La teoría ES práctica.

Las desviaciones de la normalización resultarán en ciertas anomalías en su base de datos.

Las desviaciones de la primera forma normal causarán anomalías de acceso, lo que significa que debe descomponer y escanear valores individuales para encontrar lo que está buscando. Por ejemplo, si uno de los valores es la cadena "Ford, Cadillac" como se indica en una respuesta anterior, y está buscando todas las ocurrencias de "Ford", tendrá que abrir la cadena y mirar la subcadenas. Esto, hasta cierto punto, frustra el propósito de almacenar los datos en una base de datos relacional.

La definición de Primera Forma Normal ha cambiado desde 1970, pero esas diferencias no tienen por qué preocuparle por ahora. Si diseña sus tablas SQL utilizando el modelo de datos relacionales, sus tablas estarán automáticamente en 1NF.

Las desviaciones de la Segunda Forma Normal y más allá causarán anomalías de actualización, porque el mismo hecho se almacena en más de un lugar. Estos problemas hacen que sea imposible almacenar algunos hechos sin almacenar otros que pueden no existir y, por lo tanto, deben inventarse. O cuando los hechos cambian, es posible que tenga que ubicar todos los lugares donde se almacena un hecho y actualizar todos esos lugares, para que no termine con una base de datos que se contradiga. Y, cuando va a eliminar una fila de la base de datos, puede encontrar que si lo hace, está eliminando el único lugar donde se almacena un hecho que todavía es necesario.

Estos son problemas lógicos, no problemas de rendimiento o problemas de espacio. A veces, puede evitar estas anomalías de actualización mediante una programación cuidadosa. A veces (a menudo) es mejor prevenir los problemas en primer lugar adhiriéndose a las formas normales.

A pesar del valor de lo que ya se ha dicho, debe mencionarse que la normalización es un enfoque de abajo hacia arriba, no un enfoque de arriba hacia abajo. Si sigue ciertas metodologías en su análisis de los datos y en su diseño inicial, puede estar seguro de que el diseño se ajustará a 3NF como mínimo. En muchos casos, el diseño se normalizará por completo.

Donde realmente puede querer aplicar los conceptos enseñados bajo la normalización es cuando se le brindan datos heredados, de una base de datos heredada o de archivos formados por registros, y los datos se diseñaron con total ignorancia de los formularios normales y las consecuencias de partir. de ellos. En estos casos, es posible que deba descubrir las desviaciones de la normalización y corregir el diseño.

Advertencia: la normalización a menudo se enseña con connotaciones religiosas, como si cada desviación de la normalización completa fuera un pecado, una ofensa contra Codd. (pequeño juego de palabras allí). No compre eso. Cuando realmente aprenda el diseño de bases de datos, no solo sabrá cómo seguir las reglas, sino que también sabrá cuándo es seguro romperlas.

Walter Mitty
fuente
2

La normalización es uno de los conceptos básicos. Significa que dos cosas no se influyen entre sí.

En bases de datos específicamente significa que dos (o más) tablas no contienen los mismos datos, es decir, no tienen ninguna redundancia.

A primera vista eso es realmente bueno porque tus posibilidades de hacer algunos problemas de sincronización son cercanas a cero, siempre sabes dónde están tus datos, etc. Pero, probablemente, tu número de tablas crecerá y tendrás problemas para cruzar los datos y para obtener algunos resultados resumidos.

Entonces, al final terminarás con el diseño de la base de datos que no es puramente normalizado, con algo de redundancia (estará en algunos de los posibles niveles de normalización).

Nenad Dobrilovic
fuente
2

¿Qué es la normalización?

La normalización es un proceso formal paso a paso que nos permite descomponer las tablas de la base de datos de tal manera que se minimizan tanto la redundancia de datos como las anomalías de actualización .

Cortesía del proceso de normalización
ingrese la descripción de la imagen aquí

Primera forma normal si y solo si el dominio de cada atributo contiene solo valores atómicos (un valor atómico es un valor que no se puede dividir), y el valor de cada atributo contiene solo un valor de ese dominio (ejemplo: - dominio para el la columna de género es: "M", "F".).

La primera forma normal hace cumplir estos criterios:

  • Eliminar grupos repetidos en tablas individuales.
  • Cree una tabla separada para cada conjunto de datos relacionados.
  • Identifique cada conjunto de datos relacionados con una clave principal

Segunda forma normal = 1NF + sin dependencias parciales, es decir, todos los atributos que no son clave son completamente funcionales dependiendo de la clave principal.

Tercera forma normal = 2NF + sin dependencias transitivas, es decir, todos los atributos que no son de clave son totalmente funcionales y dependen DIRECTAMENTE solo de la clave principal.

La forma normal de Boyce-Codd (o BCNF o 3.5NF) es una versión ligeramente más fuerte de la tercera forma normal (3NF).

Nota: - Las formas normales segunda, tercera y Boyce-Codd se refieren a las dependencias funcionales. Ejemplos

Cuarta forma normal = 3NF + eliminar dependencias multivalor

Quinta forma normal = 4NF + eliminar dependencias de unión

Premraj
fuente
0

Como dice Martin Kleppman en su libro Designing Data Intensive Applications:

La literatura sobre el modelo relacional distingue varias formas normales diferentes, pero las distinciones tienen poco interés práctico. Como regla general, si está duplicando valores que podrían almacenarse en un solo lugar, el esquema no se normaliza.

Arun
fuente
-10

Ayuda a prevenir datos duplicados (y peor aún, contradictorios).

Sin embargo, puede tener un impacto negativo en el rendimiento.

Brian Knoblauch
fuente
Habiendo trabajado con datos tanto normalizados como no normalizados, prefiero una caída de velocidad con normalización en lugar de perder o tener dificultades para mantener la aplicación o la base de datos.
Schalk Versteeg
1
Los motores de bases de datos modernos emplean el almacenamiento en caché, lo que a menudo hace que las bases de datos normalizadas sean más eficientes que las no normalizadas. en caso de duda, mida.
Steven A. Lowe
1
Un diseño desnormalizado puede ser más rápido para una consulta en particular, pero un diseño normalizado ofrece un compromiso al brindar un rendimiento razonable para una variedad mucho más amplia de consultas.
Bill Karwin
@ Bill, tendría que estar un poco en desacuerdo. La única forma en que una base de datos completamente normalizada ayuda al rendimiento es evitando que el sistema tenga que lidiar con datos redundantes. Aparte de eso, es la peor situación desde el punto de vista del rendimiento.
Brian Knoblauch
Esta respuesta no agrega nada de valor sobre las respuestas existentes.
cimmanon