{"id":1044,"date":"2024-07-31T10:16:53","date_gmt":"2024-07-31T08:16:53","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=1044"},"modified":"2024-07-31T10:16:53","modified_gmt":"2024-07-31T08:16:53","slug":"12-normalizacion-de-bds","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/databases\/diseno-de-bases-de-datos\/12-normalizacion-de-bds\/","title":{"rendered":"12. Normalizaci\u00f3n de BDs"},"content":{"rendered":"\n<p>La <strong>normalizaci\u00f3n de bases de datos<\/strong> es uno de los aspectos m\u00e1s importantes que se deben hacer a la hora de dise\u00f1ar <strong>bases de datos.<\/strong> La <strong>normalizaci\u00f3n<\/strong> es un proceso que se utiliza para organizar y optimizar la <strong>estructura de la base de datos<\/strong>, para asegurar su <strong>integridad,<\/strong> evitar <strong>redundancia<\/strong> y mejorar el <strong>rendimiento.<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Consiste en la divisi\u00f3n de las <strong>entidades<\/strong> en varias <strong>entidades<\/strong> mas peque\u00f1as, y relacionar unas con otras mediante las <strong>llaves for\u00e1neas.<\/strong> Se realiza a trav\u00e9s de varias etapas o niveles que se conocen como las <strong>formas normales<\/strong>. Muchos autores comentan que las principales son las 3 primeras <strong>formas normales,<\/strong> y existen otros dos niveles m\u00e1s.<\/p>\n\n\n\n<p>El objetivo de la <strong>normalizaci\u00f3n<\/strong> es <strong>reducir la redundancia<\/strong> y <strong>garantizar la integridad de los datos<\/strong>, asegurando que cada dato se almacene en un s\u00f3lo lugar, es decir, <strong>evitar duplicados<\/strong>, por lo que nuestros datos van a tener mayor <strong>consistencia<\/strong> y <strong>coherencia,<\/strong> dando lugar a la <strong>mejora del rendimiento<\/strong> ya que al tener nuestra <strong>base de datos<\/strong> optimizada se va a reducir el tama\u00f1o de peso y la complejidad entre las <strong>entidades.<\/strong> Si por ejm tenemos una <strong>entidad<\/strong> muy grande, es mas complejo hacer operaciones sobre ella, ya que tiene muchas cuestiones a optimizar que tener peque\u00f1os fragmentos.<\/p>\n\n\n\n<p>En resumen, tener muchas <strong>tablas<\/strong> pero de peque\u00f1o tama\u00f1o, que solo se preocupen por almacenar un dato en cuesti\u00f3n, o un conjunto de datos que hagan referencia a una sola <strong>entidad,<\/strong> es decir, no mezclar <strong>entidades.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Formas normales<\/h2>\n\n\n\n<p>Las <strong>formas normales<\/strong> es el est\u00e1ndar de la organizaci\u00f3n y del <strong>modelado de datos<\/strong> en una <strong>base de datos relacional<\/strong>, es un concepto exclusivo de <strong>modelos relacionales<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La <strong>primera forma normal<\/strong> nos dice que <strong><em>cada atributo de una entidad debe contener un s\u00f3lo valor at\u00f3mico<\/em><\/strong>, es decir, <strong>los valores deben ser indivisibles<\/strong>, no pueden ser divididos en atributos m\u00e1s peque\u00f1os. Por ejm, una direcci\u00f3n incluye calle, n\u00famero, portal, c\u00f3digo postal, entonces esta primera <strong>forma normal<\/strong> la podemos hacer partiendo la direcci\u00f3n en los campos que estamos viendo (calle, n\u00famero, portal&#8230;).<\/li>\n\n\n\n<li>La <strong>segunda forma normal<\/strong> nos dice que, adem\u00e1s de cumplir la primera forma normal, <strong><em>cada atributo no dependiente funcionalmente de la llave principal debe estar en una entidad separada<\/em><\/strong>. Un ejm, en un <em>sistema de gesti\u00f3n escolar<\/em>, tenemos en la <strong>entidad<\/strong> persona el nombre, apellidos, tlfo&#8230; y tenemos un campo donde tenemos el perfil (profesor, estudiante&#8230;), si este segundo campo tiene m\u00e1s de 5 valores, lo que conviene es crear una <strong>entidad<\/strong> denominada por ejm, perfiles, y en esta <strong>entidad<\/strong> incluir todos los perfiles (profesor, estudiante, mantenimiento, seguridad&#8230;).<\/li>\n\n\n\n<li>La <strong>tercera forma normal<\/strong> dice que, adem\u00e1s de cumplir con las dos <strong>formas normales<\/strong> anteriores, <strong><em>todas las dependencias funcionales deben ser eliminadas<\/em><\/strong>, es decir, <strong><em>no deben existir dependencias funcionales transitorias<\/em><\/strong>. Por ejm, imaginemos que en un sistema de ventas tenemos en un Excel los datos del cliente, los de la venta y los del producto, tenemos 3 grandes <strong>entidades<\/strong> en una gran <strong>entidad,<\/strong> por lo que hay que separar estos niveles.<\/li>\n\n\n\n<li>La <strong>cuarta forma normal<\/strong>, que algunos autores la llaman la <strong>forma normal de Boyce-Codd<\/strong>, mas rigurosa que las anteriores, y nos dice que <strong><em>cada dependencia funcional sea una clave candidata \u00fanica<\/em><\/strong>. Significa que nuestras <strong>entidades<\/strong> deben estar perfectamente optimizadas.<\/li>\n\n\n\n<li>La <strong>quinta forma normal<\/strong>, denominada tambi\u00e9n <strong>forma normal de clave-valor<\/strong>, o <strong>dominio clave<\/strong>, en ella se garantiza que <strong><em>no haya dependencias m\u00faltiples de conjuntos de entidades<\/em><\/strong>, lo que significa que cada <strong>entidad<\/strong> tenga los elementos que directamente dependen de \u00e9l.<\/li>\n<\/ul>\n\n\n\n<p>Dependiendo de la complejidad que tenga nuestra <strong>base de datos<\/strong>, debemos cumplir o no estas 5 <strong>formas normales<\/strong>. Puede ser que lleguemos a la <strong>segunda forma normal<\/strong> si estamos hablando de 3 o 4 <strong>entidades,<\/strong> a veces podemos llegar a la tercera, que es lo ideal. La cuarta y quinta <strong>forma normal<\/strong> ya es en modelos m\u00e1s complejos.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota:<\/strong> Lo natural es llegar hasta la <strong>tercera forma normal<\/strong> en sistemas muy complejos.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Pasos del modelado de datos<\/h2>\n\n\n\n<p>Este es un resumen de los pasos que debemos seguir a la hora de modelar nuestra <strong>base de datos<\/strong>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Identificar las entidades del sistema<\/li>\n\n\n\n<li>Identificar los atributos de las entidades<\/li>\n\n\n\n<li>Identificar las llaves primarias y for\u00e1neas<\/li>\n\n\n\n<li>Asignar una nomenclatura adecuada a las entidades y sus atributos<\/li>\n\n\n\n<li>Identificar las entidades pivote del sistema<\/li>\n\n\n\n<li>Identificar los cat\u00e1logos del sistema<\/li>\n\n\n\n<li>Identificar los tipos de relaciones del sistema<\/li>\n\n\n\n<li>Crea el modelo Entidad-Relaci\u00f3n del sistema<\/li>\n\n\n\n<li>Crear el modelo relacional de la base de datos del sistema<\/li>\n\n\n\n<li>Identificar los tipos de datos de los atributos de las entidades del sistema<\/li>\n\n\n\n<li>Identificar los atributos que puedan ser \u00fanicos en el sistema<\/li>\n\n\n\n<li>Identificar las reglas de negocio (Operaciones CRUD) del sistema<\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota:<\/strong> en las bases de datos se suele utilizar la sintaxis <strong>snake_case.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">En conclusi\u00f3n<\/h2>\n\n\n\n<p>Es importante tener un equilibrio entre la <strong>integridad de los datos<\/strong> y la <strong>eficiencia en el modelo de datos<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejm<\/h2>\n\n\n\n<p>Veamos el modelado de una base de datos escrito con sintaxis markdown.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota:<\/strong> para la creaci\u00f3n del <strong>modelo Entidad-Relaci\u00f3n<\/strong> podemos usar una herramienta online, cuya URL es <a href=\"https:\/\/diagram.net\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/diagram.net<\/a>, tambi\u00e9n la URL <a href=\"https:\/\/www.drawio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.drawio.com\/<\/a>, o un software como <strong>Microsoft Visio<\/strong> o similares.<\/p>\n<\/blockquote>\n\n\n\n<p>Sintaxis del archivo <em>Carreras_LogicaNegocio.md.<\/em><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Carreras\n\n## Listado de Entidades\n\n### carreras (ED - Entidad de datos)\n\n- carrera_id **(PK)**\n- nombre\n- tipo_carrera **(FK)**\n- fecha\n- tiempo\n- mejor_tiempo\n- altitud\n- lugar\n- pais **(FK)**\n- foto\n\n### tipos_carreras (EC - Entidad cat\u00e1logo)\n\n- tipo_carrera_id **(PK)**\n- descripcion\n- distancia **(UQ)**\n\n### paises (EC - Entidad cat\u00e1logo)\n\n- pais_id **(PK)**\n- nombre\n\n## Relaciones\n\n1. Una **carrera** _pertenece_ a un **tipo de carrera** (_1 a 1_)\n1. Una **carrera** se _corre_ en un **pa\u00eds** (_1 a 1_)\n\n## Diagramas\n\n### Modelo Entidad - Relaci\u00f3n\n\n![Modelo Entidad - Relaci\u00f3n](.modeloentrel.png)\n\n### Modelos relacional de la BD\n\n![Modelo Relacional BD](.\/modelorelacionas.png)\n\n## Reglas de negocio\n\n### carreras\n\n1. Crear el registro de una carrera\n1. Leer el registro de una(s) carrera(s) dada una condici\u00f3n en particular\n1. Leer todos los registros de la entidad carreras\n1. Actualizar los datos de una carrera dada una condici\u00f3n en particular\n1. Eliminar los datos de una carrera dada una condici\u00f3n en particular\n\n### tipos_carreras\n\n1. Todas las distancias est\u00e1n expresadas en kms y no se pueden repetir\n1. Crear el registro de un tipo de carrera\n1. Leer el registro de un o unos tipos de carrera dada una condici\u00f3n en particular\n1. Leer todos los registros de la entidad tipos_carreras\n1. Actualizar los datos de un tipo de carrera dada una condici\u00f3n en particular\n1. Eliminar los datos de un tipo de carrera dada una condici\u00f3n en particular\n\n### paises\n\n1. Crear el registro de un pa\u00eds\n1. Leer el registro de un o unos pa\u00edses dada una condici\u00f3n en particular\n1. Leer todos los registros de la entidad paises\n1. Actualizar los datos de un pa\u00eds dada una condici\u00f3n en particular\n1. Eliminar los datos de un pa\u00eds dada una condici\u00f3n en particular<\/pre>\n\n\n\n<p>Sintaxis del archivo <em>ModeladoDatos.md.<\/em><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Modelado de Datos<br><br>1. Identificar las Entidades del sistema<br>1. Identificar los atributos de las entidades<br>1. Identificar las llaves primarias y for\u00e1neas<br>1. Asignar una nomenclatura adecuada a las entidades y sus atributos<br>1. Identificar las entidades pivote del sistema<br>1. identificar los cat\u00e1logos del sistema<br>1. Identificar los tipos de relaciones del sistema<br>1. Crear el modelo Entidad-Relaci\u00f3n del sistema<br>1. Crear el Modelo Relacional de la base de datos del sistema<br>1. Identificar los tipos de datos de los atributos de las entidades del sistema<br>1. Identificar los atributos que puedan ser \u00fanicos en el sistema<br>1. Identificar las reglas de negocio (Operaciones _CRUD_) del sistema<br><br>## Glosario<br>**PK**: _Primery Key_<br>**FK**: _Foreign Key_<br>**UQ**: _Campo \u00fanico (Unique attribute)_<br>**ED**: _Entidad de datos_<br>**EP**: _Entidad pivote_<br>**EC**: _Entidad cat\u00e1logo_<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>La normalizaci\u00f3n de bases de datos es uno de los aspectos m\u00e1s importantes que se deben hacer a la hora [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1009,"menu_order":11,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1044","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"La normalizaci\u00f3n de bases de datos es uno de los aspectos m\u00e1s importantes que se deben hacer a la hora [&hellip;]","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1044","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1044"}],"version-history":[{"count":2,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1044\/revisions"}],"predecessor-version":[{"id":1046,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1044\/revisions\/1046"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1009"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1044"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}