Una relación se encuentra en Primera Forma Normal (1FN) cuando cada atributo solo toma un valor del dominio simple subyacente. En 1FN no existen grupos repetitivos (De
Miguel et al, 2001). En el siguiente ejemplo la tabla no se encuentra en 1FN.
Nombre | Recursos |
---|---|
Juan | MochilaComputadora |
María | Libreta |
Para que la tabla anterior esté en 1FN y sea una verdadera relación debería encontrarse en esta forma:
Nombre | Recursos |
---|---|
Juan | Mochila |
Juan | Computadora |
María | Libreta |
Se dice entonces que una relación está en 1FN si los dominios de todos los atributos son atómicos (Silberschatz A., Korth H. y Sudarshan S., 2006) y monovalentes (Reynosa E., Maldonado C., Muñoz R., Damiano L., Abrutsky M, 2012). Se le llama atómico a los elementos de un dominio cuando son unidades indivisibles. En la primera tabla “Mochila” y “Computadora” son elementos divisibles por lo que esa tabla no está en 1FN. El término monovalente se refiere a que los valores no pueden repetirse y deben expresarse una sola vez por ocurrencia. Si una tupla tiene repetida varias veces la misma información deberá reducirse a una única instancia. A eso se refiere la expresión, eliminar grupos repetitivos.
Veamos el siguente ejemplo:
Tabla original
Sucursal y número de factura | Fecha de la factura | Forma de pago | Código de cliente | Nombre de cliente | Código de artículo | Nombre de artículo | Cantidad del artículo | Precio unitario del artículo | Subtotal del artículo | Total de factura |
---|---|---|---|---|---|---|---|---|---|---|
01-100 | 1/10/15 | Crédito | 01 | PEREZ | 01 | CAMISA | 2 | 50 | 100 | 440 |
01-100 | 1/10/15 | Crédito | 01 | PEREZ | 02 | ZAPATOS | 3 | 80 | 240 | 440 |
01-100 | 1/10/15 | Crédito | 01 | PEREZ | 05 | MESA | 1 | 100 | 100 | 440 |
01-101 | 2/10/15 | Contado | 33 | GARCÍA | 09 | TINTA | 4 | 25 | 100 | 100 |
02-100 | 3/10/15 | Crédito | 45 | GOMEZ | 13 | CUADRO | 5 | 90 | 450 | 550 |
02-100 | 3/10/15 | Crédito | 45 | GOMEZ | 05 | MESA | 1 | 100 | 100 | 550 |
Observamos que no se encuentra en 1FN, pues Sucursal y número de factura no es un dato atómico. Un primer cambio que podemos hacer es el siguiente:
Sucursal | Número de factura | Fecha de la factura | Forma de pago | Código de cliente | Nombre de cliente | Código de artículo | Nombre de artículo | Cantidad del artículo | Precio unitario del artículo | Subtotal del artículo | Total de factura |
---|---|---|---|---|---|---|---|---|---|---|---|
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 01 | CAMISA | 2 | 50 | 100 | 440 |
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 02 | ZAPATOS | 3 | 80 | 240 | 440 |
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 05 | MESA | 1 | 100 | 100 | 440 |
01 | 101 | 2/10/15 | Contado | 33 | GARCÍA | 09 | TINTA | 4 | 25 | 100 | 100 |
02 | 100 | 3/10/15 | Crédito | 45 | GOMEZ | 13 | CUADRO | 5 | 90 | 450 | 550 |
02 | 100 | 3/10/15 | Crédito | 45 | GOMEZ | 05 | MESA | 1 | 100 | 100 | 550 |
Encontramos que todavía existen grupos repetitivos. Para eliminarlos y no eliminar los detalles de la factura no queda otra opción sino dividir la tabla.
Sucursal | Número de factura | Fecha de la factura | Forma de pago | Código de cliente | Nombre de cliente | Total de factura |
---|---|---|---|---|---|---|
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 440 |
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 440 |
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 440 |
01 | 101 | 2/10/15 | Contado | 33 | GARCÍA | 100 |
02 | 100 | 3/10/15 | Crédito | 45 | GOMEZ | 550 |
02 | 100 | 3/10/15 | Crédito | 45 | GOMEZ | 550 |
Código de artículo | Nombre de artículo | Cantidad del artículo | Precio unitario del artículo | Subtotal del artículo |
01 | CAMISA | 2 | 50 | 100 |
02 | ZAPATOS | 3 | 80 | 240 |
05 | MESA | 1 | 100 | 100 |
09 | TINTA | 4 | 25 | 100 |
13 | CUADRO | 5 | 90 | 450 |
05 | MESA | 1 | 100 | 100 |
En la primera de las dos tablas resultantes, podemos eliminar los datos repetitivos, quedando la tabla de esta forma
Sucursal | Número de factura | Fecha de la factura | Forma de pago | Código de cliente | Nombre de cliente | Total de factura |
---|---|---|---|---|---|---|
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 440 |
01 | 101 | 2/10/15 | Contado | 33 | GARCÍA | 100 |
02 | 100 | 3/10/15 | Crédito | 45 | GOMEZ | 550 |
Elegimos los dos primeros atributos como clave primaria
PK | ||||||
Sucursal | Número de factura | Fecha de la factura | Forma de pago | Código de cliente | Nombre de cliente | Total de factura |
01 | 100 | 1/10/15 | Crédito | 01 | PEREZ | 440 |
01 | 101 | 2/10/15 | Contado | 33 | GARCÍA | 100 |
02 | 100 | 3/10/15 | Crédito | 45 | GOMEZ | 550 |
Agregamos las columnas que componen la clave primaria de la primera tabla, a la segunda tabla para poder relacionar ambas tablas.
Sucursal | Número de factura | Código de artículo | Nombre de artículo | Cantidad del artículo | Precio unitario del artículo | Subtotal del artículo |
---|---|---|---|---|---|---|
01 | 100 | 01 | CAMISA | 2 | 50 | 100 |
01 | 100 | 02 | ZAPATOS | 3 | 80 | 240 |
01 | 100 | 05 | MESA | 1 | 100 | 100 |
01 | 101 | 09 | TINTA | 4 | 25 | 100 |
02 | 100 | 13 | CUADRO | 5 | 90 | 450 |
02 | 100 | 05 | MESA | 1 | 100 | 100 |
Establecemos los tres primeros atributos como clave primaria para esta tabla. Y por último establecemos los dos primeros atributos como clave foránea.
PK | ||||||
---|---|---|---|---|---|---|
Sucursal | Número de factura | Código de artículo | Nombre de artículo | Cantidad del artículo | Precio unitario del artículo | Subtotal del artículo |
01 | 100 | 01 | CAMISA | 2 | 50 | 100 |
01 | 100 | 02 | ZAPATOS | 3 | 80 | 240 |
01 | 100 | 05 | MESA | 1 | 100 | 100 |
01 | 101 | 09 | TINTA | 4 | 25 | 100 |
02 | 100 | 13 | CUADRO | 5 | 90 | 450 |
02 | 100 | 05 | MESA | 1 | 100 | 100 |
Fk |
¿Usar o no usar datos atómicos?
Un caso común de violación a la 1FN es cuando una empresa asigna un número de control a sus empleados utilizando una combinación de claves, por ejemplo, el código de departamento con el código de empleado. Estos números pueden dividirse en unidades menores, por lo que una relación que los usara no se encuentra en 1FN. (Además, utilizar esos números como clave primaria ocasionaría problemas, por ejemplo cuando un empleado cambiara de departamento).
Otro ejemplo sería cuando un atributo llamado “Dirección” guarda los datos de calle y ciudad, ambos datos se considerarían como uno solo, y no se podrían hacer búsquedas por calle o por ciudad. Sin embargo, si en algún caso no se requiriera el uso de datos independientes, tendría sentido utilizar datos no atómicos para evitar una carga innecesaria al programador cuando éste tuviese que convertir los datos separados a datos atómicos.
Referencias
Segunda forma normal en el modelo relacional (2FN) | Blog de tecnología y educación | Nov 4,2015
[…] En el artículo anterior comentamos la Primera Forma Normal. (1FN). Y una relación debe normalizarse a ese nivel si deseamos cumplir con la 2FN. Una vez cubierto este requisito, analicemos el siguiente: los atributos no clave deben depender por completo de la clave primaria y no a una parte de ella. Los atributos no clave son todos aquellos que no forman parte de la clave primaria, y ninguno de ellos dependerá de una parte de la clave primaria. […]