{"id":172,"date":"2015-11-04T17:31:16","date_gmt":"2015-11-04T23:31:16","guid":{"rendered":"http:\/\/naps.com.mx\/blog\/?p=172"},"modified":"2017-11-16T12:15:52","modified_gmt":"2017-11-16T18:15:52","slug":"segunda-forma-normal-en-el-modelo-relacional-2fn","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/segunda-forma-normal-en-el-modelo-relacional-2fn\/","title":{"rendered":"Segunda forma normal en el modelo relacional (2FN)"},"content":{"rendered":"<p>Las formas normales nos permiten dise\u00f1ar adecuadamente una Base de Datos, lo que nos garantiza un correcto funcionamiento en el almacenamiento y recuperaci\u00f3n de la informaci\u00f3n. Ahora nos corresponde analizar la <strong>Segunda Forma Normal<\/strong>.<\/p>\n<p><!--more--><\/p>\n<p>Repasando un poco, recordemos que llamamos Relaci\u00f3n a una tabla en la que podemos almacenar datos. Dicho esto, definimos la Segunda Forma Normal de esta manera:<\/p>\n<blockquote><p>\u201cUna relaci\u00f3n se encuentra en segunda forma normal si, y solo si, se encuentra en 1FN y si todos los atributos no clave dependen por completo de la clave\u201d (Reynosa E., Maldonado C., Mu\u00f1oz R., Damiano L., Abrutsky M, 2012).<\/p><\/blockquote>\n<p><a href=\"http:\/\/naps.com.mx\/blog\/ejemplos-de-primera-forma-normal-del-modelo-relacional\/\">En el art\u00edculo anterior comentamos la Primera Forma Normal<\/a>. (1FN). Y una relaci\u00f3n 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 <strong><em>todos<\/em><\/strong> aquellos que no forman parte de la clave primaria, y <strong><em>ninguno<\/em><\/strong> de ellos depender\u00e1 de una <strong><em>parte<\/em><\/strong> de la clave primaria.<\/p>\n<p>Veamos una de las relaciones que normalizamos en el art\u00edculo anterior. La relaci\u00f3n que ahora llamaremos Detalle de Factura qued\u00f3 de la siguiente forma:<\/p>\n<table>\n<tbody>\n<tr>\n<td colspan=\"7\" width=\"383\">Detalle de Factura<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" width=\"162\">PK<\/td>\n<td width=\"55\"><\/td>\n<td width=\"58\"><\/td>\n<td width=\"53\"><\/td>\n<td width=\"55\"><\/td>\n<\/tr>\n<tr>\n<td width=\"55\">Sucursal<\/td>\n<td width=\"55\">N\u00famero de factura<\/td>\n<td width=\"52\">C\u00f3digo de art\u00edculo<\/td>\n<td width=\"55\">Nombre de art\u00edculo<\/td>\n<td width=\"58\">Cantidad del art\u00edculo<\/td>\n<td width=\"53\">Precio unitario del art\u00edculo<\/td>\n<td width=\"55\">Subtotal del art\u00edculo<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">01<\/td>\n<td width=\"55\">CAMISA<\/td>\n<td width=\"58\">2<\/td>\n<td width=\"53\">50<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">02<\/td>\n<td width=\"55\">ZAPATOS<\/td>\n<td width=\"58\">3<\/td>\n<td width=\"53\">80<\/td>\n<td width=\"55\">240<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">05<\/td>\n<td width=\"55\">MESA<\/td>\n<td width=\"58\">1<\/td>\n<td width=\"53\">100<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">101<\/td>\n<td width=\"52\">09<\/td>\n<td width=\"55\">TINTA<\/td>\n<td width=\"58\">4<\/td>\n<td width=\"53\">25<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">02<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">13<\/td>\n<td width=\"55\">CUADRO<\/td>\n<td width=\"58\">5<\/td>\n<td width=\"53\">90<\/td>\n<td width=\"55\">450<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">02<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">05<\/td>\n<td width=\"55\">MESA<\/td>\n<td width=\"58\">1<\/td>\n<td width=\"53\">100<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" width=\"110\">Fk<\/td>\n<td width=\"52\"><\/td>\n<td width=\"55\"><\/td>\n<td width=\"58\"><\/td>\n<td width=\"53\"><\/td>\n<td width=\"55\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Podemos afirmar que NO se encuentra en 2FN. \u00bfPor qu\u00e9? Observe el atributo (columna) <em>Nombre de art\u00edculo<\/em>. Depende directamente del atributo <em>C\u00f3digo de art\u00edculo<\/em> que a su vez es parte de la Clave Primaria (PK). Lo mismo ocurre con <em>Precio unitario del art\u00edculo.<\/em> Decimos que depende de \u201cC\u00f3digo\u201d porque si cambiara \u201cC\u00f3digo\u201d, necesariamente tendr\u00eda que cambiar el nombre de art\u00edculo y su precio.<\/p>\n<h3><strong>Transformaci\u00f3n a 2FN<\/strong><\/h3>\n<p>Para resolver la situaci\u00f3n anterior descompondremos la relaci\u00f3n Detalle de Factura en 2 relaciones que se llamar\u00e1n: Detalle de Factura (mantiene su nombre) y Art\u00edculos. En otras palabras, estamos sacando los atributos de art\u00edculo a una tabla nueva, que tendr\u00eda la siguiente forma:<\/p>\n<table>\n<tbody>\n<tr>\n<td colspan=\"3\" width=\"160\">Art\u00edculos<\/td>\n<\/tr>\n<tr>\n<td width=\"52\">PK<\/td>\n<td width=\"55\"><\/td>\n<td width=\"53\"><\/td>\n<\/tr>\n<tr>\n<td width=\"52\">C\u00f3digo de art\u00edculo<\/td>\n<td width=\"55\">Nombre de art\u00edculo<\/td>\n<td width=\"53\">Precio unitario del art\u00edculo<\/td>\n<\/tr>\n<tr>\n<td width=\"52\">01<\/td>\n<td width=\"55\">CAMISA<\/td>\n<td width=\"53\">50<\/td>\n<\/tr>\n<tr>\n<td width=\"52\">02<\/td>\n<td width=\"55\">ZAPATOS<\/td>\n<td width=\"53\">80<\/td>\n<\/tr>\n<tr>\n<td width=\"52\">05<\/td>\n<td width=\"55\">MESA<\/td>\n<td width=\"53\">100<\/td>\n<\/tr>\n<tr>\n<td width=\"52\">09<\/td>\n<td width=\"55\">TINTA<\/td>\n<td width=\"53\">25<\/td>\n<\/tr>\n<tr>\n<td width=\"52\">13<\/td>\n<td width=\"55\">CUADRO<\/td>\n<td width=\"53\">90<\/td>\n<\/tr>\n<tr>\n<td width=\"52\">05<\/td>\n<td width=\"55\">MESA<\/td>\n<td width=\"53\">100<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Por lo que la relaci\u00f3n Detalle de Factura quedar\u00eda de esta manera:<\/p>\n<table>\n<tbody>\n<tr>\n<td colspan=\"6\" width=\"328\">Detalle de Factura<\/td>\n<\/tr>\n<tr>\n<td colspan=\"3\" width=\"162\">PK<\/td>\n<td width=\"58\"><\/td>\n<td width=\"53\"><\/td>\n<td width=\"55\"><\/td>\n<\/tr>\n<tr>\n<td width=\"55\">Sucursal<\/td>\n<td width=\"55\">N\u00famero de factura<\/td>\n<td width=\"52\">C\u00f3digo de art\u00edculo<\/td>\n<td width=\"58\">Cantidad del art\u00edculo<\/td>\n<td width=\"53\">Precio unitario del art\u00edculo<\/td>\n<td width=\"55\">Subtotal del art\u00edculo<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">01<\/td>\n<td width=\"58\">2<\/td>\n<td width=\"53\">50<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">02<\/td>\n<td width=\"58\">3<\/td>\n<td width=\"53\">80<\/td>\n<td width=\"55\">240<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">05<\/td>\n<td width=\"58\">1<\/td>\n<td width=\"53\">100<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">01<\/td>\n<td width=\"55\">101<\/td>\n<td width=\"52\">09<\/td>\n<td width=\"58\">4<\/td>\n<td width=\"53\">25<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">02<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">13<\/td>\n<td width=\"58\">5<\/td>\n<td width=\"53\">90<\/td>\n<td width=\"55\">450<\/td>\n<\/tr>\n<tr>\n<td width=\"55\">02<\/td>\n<td width=\"55\">100<\/td>\n<td width=\"52\">05<\/td>\n<td width=\"58\">1<\/td>\n<td width=\"53\">100<\/td>\n<td width=\"55\">100<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" width=\"110\">Fk<\/td>\n<td width=\"52\">Fk<\/td>\n<td width=\"58\"><\/td>\n<td width=\"53\"><\/td>\n<td width=\"55\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Observemos lo siguiente: Ahora el atributo<em> C\u00f3digo de art\u00edculo<\/em> es una clave for\u00e1nea hacia la relaci\u00f3n Art\u00edculos. Tambi\u00e9n observemos que se mantiene el atributo <em>Precio<\/em>, y esto es as\u00ed porque realmente son dos datos: el precio del art\u00edculo en la tabla Art\u00edculos representa el precio <em>actual<\/em> del art\u00edculo, mientras que el precio en la tabla Detalle de Factura representa el precio <em>al momento de la venta<\/em> del art\u00edculo.<\/p>\n<p>En resumen: <strong>La 2FN se utiliza para eliminar las dependencias parciales<\/strong> (Oppel A., 2010). Cuando encontremos una violaci\u00f3n a la 2FN debemos mover los atributos que son parcialmente dependientes a una nueva relaci\u00f3n donde ese atributo dependa completamente de la clave primaria.<\/p>\n<p>Normalizar nuestras tablas a 2FN nos permitir\u00e1 eliminar cualquier anomal\u00eda que pudiera existir en una relaci\u00f3n, lo que se traduce en Bases de Datos muy bien organizadas.<\/p>\n<p>&nbsp;<\/p>\n<p>Referencias<\/p>\n<ol>\n<li>Oppel A. (2010). <strong>Fundamentos de Bases de Datos<\/strong>. Ed. McGraw-Hill. M\u00e9xico.<\/li>\n<li>Reynosa E., Maldonado C., Mu\u00f1oz R., Damiano L., Abrutsky M. (2012). <strong>Bases de datos<\/strong>. Ed. Alfaomega.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Las formas normales nos permiten dise\u00f1ar adecuadamente una Base de Datos, lo que nos garantiza un correcto funcionamiento en el almacenamiento y recuperaci\u00f3n de la informaci\u00f3n. Ahora nos corresponde analizar la Segunda Forma Normal.<\/p>\n","protected":false},"author":1,"featured_media":177,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[49],"tags":[78,79,70],"class_list":["post-172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bases-de-datos","tag-2fn","tag-formas-normales","tag-normalizacion"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=172"}],"version-history":[{"count":3,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/172\/revisions"}],"predecessor-version":[{"id":175,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/172\/revisions\/175"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media\/177"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}