Está en la página 1de 7

Las 6+2 formas normales de las bases de datos relacionales 2019-10-15 12(18 p. m.

Blog Bitix Buscar en Blog Bitix Buscar

Java GNU/Linux JavaScript Tapestry Archivo y hemeroteca Enlaces Acerca de...

Las 6+2 formas normales de las bases de


datos relacionales
Escrito por picodotdev el 10/02/2018.
planeta-codigo programacion
Enlace permanente Comentarios

En la universidad se explican las formas normales, en mi caso que yo recuerde hasta la tercera forma normal.
Conocer la tercera forma normal suele ser suficiente pero en la teoría existe hasta la sexta forma normal. Cumplir
las formas normales evita redundancias e inconsistencias en los datos a costa de crear más tablas que en algunos
consultas puede hacerlas lentas. El proceso contrario de la normalización es la desnormalización, puede producir
inconsistencias pero los datos son más sencillos y en algunos casos más rápido de consultar.

Ecuador: ahora más cerca.


Los nuevos vuelos a Quito empiezan en diciembre.
¡Aprovecha ahora las increíbles tarifas!

Las bases de datos relacionales desarrolladas en los años 70 son la forma más utilizada aún en la actualidad para almacenar
la información en la mayoría de las aplicaciones informáticas de cualquier ámbito. Los datos se guardan en tablas
separadas en campos y con un tipo, los datos almacenados en cada tabla están relacionados entre sí, por ejemplo, podría
ser la información de una persona, nombre, apellidos, fecha de nacimiento, ciudad de residencia, teléfono, … Además las
tablas pueden relacionarse con otras tablas. Siguiendo el ejemplo podríamos tener una tabla de películas o libros y
relacionarlas con la tabla de personas de forma que conozcamos que películas ha visto o libros ha leído una persona, de
cada película podemos guardar su director, de los libros el autor y de cada uno de ellos los actores o personajes.

Al almacenar la información en la base de datos debemos evitar las redundancias e inconsistencias de forma que la
información que obtengamos al consultarla esté libre de inconsistencias. Por ejemplo, guardando la ciudad de residencia
en la tabla persona deberemos actualizar todos los registros de las personas que residan en ella al cambiar de nombre a una
ciudad o acabaremos con que la misma ciudad está referida por varios términos. Para evitar inconsistencias en las bases de
datos se definieron las formas normales, hay seis formas normales y dos adicionales aunque normalmente con aplicar
hasta la tercera es suficiente ya que por las relaciones de los datos no es necesario aplicar formas normales superiores.
Hasta la tercera forma normal se pueden aplicar independientemente del dominio tratado, a partir de la cuarta forma

https://picodotdev.github.io/blog-bitix/2018/02/las-6-plus-2-formas-normales-de-las-bases-de-datos-relacionales/ Página 1 de 7
Las 6+2 formas normales de las bases de datos relacionales 2019-10-15 12(18 p. m.

normal las relaciones las cumplen o no en función de las reglas y condiciones que se establezcan para el dominio. Cuanto
mayor sea la forma normal de una tabla o una base de datos menos casos existirán de que contengan inconsistencias, una
tabla que cumpla una forma normal cumple las formas normales de menor nivel. Las formas normales son las siguientes:

Forma normal de base de datos


Primera forma normal, 1FN
Segunda forma normal, 2FN
Tercera forma normal, 3FN
Forma normal de Boyce-Codd, BCNF
Cuarta forma normal, 4FN
Quinta forma normal, 5FN
Sexta forna normal, 6FN
Forma normal de dominio/clave, DNFN
Desnormalización

En los enlaces de la wikipedia está incluida una explicación más detallada de cada forma normal, a continuación solo haré
un breve resumen. En anexo final del libro SQL Antipattens también hay una explicación muy detallada de las diferentes
formas normales, que problemas pueden ocasionar y como corregirlos.

SQL
Antipatterns:...
EUR 22,24

Comprar ahora

Primera forma normal, 1FN


No hay grupos repetidos de columnas, ni una columna guarda múltiples valores. Por ejemplo, si de una persona queremos
guardar varios teléfonos deberíamos crear una tabla de teléfonos y relacionarla con la tabla de usuarios.

En el caso del ejemplo los grupos repetidos de columnas implica que de una persona solo se pueden guardar hasta tres
teléfonos como máximo, han de crearse las columnas por adelantado aunque no se usen y si hay que actualizar un telefono
no sabríamos en que campo de la tabla está obligando a realizar una consulta de actualización en los tres campos.

Las columnas con múltiples valores son difíciles de actualizar con sentencias SQL por el formato que emplea la columna
para guardar el dato, en este caso utilizando una barra como separador.

1 -- Grupos reptidos de columnas


2 Persona (id_persona, nombre, teléfono1, teléfono2, telefono3)
3 1, Maria, 555123456, 555234567, 555345678
4
5 -- Una columna con múltiples valores
6 Persona (id_persona, nombre, teléfonos )
7 1, María, 555123456/555234567/555345678
8
9 -- 1FN
10 Usuario (id_persona, nombre) Teléfono (persona_id, telefono)
11 1, María 1, 555123456
12 1, 555123456
13 1, 555234567
14 1, 555345678

1fn.txt view raw

https://picodotdev.github.io/blog-bitix/2018/02/las-6-plus-2-formas-normales-de-las-bases-de-datos-relacionales/ Página 2 de 7
Las 6+2 formas normales de las bases de datos relacionales 2019-10-15 12(18 p. m.

Segunda forma normal, 2FN


Cada columna de una tabla está relacionada con todas las columnas de la clave primaria y no solo por una combinación de
parte de la clave primaria. En este caso en que se guarda las las persona que trabajan en una empresa, cumple la 1FN al no
tener columnas repetidas ni múltiples valores en una columna pero no cumple la 2FN estando la clave primaria formada
por los campos id_persona e id_empresa y el campo direccion_empresa siendo solo dependiente del campo id_empresa.

En este caso el problema además de contener posibles inconsistencias en los valores de las direcciones es que si se quisiera
actualizar la dirección de una empresa habría que actualizar todos los registros de los empleados y empresa.

1 -- Campos dependientes de un subconjunto de la clave primaria


2 Persona (id_persona, id_empresa, direccion_empresa, puesto, horas semanales)
3 1, 1, C\ Rue el Percebe, jardinero, 40
4 2, 1, C\ Rue el Percebe, barrendero, 35
5 3, 1, C\ Rue el Percebe, jardinero, 40
6
7 -- 2 FN
8 Empresa (id_persona, id_empresa, puesto, horas semanales)
9 1, 1, jardinero, 40
10 2, 1, barrendero, 35
11 3, 1, jardienro, 40
12
13 Dirección (id_empresa, dirección)
14 1, C\ Rue el Percebe

2fn.txt view raw

Tercera forma normal, 3FN


Cada columna de una tabla está relacionada directamente con las columnas de la clave primaria, no de forma transitiva a
través de otro campo. En el mismo caso anterior que cumple la 2FN no cumple la tercera si el campo horas semanales
depende del puesto.

Podría haber inconsistenias de datos si dos personas tuviesen diferentes horas semanales para el mismo puesto.

1 -- 3 FN
2 Empresa (id_persona, id_empresa, puesto)
3 1, 1, jardinero
4 2, 1, barrendero
5 3, 1, jardinero
6
7 Puesto (puesto, horas semanales)
8 jardinero, 40
9 barrendero, 35

3fn.txt view raw

Forma normal de Boyce-Codd, BCNF


Una tabla está en BCNF y está en 3FN y todos los campos tienen como deteminante (dependen) la clave primaria. En un
caso en que un trabajador trabaja en varias empresas con un responsable asignado e introduciendo la restricción de que en
una empresa solo hay un responsable para todos los trabajadores, el campo id_responsable tiene una dependencia sobre el
campo id_empresa que no es clave primaria.

https://picodotdev.github.io/blog-bitix/2018/02/las-6-plus-2-formas-normales-de-las-bases-de-datos-relacionales/ Página 3 de 7
Las 6+2 formas normales de las bases de datos relacionales 2019-10-15 12(18 p. m.

1 Trabajador (id_persona, id_empresa, id_responsable)


2 1, 1, 2
3 2, 1, 3
4
5 -- BCFN
6 Trabajador (id_persona, id_empresa)
7 1, 1
8 2, 1
9
10 Empresa (id_empresa, id_responsable)
11 1, 3

bcfn.txt view raw

Cuarta forma normal, 4FN


No existen dos o más relaciones independientes en una misma tabla. En una relación que guarde las empresas de un
trabajador y las localidades en las que trabaja, si las empresas y las localidades son independientes hay redundancia de
datos por guardar para cada empresa cada una de las localidades del trabajador. Aplicando la 4FN en vez de utilizar 6 filas
se utilizan 2 y 3 filas en las tablas Trabajador y Localidad.

1 Zona (id_persona, id_empresa, id_localidad)


2 1, 1, 1
3 1, 1, 2
4 1, 1, 3
5 1, 2, 1
6 1, 2, 2
7 1, 2, 3
8
9 -- 4FN
10 Trabajador (id_persona, id_empresa)
11 1, 1
12 1, 2
13
14 Localidad (id_persona, id_localidad)
15 1, 1
16 1, 2
17 1, 3

4fn.txt view raw

Quinta forma normal, 5FN


En el mismo caso anterior si se intodujese una realación entre empresa y localidades en las que trabaja y la condición de
que es cierto que las localidades de un trabajador están incluídas en el conjunto de las localidades de una empresa si no se
aplicase la 5FN y un trabajador empezase a trabajar en una nueva empresa habría que insertar una fila nueva en la tabla
Zona por cada localidad del trabajador.

Si el trabajador 1 empezase a trabajar en la empresa 2 sin aplicar la 5FN habría que insertar dos nuevas filas en la trabla
Zona. Aplicando la 5FN bastaría con insertar una en la tabla TrabajadorEmpresa (id_persona: 1, id_empresa: 2).

https://picodotdev.github.io/blog-bitix/2018/02/las-6-plus-2-formas-normales-de-las-bases-de-datos-relacionales/ Página 4 de 7
Las 6+2 formas normales de las bases de datos relacionales 2019-10-15 12(18 p. m.

1 Zona (id_persona, id_empresa, id_localidad)


2 1, 1, 1
3 1, 1, 2
4 -- Nuevas filas si 1 empezase a trabajar en la empresa 2
5 1, 2, 1
6 1, 2, 2
7
8
9 -- 5FN
10 TrabajadorLocalidad (id_persona, id_localidad)
11 1, 1
12 1, 2
13 1, 3
14
15 TrabajadorEmpresa (id_persona, id_empresa)
16 1, 1
17
18 EmpresaLocalidad (id_persona, id_localidad)
19 1, 1
20 1, 2
21 1, 3
22 2, 1
23 2, 2
24 2, 3

5fn.txt view raw

Sexta forma normal, 6FN


Sixth normal form

Forma normal de dominio/clave, DNFN


Forma normal de dominio/clave

Desnormalización
Aplicar las reglas de las formas normales para cumplirlas implica separar los datos que antes estaban en una tabla en
varias, con las formas normales evitaremos inconsistencias pero consultar los datos de forma agrupada puede ser más lento
al tener la base de datos que unir las tablas. Normalmente, llegar al nivel de 3FN es suficiente si los datos no tienen reglas
especiales y si cumple la 3FN es habitual que cumpla la 5FN sin cambios adicionales.

La desnormalización consiste el proceso contrario tratando de balancear la rapidez de consulta con el hecho de obtener
datos inconsistentes. Dependiendo de los datos y sus reglas se puede aceptar cierto grado de desnormalización. Algunas
bases de datos tienen un concepto similar al que existe en la base de datos PostgesSQL, las materialized views. Las vistas
materializadas son vistas de los datos pero cuyos datos son guardados de forma similar a una tabla, esto tiene la ventaja de
que consultar la vista basta para consultar los datos que es más rápido que realizar de nuevo la consulta original de la vista.
Con las vistas y las vistas materializadas podemos guardar los datos en la forma normal que consideremos y si por
rendimiento debemos realizar una desnormalización con las vistas y vistas materializadas podemos hacerlo, en el caso de
las vistas materializadas deberemos refrescarlas de forma regular.

La información es una de las cosas más importantes para una organización y por tanto también para las aplicaciones. En el
libro SQL Antipatterns se comentan varios situaciones en las bases de datos que conviene conocer para evitarlos, que
problemas causan, cuando son aplicables y cuales son las soluciones. En libro muy recomendable y útil ya que
independientemente del lenguaje o tipo de aplicación este conocimiento sobre las bases de datos relacionales es de
provecho, como en la práctica totalidad de las aplicaciones se usa una base de datos relacional para persistir los datos será
en casi todos los casos.

https://picodotdev.github.io/blog-bitix/2018/02/las-6-plus-2-formas-normales-de-las-bases-de-datos-relacionales/ Página 5 de 7
Las 6+2 formas normales de las bases de datos relacionales 2019-10-15 12(18 p. m.

Artículos relacionados:
Análisis estático de código con PMD y un ejemplo
Conferencia BilboStack 2018
Hemeroteca #12
Introducción a la programación funcional con Java y la librería Vavr
Definir nuevos tipos de datos escalares en GraphQL

93 Tweet Share Share Share


Shares

0 Comentarios Blog Bitix !


1 Acceder

' Recomendar t Tweet f Compartir Ordenar por los más antiguos

Sé el primero en comentar...

INICIAR SESIÓN CON O REGISTRARSE CON DISQUS ?

Nombre

Sé el primero en comentar.

TAMBIÉN EN BLOG BITIX

Hemeroteca #12 Hemeroteca #11


2 comentarios • hace 2 años 2 comentarios • hace 2 años
picodotdev — Mientras pueda aquí seguiré, si he conseguido estar 7 años picodotdev — Hola Francisco, muchas gracias por tu comentario, de veras,
alguno más puedo continuar, un saludo. me anima a seguir escribiendo y compartiendo lo que voy aprendiendo. Y
ver que la buena cantidad de tiempo que le dedico al blog es valorado. Una
de las cosas de las que estoy contento sobre otros blogs es que en los
Qué es y cómo funciona el type erasure en Java Me cambio
artículosade laprogramación
eléctrica HolaLuz
casi siempre incluyo un ejemplo con el código
1 comentario • hace 2 años 6 comentarios • hace 2 años
fuente completo que a veces es difícil encontrar. Un saludo.
Armando Suárez Pons — Excelente post. Felicidades picodotdev — Pues habrás tenido una mala experiencia pero en mi caso de
momento ofrecen una buena atención al cliente. Sopongo que les habrás
llamado por teléfono, vía correo electrónico o redes sociales varias veces y
¿no ten han dado una explicación del extraño cambio de potencia y
ofrecido
✉ Suscríbete d Añade Disqus a tu sitio webAñade Disqus Añadir & Política de privacidad de DisqusPolítica una solución? No estoy de acuerdo con que todos actúan igual.
de privacidadPrivacidad

https://picodotdev.github.io/blog-bitix/2018/02/las-6-plus-2-formas-normales-de-las-bases-de-datos-relacionales/ Página 6 de 7
Las 6+2 formas normales de las bases de datos relacionales 2019-10-15 12(18 p. m.

Blog Bitix Java


GNU/Linux
Blog dedicado a la distribución GNU/Linux que JavaScript
uso habitualmente, Arch Linux, a mis andanzas Tapestry
alrededor del software libre, la programación y a Archivo y hemeroteca
otros temas relacionados con la tecnología y la Enlaces
informática. Publicidad
Donaciones
Publicando de uno a tres artículos únicos a la
Acerca de...
semana desde el año 2010.

Copyleft 2019 -
©

Blog Bitix by pico.dev is licensed under a Creative Commons Reconocimiento-CompartirIgual 4.0 Internacional License.
Powered by Hugo and GitHub Pages. Background patterns from Subtle Patterns.

https://picodotdev.github.io/blog-bitix/2018/02/las-6-plus-2-formas-normales-de-las-bases-de-datos-relacionales/ Página 7 de 7

También podría gustarte