En el artículo:

https://firebird21.wordpress.com/2013/08/19/diseno-de-bases-de-datos-1fn/

habíamos visto cuales son los requisitos para que una tabla cumpla con la 1FN y también algunos ejemplos de tablas que no las cumplen. En este artículo veremos más ejemplos de tablas donde no se cumple la 1FN.

Ejemplo 1

1FN3

Captura 1. Si haces clic en la imagen la verás más grande

La tabla CLIENTES_TEL que vimos en el artículo anterior cumple con la 1FN … si y solo si los teléfonos son todos locales. Pero si ese no es el caso entonces está mal diseñada, como nos muestra la Captura 2.

1FN8

Captura 2. Si haces clic en la imagen la verás más grande

Como podemos ver en la Captura 2 en la columna CTL_TELEFO no se está cumpliendo con la condición 5 de la 1FN. ¿Por qué no? Porque en ella tenemos tres cosas distintas:

  1. El Código del País («595» en el ejemplo)
  2. El Código del Area («21» en el ejemplo)
  3. El Número de Teléfono («666777» en el ejemplo)

Para que esa tabla cumpla con la condición 5 de la 1FN ésta debería ser su estructura:

1FN9

Captura 3. Si haces clic en la imagen la verás más grande

Como puedes ver se agregó una columna para guardar en ella el Código del País, otra columna para guardar en ella el Código del Área y otra columna para guardar en ella el Número de Teléfono. Ahora sí la tabla CLIENTES_TEL cumple con la 1FN.

Ejemplo 2

1FN10

Captura 4. Si haces clic en la imagen la verás más grande

En este caso es la columna CLI_DIRECC la que no cumple con la condición 5 de la 1FN porque en ella se guardan:

  1. El nombre de la calle («Avda Colón» en el ejemplo)
  2. El número del edificio («345» en el ejemplo)
  3. El número del piso («4º» en el ejemplo)
  4. El nombre del departamento («C» en el ejemplo)

Por lo que ya viste hasta ahora seguramente sabes que la estructura correcta debería ser:

1FN11

Captura 5. Si haces clic en la imagen la verás más grande

Donde agregamos una columna para la Calle, otra columna para el Número del Edificio, otra columna para el Número del Piso y otra columna para el Nombre del Departamento.

Ahora, la pregunta es: ¿debemos ser tan estrictos en cumplir con la 1FN? ¿es un requisito indispensable que nuestra tabla separe así a las direcciones? Las respuestas están basadas en lo siguiente: si no ordenamos a la tabla CLIENTES por dirección del cliente, ni realizamos búsquedas según la dirección del cliente entonces todo esto es un trabajo innecesario, si nuestra tabla está como muestra la captura 4 entonces ya está bien, no es necesario seguir refinándola. Pero si necesitamos ordenar a la tabla por las direcciones, o si necesitamos saber cuales clientes viven en un Piso 4º entonces sí, es un requisito.

Sería el caso si estamos diseñando una Base de Datos para la Policía o para una empresa de Courier (envío de cartas y encomiendas) porque ellos sí necesitan establecer exactamente la dirección de las personas y de las organizaciones y como llegar hasta ellos lo más rápidamente posible.

Ejemplo 3

1FN12

Captura 6. Si haces clic en la imagen la verás más grande

En este caso nuestra tabla de PRODUCTOS tampoco está en la 1FN. ¿Por qué no? porque en la columna PRD_NOMBRE donde se nombra a los productos se están mezclando 3 cosas:

  1. El tipo de producto («TELEVISOR» en el ejemplo)
  2. La marca del producto («PHILIPS», «TOSHIBA» y «TOKIO» en el ejemplo)
  3. La cantidad de pulgadas del producto («20», «29» y «32» en el ejemplo)

Como son tres cosas distintas entonces deberían estar (si seguimos estrictamente la 1FN) en tres columnas distintas. Lo correcto sería tener esos datos de esta manera:

1FN13

Captura 7. Si haces clic en la imagen la verás más grande

1FN14

Captura 8. Si haces clic en la imagen la verás más grande

1FN15

Captura 9. Si haces clic en la imagen la verás más grande

1FN19

Captura 10. Si haces clic en la imagen la verás más grande

1FN16Captura 11. Si haces clic en la imagen la verás más grande

1FN17Captura 12. Si haces clic en la imagen la verás más grande

1FN18

Captura 13. Si haces clic en la imagen la verás más grande

1FN20

Captura 14. Si haces clic en la imagen la verás más grande

Y para obtener los mismos datos que la captura 6 escribiríamos:

SELECT
   P.PRD_IDENTI,
   TRIM(L.LIN_NOMBRE) || ' ' || TRIM(M.MAR_NOMBRE) || ' DE ' || TRIM(E.MED_NOMBRE) AS PRD_NOMBRE
FROM
   PRODUCTOS P
JOIN
   LINEAS L
      ON P.PRD_IDELIN = L.LIN_IDENTI
JOIN
   MARCAS M
      ON P.PRD_IDEMAR = M.MAR_IDENTI
JOIN
   MEDIDAS E
      ON P.PRD_IDEMED = E.MED_IDENTI

1FN21Captura 15. Si haces clic en la imagen la verás más grande

Conclusión:

Que todas tus tablas estén en la 1FN es algo muy bueno pues te asegura que tus aplicaciones sean robustas y confiables pero debes evaluar en cada caso si es conveniente o no ser muy estricto en su implementación. Si tienes dudas entonces … aplica la 1FN porque eso nunca puede ser malo.

Artículos relacionados:

Consideraciones a tener en cuenta al diseñar una Base de Datos

Diseño de bases de datos. 1FN

El índice del blog Firebird21