SQL Server 2008 Normalizando Bases de Datos Primera Forma Normal

Logo SQL Server 2008

Continuando con nuestros artículos sobre Normalización de Bases de Datos, continuamos esta segunda parte para conocer y explicar la Primera Forma Normal, sin más preámbulos comencemos:

PRIMERA FORMA NORMAL: No repetir grupos;
La primera forma normal establece que no se deben repetir elementos o grupos de elementos dentro de las tablas, también establece que cada una de las columnas debe ser “Atómica”, estas reglas podríamos catalogarlas así:
• Más de un valor no puede ser almacenado en ninguna celda (repetir grupos dentro de las columnas); Por ejemplo, para la columna ProductosComprados, puede incluirse solo un producto comprado, no se pueden ingresar dos productos comprados.

• Más de una columna no se debe usar para definir el mismo tipo de dato (repetir grupos a través de las columnas); Por ejemplo, Si se compra más de un producto, no puede existir dentro de la misma tabla Producto1, Producto2, Producto3, etc…

• Las columnas deben ser “Atómicas”; Los datos de una columna deben ser divididos a su más mínima expresión de valor, por ejemplo para la columna Nombre deberíamos dividirla en tres (3) columnas; PrimerNombre, Segundo Nombre, Apellido.

NO REPETIR GRUPOS DENTRO DE UNA COLUMNA:
Un grupo repetido dentro de una columna es un grupo donde más de un valor es incluido dentro de la misma columna, por ejemplo; Imaginemos que tenemos una tabla para guardar toda la información de las ventas, por cada venta que se haga se almacena el nombre del cliente, la fecha y el producto comprado.

Para darnos una idea veamos la siguiente imagen, en la cual se viola completamente la primera forma normal

Grupo Repetido dentro de columnas

Podemos observar que tenemos tres (3) columnas (Descripción, Cantidad y Precio), que poseen grupos repetidos, nuestro cliente compró dos (2) libros y la descripción de ambos libros se encuentran en la columna “Descripción”, al mismo tiempo podemos observar que las dos cantidades se encuentran en la columna “Cantidad” y lo mismo ocurre con la columna “Precio” donde encontramos el precio de ambos libros, todos estos datos se separan solamente por una simple coma (,).

Imaginemos entonces que con esta tabla quisieramos hacer la siguientes consultas:
Cantidad de Libros vendidos por autor
Catidad de Libros vendidos por tema
Cantidad de Libros vendidos por precio
Porcentaje de Ventas generadas por mes
Y paremos de contar…

Como podemos observar estas consultas son casi imposibles de hacer por la redundancia que tenemos en la data.

Ahora bien para poder cumplir con la primera forma normal, entonces deberiamos colocar un sólo dato en cada columna, en la columna descripcion colocariamos la descripcion de un solo libro, solo una cantidad en la columna cantidad y un solo precio en la columna precio. Excelente!!! Diran muchos, sin embargo el hecho de limitar los datos a un solo valor por columna no será realmente suficiente para poder solucionar el problema, y ya veremos el por qué.

NO REPETIR GRUPOS A TRAVES DE LAS COLUMNAS:
Un grupo repetido a través de columnas es un grupo donde múltiples columnas son agregadas a la tabla para introducir el mismo grupo de datos, supongamos que un desarrollador novato quiere solucionar el problema mostrado anteriormente (Grupos repetidos dentro de una columna), entonces decide que la mejor solución es agregar mas campos a la tabla para poder agregar los datos que se repiten y así solventar la situación creando la siguiente tabla…

Grupo Repetido cruzado entre columnas

Wow… Funciona!!! dirán algunos, pero este desarrollador ha cometido un error, está repitiendo grupos a través de las columnas y esto es una violación a la primera forma normal, ha creado una segunda columna para Descripción, Cantidad y Precio que las ha llamado Descripcion2, Cantidad2 y Precio2.

Esto NO FUNCIONA y TAMPOCO SOLUCIONA el problema, ya que si un cliente puede querer comprar cinco (5) productos o setenta (70) o mil (1000), no podemos añadir una cantidad suficiente de campos para los grupos repetidos y así poder solventar cualquier condición posible.

Imaginemos que tenemos un supermarket donde limitamos a los usuarios a comprar solamente dos productos por vez; «Lo sentimos señor, por favor vuelva mañana para que pueda comprar otros dos productos mas»…

… Esa no es la solución ni la manera de llevar un negocio, mucho menos es la forma de crear una Base de datos que cumpla con la primera forma normal, sin embargo una solución a esto podria ser crear dos o mas tablas relacionadas entre sí, por ejemplo:

Creamos dos tablas (Pedidos y DetallesPedidos) para las ordenes de compra realizadas por los clientes, y los grupos de repeticion los sacamos de la tabla Pedidos y los añadimos a una columna relacionada DetallesPedidos, haciendo que las dos tablas estén relacionadas en la columna IDDetallesCompra.

Primera Forma Normal Solucion

Ahora nuestra tabla DetallesPedidos tiene columnas para describir el producto, la cantidad y el precio, lo que nos permite tener tantas filas en la tabla DetallesPedidos según sea necesario ya que ésta se relaciona con la tabla Pedidos.

ATOMICO:
Los valores atómicos son valores que no pueden ser reducidos a un valor menor, eso ya lo tenemos claro, pero ahora veamos un caso sencillo, supongamos el valor NOMBRE, una columna nombre puede incluir el nombre completo de una persona, es decir primer nombre, segundo nombre y apellidos, por Ejemplo: Roberto Enrique Pozo, pero este valor NOMBRE no es «atómico», porque el nombre no está reducido a sus valores significativos mas pequeños.

Para un nombre los valores significativos mas pequeños serían el primer nombre, el segundo nombre o la inicial del segundo nombre y el apellido, entonces para dividir un nombre dentro de sus valores atómicos más pequeños simplemente lo dividimos en tres (3) columnas una para el primer nombre, una para el segundo nombre o la inicial y una para el apellido.

Ahora muchos se preguntarán:
¿Si aplicamos este concepto de la primera forma normal, los valores dentro de una columna no se pueden dividir a un valor menor?

La respuesta que muchos dirán es SI, sin embargo deberíamos crear una columna para cada letra del alfabeto y esto sería realmente ridículo hacerlo, por eso la mejor opción es crear como se menciona arriba, una columna para el nombre, una columna para la INICAL del segundo nombre (Acá si reducimos a la mas mínima expresión esta columna – Queda «Atómica» ya que solo tendrá una letra),y, una columna para el apellido.

Las columnas con valores atómicos hacen mas sencillo crear consultas basadas en atributos individuales de nombres, por ejemplo podemos hacer búsquedas sencillas basadas en el primer nombre o en el apellido y tambien es mucho más fácil crear consultas que se puedan ordenar alfabeticamente ya sea por el primer nombre o por el apellido.

Con esta última observación acerca de las columnas atómicas, terminamos el tema de la Primera Forma Normal.

Como siempre ante cualquier duda comuníquense y con gusto se las aclararé.

Saludos!
Roberto Pozo

Etiquetas: , , , , ,

3 respuestas to “SQL Server 2008 Normalizando Bases de Datos Primera Forma Normal”

  1. SQL Server 2008 Normalizando Bases de Datos Primera Forma Normal « DbRunas – Noticias y Recursos sobre Bases de Datos Says:

    […] https://angaroasoft.wordpress.com/2011/07/09/sql-server-2008-normalizando-bases-de-datos-primera-form… July 14, 2011   //   MsSQL   //   No Comments   //   […]

    Me gusta

  2. luis Says:

    gracias por la informacion, esta muy claro, sigue asi.

    Me gusta

Deja un comentario