Full transcript
Introducción
0:00Hola gente, ¿cómo andan? Espero que muy
0:02bien. Yo con frío, ya verán por mis
0:04guantes, típico de eh persona
0:06informática. Tengo que tener los dedos
0:07para poder teclar, pero acá aguantando
0:10el frío. Como pueden ver en el título
0:11del video, van a ver que vamos a
0:13trabajar hoy con un tema que me pidieron
0:15muchísimo ustedes, que es el de
0:17normalización de base de datos. Es un
0:19tema que me pidieron muchísimo y que en
0:21el actual curso que les voy a dejar acá
0:23de introducción a las bases de datos que
0:25tenemos en la academia, que lo grabé
0:26hace varios años, no está tenido en
0:29cuenta. Por lo cual dije, "Okay, hago un
0:32video nuevo, un video exclusivo para que
0:33ustedes puedan tener este tema y además
0:36para que se acuerden que estamos
0:37haciendo un remasterizado de ese curso
0:39original con nueva calidad, nuevos
0:41ejercicios, algunos temas extras y demás
0:43que va a estar dentro de poco acá en
0:45YouTube y también subido a la academia
0:48luego que ahora sí va a tener este tema
0:50también de normalización muy pedido por
0:53ustedes. No vamos a dar muchas vueltas
0:54ya en la explicación y vamos a ir
0:56derecho a lo que es el contenido teórico
0:58práctico, porque esta va a ser una
0:59master class. Vamos a dar todo lo que
1:03corresponde a la clase desde la forma
1:05cero normal cuando tenemos una base de
1:07datos no normalizada hasta la tercera y
1:10luego cuarta y demás formas normales que
1:12les voy a explicar en qué situaciones
1:14conviene utilizarlas o no. Así que sin
1:16dar más vueltas, si les gusta este
1:17contenido, no se olviden de darle a me
1:19gusta, suscribirse, darle click a la
1:20campanita y compartirlo con quien crea
1:23que les pueda servir. Vamos a eso, mi
¿Qué es la normalización?
1:25gente. Arrancamos entonces con lo que es
1:26el concepto de normalización. Si es la
1:28primera vez que están escuchando este
1:30concepto, no se asusten que les voy a
1:31explicar desde cero, ¿okay? Básicamente
1:34es un proceso que se hace dentro de la
1:36informática en el campo de las bases de
1:38datos cuando estamos diseñando, es
1:40decir, cuando estamos planificando bases
1:42de datos relacionales. Lo que busca la
1:45normalización son tres puntos
1:48principales, que son los tres que pueden
1:50ver acá, que son eliminar la redundancia
1:52de datos, es decir, evitar que haya
1:54datos repetidos, que los datos estén en
1:56lo posible una sola vez y de forma
1:59accesible y fácil. Sí, evitar anomalías,
2:02es decir, cosas que no correspondan o
2:05que puedan ser confusas o que dupliquen
2:07datos y demás. Cuando hacemos
2:09inserciones, es decir, altas
2:11actualizaciones, es decir,
2:12modificaciones o eliminaciones de datos
2:14en la base de datos. Y lo que busca es
2:16garantizar la integridad de los datos.
2:19¿Qué significa que los datos sean
2:20íntegros? que tengan sentido, ¿no? Que
2:23por ejemplo tenga guardado dos veces a
2:25una misma persona y que en un lugar diga
2:27que tiene 40 años y en otro lado diga
2:29que tenga 35. Eso no cumple la
2:31integridad de datos. Sí, además de que
2:33tengo datos duplicados, no son íntegros,
2:36ya que me dan información diferente. Por
2:38decir un ejemplo de varios que pueden
Formas Normales
2:40darse. Vamos a arrancar entonces, gente,
2:41con las formas normales. Primero y
2:44principal vamos a suponer, lo voy a
2:45explicar con un ejemplo práctico, ¿okay?
2:47Y vamos a arrancar con la cero forma
2:50normal o forma normal cero, lo pueden
2:53decir de cualquiera de las dos formas,
2:55donde tenemos una tabla en cuestión que
2:58no está para nada normalizada, es decir,
3:00puede tener datos repetidos, puede
3:02entrar un montón de cuestiones que van a
3:04hacer que justamente nosotros tengamos
3:06que optimizar nuestra tabla. Fíjense en
3:09esta que tenemos, tenemos una ID
3:10empleado, tenemos tres empleados,
3:12tenemos departamentos y tenemos idiomas.
3:15Fíjense, ya haciendo un análisis rápido
3:18de esta tabla que tenemos acá, ya
3:20podemos ver cosas que hm pueden llegar a
3:23ser duplicadas. Por ejemplo, vemos que
3:25los idiomas ya están duplicados en
3:27varias ocasiones, ¿no? Fíjense, al mismo
3:30tiempo vemos que los idiomas son listas,
3:32cuándo tranquilamente podríamos
3:34asociarlos en otra tabla, tener una
3:37tabla exclusiva de idiomas y demás
3:38cuestiones. Y lo mismo pasa con los
3:41departamentos. ¿Qué pasa si después
3:43llega un nuevo empleado y también es de
3:44marketing o de recursos humanos de
3:46sistemas? Voy a tener datos duplicados.
3:49Entonces ahí ya cuando empezamos a
3:50analizar podemos ver de que podemos ir
3:53mejorando esta tabla. Entonces si nos
1era Forma Normal (1FN)
3:55damos cuenta de eso, podemos ir a la
3:57primera forma normal. La primera forma
4:00normal, como les conté recién, busca que
4:02los atributos, es decir, cada uno de los
4:04campos de las tablas de mi base de datos
4:06sean atómicos y que no sean repetidos o
4:10multivaluados. Es decir, que tengan un
4:12solo valor, ¿si? Y que no pueda ser este
4:15valor repetido. ¿Okay? Esto establece de
4:18que no tienen que haber listas ni
4:20conjuntos como valores. ¿Qué pasaba en
4:22la cero forma normal? Fíjense,
4:24inglés, francés, esto es una lista. Acá
4:27tenemos inglés solo, pero acá tenemos
4:28alemán, inglés, portugués. Son listas de
4:31datos. Entonces, la primera forma normal
4:33lo que busca es la atomicidad. lo que
4:35busca es hacer ahora que en nuestra
4:38tabla haya un solo valor, en este caso,
4:41por ejemplo, de idioma. Pero, ¿qué va a
4:43pasar acá? Si aplicamos la primera forma
4:45normal y separamos, vamos a tener Ana
4:48Gómez de recursos humanos, que sabe
4:50inglés, pero después vamos a tener de
4:52vuelta a Ana Gómez de recursos humanos,
4:54que sabe francés. Después tenemos a Juan
4:57Pérez, que sabe inglés y después tenemos
4:58a Laura Díaz tres veces porque sabe tres
5:02idiomas: alemán, inglés y portugués.
5:04Fíjense que acá estaba todo ordenadito,
5:07pero teníamos un montón de datos
5:09acumulados en una sola columna, los
5:11idiomas, en forma de lista. Sí. Acá lo
5:14que hicimos fue separarlo, que es la
5:15primera forma normal, pero seguimos
5:18teniendo redundancia de datos. Entonces,
5:20¿qué pasa? ¿Cuáles son los problemas?
5:22Tenemos la redundancia tanto en el
5:25nombre de la persona como en el
5:27departamento al que pertenece. están
5:29duplicados y hasta triplicados en este
5:31caso. Entonces esto hace de que tengamos
5:34una escalabilidad limitada, es decir,
5:36que no pueda seguir creciendo nuestra
5:38tabla, porque si llegamos a agregar un
5:41nuevo empleado que sabe cinco idiomas,
5:42que vamos a tener cinco registros nuevos
5:44y esto no es para nada eficiente. Y es
5:47ahí donde tenemos que pasar a la segunda
5:49forma normal. Bien, gente, la segunda
5:51forma normal, lo primero que tenemos que
5:53tener en cuenta es que se pueda aplicar
5:55solo si ya aplicamos anteriormente a la
5:57tabla en cuestión con la que estamos
5:59trabajando, la primera forma normal, es
6:02decir, ya tiene que estar normalizada al
6:04primer nivel. Si no podemos eh
6:07establecer la segunda forma normal si
6:09todavía no establecimos la primera.
6:11¿Okay? ¿Qué busca la segunda forma
6:14normal? En este caso, fíjese que lo que
6:17hace es exigir que todos los atributos
6:21dependia,
6:24no de parte ello. ¿Qué pasaba? ¿Se
6:26acuerdan que miren el caso anterior,
6:29nuestra clave primaria, ¿qué pasaba?
6:30teníamos dos clave primaria uno con
6:33distintos valores. Después teníamos la
6:35clave primaria tres tres veces y con
2da Forma Normal (2FN)
6:38distintos valores. Lo que dice la
6:39segunda forma normal es, okay, busca la
6:42forma de que la clave primaria sí no se
6:47duplique. Entonces, lo que busca es
6:48eliminar dependencias parciales si la
6:50clave es compuesta. La clave es
6:52compuesta cuando sucede esto que les
6:53acabo de contar. Entonces, ¿qué pasa con
6:56esto? Si nosotros tenemos lo que más se
6:59repite son los idiomas y los
7:01departamentos, nosotros podemos decir,
7:03"Epa, acá tengo una posibilidad de
7:06dividir en tablas diferentes." Entonces,
7:08por ejemplo, idioma, yo lo puedo sacar
7:11en una nueva tabla y es lo que hacemos
7:13en esta segunda forma normal. Entonces,
7:15lo que yo tengo o puedo hacer es
7:18mantener todo prolijo y hermoso en mi
7:21tabla original de empleados con cada uno
7:24de los nombres, sin duplicar con su
7:26departamento y crear una nueva tabla que
7:30lo que mantenga sean cada una de las IDs
7:33de los empleados y los idiomas que saben
7:37cada uno. Entonces, de esa manera,
7:39fíjense que mi tabla empleados cumple
7:42con la segunda forma normal. Sin
7:44embargo, ojo con esta segunda tabla que
7:47creamos. Sí, estamos enfocados en que
7:49normalizamos esta tabla, pero después
7:53vamos a ver que hay oportunidad de
7:54mejora en las tablas nuevas que creamos
7:56a partir de la normalización. Entonces,
7:58por ejemplo, si yo quiero saber qué
8:00idioma sabe Ana Gómez, yo vengo a la
8:02tabla de idiomas y digo, "Okay, Ana
8:04Gómez sabe inglés y francés." Y después
8:06digo, "¿Qué idioma sabe Laura Díaz?
8:08¿Sabe alemán, inglés y portugués?" Sin
8:10embargo, ojo que acá sigue habiendo
8:13redundancia de datos, que ya vamos a ver
8:15un detalle eso, ¿okay? ¿Qué mejoras
8:18implementamos acá? Eliminamos la
8:20duplicación, ¿sí?, de nombres y
8:22departamentos. Ya los departamentos no
8:24se duplican, ¿sí? Y tampoco se duplican
8:28los nombres de un golazo. Pero, ¿cuáles
8:30son los problemas que tenemos ahora? que
8:33hay una dependencia transitiva
8:36en el nombre del departamento y el
8:39nombre del departamento no tiene que
8:42depender directamente de la clave
8:44empleado. Eso es justamente una
8:47dependencia transitiva. Les explico
8:48ahora en mayor detalle. Una dependencia
¿Qué es una dependencia transitiva?
8:51transitiva, gente, establece en
8:53matemáticas, por ejemplo, que si yo
8:55tengo una relación entre una A y una B y
8:59una B también se relaciona con una C, la
9:02dependencia transitiva dice, "Okay, si A
9:04es B y B es C, entonces automáticamente
9:06A también puede ser C." ¿Sí? Esto en
9:09base de datos se podría decir como que
9:12si un atributo determina a otro
9:15atributo, ¿sí? y ese otro atributo
9:18determina un tercero, en este caso un C,
9:21entonces yo puedo decir que el atributo
9:23A determina el C de manera indirecta.
9:25Eso es una dependencia transitiva. En
9:28nuestro ejemplo, ¿qué es lo que daría?
9:30diría esto, que el ID empleado está
9:32asociado al departamento. Sí, yo voy a
9:35tener ID empleado uno asociado al
9:37departamento recursos humanos, por lo
9:39cual yo automáticamente puedo decir,
9:41"Okay, el departamento está asociado al
9:45nombre del departamento." O sea, mi
9:47campo departamento está asociado al
9:49nombre del departamento, por lo cual yo
9:51tranquilamente puedo decir, "Okay, la ID
9:53del empleado está asociado al nombre del
9:55departamento." Sin embargo, sin embargo,
9:58si yo agrego una nueva persona acá abajo
10:01y también es de recursos humanos, se
10:03rompe esto. ¿Por qué? Porque voy a tener
10:06una ID4 y también voy a tener recursos
10:08humanos, lo cual no tiene una no debería
10:12de tener una dependencia. El nombre del
10:14departamento no tiene que depender de la
10:16ID del empleado. Son dos cosas que no
10:18tienen nada que ver una con la otra.
10:21Entonces, lo que nosotros podemos darnos
10:23cuenta acá es que no se cumple la
10:25tercera forma normal, que es lo que les
10:28voy a mostrar a continuación. Bien,
3era Forma Normal (3FN)
10:30gente, llegamos a la tercera forma
10:31normal. ¿Y qué tenemos en cuenta? La
10:33tercera forma normal, que se aplica
10:35tablas que ya estén en la segunda forma
10:38normal. ¿Okay? Es decir, ya tuvo que
10:40haber pasado por la primera, por la
10:43segunda y ahora recién en base a eso
10:45puedo aplicar la tercera. No puedo
10:46aplicar de una si no están aplicadas las
10:48dos anteriores primero. ¿Okay?
10:51¿Qué tenemos que hacernos eh o qué
10:53tenemos que exigir en esta forma normal?
10:55Que no haya esa dependencia transitiva
10:57como el caso que les conté recién.
10:59Entonces, ¿qué hacemos? Eliminamos eso.
11:01¿Cómo lo eliminamos? Okay, nos habíamos
11:03dado cuenta de que un empleado estaba
11:06asociado directamente un departamento,
11:08por lo cual decimos, bueno, los
11:09departamentos pueden ser una tabla
11:11aparte, pueden estar almacenados en una
11:14tabla aparte y los puedo asociar por la
11:16ID, por la Primary Key y una foreign
11:18key. Entonces, yo puedo crear
11:20tranquilamente una nueva tabla que sea
11:23departamentos, por ejemplo, y hago que
11:26cada departamento tenga una ID única.
11:30Por ejemplo, recursos humanos, sistemas
11:32marketing, tienen cada uno su ID única,
11:341, dos y tres. ¿Y qué hago? Hago la
11:37asociación de que Ana Gómez pertenece al
11:40departamento uno. Si busco en la otra
11:42tabla, ¿a dónde pertenece? Recursos
11:44humanos. Juan Pérez pertenece al
11:46departamento dos. Si busco en la tabla
11:49de apartamentos, efectivamente es en
11:50sistemas. Me oficina, pero quedó igual a
11:53la anterior que era esta, pero en una
11:56tabla nueva, ¿qué sentido tiene? Tiene
11:59mucho sentido. Si yo agrego, por
12:01ejemplo,
12:02dos nuevos empleados, ¿qué pasa?
12:05Fíjense, si yo agrego ahora a Martín
12:07López, que es de sistemas, yo únicamente
12:11voy a poner el dos. ¿Qué va a hacer
12:14esto? me va a llevar a la tabla
12:16departamentos y tengo sistemas, no está
12:19duplicada el nombre acá la información,
12:21dos veces sistemas, tres veces sistemas,
12:23sino que directamente lo que se repite
12:25es la clave foránea que me va a llevar a
12:27la clave primaria en la otra tabla.
12:30Entonces, esto queda mucho más ordenado
12:32y sin redundancia. De igual manera, si
12:34le agrego a Sofía Ramírez, que es de
12:36recursos humanos, no voy a tener acá de
12:38vuelta RRHH, sino que voy a tener la
12:41clave en cuestión y la voy a asociar al
12:44departamento que corresponde. Entonces,
12:46además ahora de tener la tabla de
12:48idiomas, también tengo la tabla de
12:51departamentos y ya la primera tabla
12:54original que tenía ya la separé en tres
12:56partes y como pueden ver fui
12:59relacionando cada una de ellas. ¿Qué
13:02mejores hicimos? que si agregamos un
13:04nuevo empleado no se va a repetir el
13:06nombre departamento, ya queda de forma
13:08única. Hasta ahí son conceptos bastante
¿Hasta donde normalizar?
13:10complejos, gente. De última, vayan
13:12mirando paso a paso, pueden ir sacando
13:15captura de cada forma normal y comparen
13:17las imágenes de cómo va cambiando la
13:19tabla y demás para poder ir entendiendo,
13:21porque estos son conceptos teórico
13:23prácticos que por ahí si es la primera
13:25vez que los están viendo les puede volar
13:27un poco la cabeza, pero créanme que con
13:29la práctica después ya van a crear base
13:32de datos ya normalizadas de una, que es
13:33como les suelo explicar en mis cursos.
13:35Bien, ahora hay un detalle. Yo les
13:38expliqué la forma normal cero, que es
13:40cuando no está normalizada, la segunda,
13:42la la primera, la segunda y la tercera
13:44forma normal. Y también existen más
13:46formas normales. Existe cuarta, quinta,
13:50sexta, hasta formas normales especiales.
13:52Pero acá viene la pregunta, ¿hasta dónde
13:55conviene normalizar? Y acá les voy a
13:57explicar en detalle hasta dónde. Por
13:59convención y por estándar, la mayoría de
14:02las bases de datos comunes y corrientes
14:04que no van a tener un uso extremo o para
14:07un, vamos a decir, dominio en
14:09particular,
14:10tienen como recomendación llegar hasta
14:12la tercera forma normal. ¿Okay? Es el
14:15estándar que se utiliza en todos lados a
14:17nivel mundial y que ya se ha establecido
14:20para lo que son base de datos
14:21relacionales. ¿Por qué? porque elimina
14:23las redundancias innecesarias, es decir,
14:25los datos repetidos. Sí, previene las
14:27anomalías, los que les conté al
14:28principio, de inserción, eliminación y
14:30actualización y mantiene el equilibrio
14:33entre que los datos sean íntegros, que
14:35no sean repetidos o que no tengan
14:36sentido, lo que les expliqué hace un
14:37ratito, y el rendimiento de la base de
14:40datos. ¿Okay? Hay un equilibrio entre
14:42todo esto. Pero, ¿qué pasa con la cuarta
14:46forma normal, la quinta, la sexta? o si
14:49hay formas normales especiales. ¿Cómo sé
14:51si tengo que aplicar alguna de esas o
14:53no? Bien, podemos tener en cuenta esto.
14:56Sí se aplican esas formas normales
14:58especiales. Sí, hay relaciones
15:00multivaluadas independientes. Si
15:02necesitamos un diseño que sea tal cual
15:04como dice acá, muy riguroso, muy limpio,
15:07muy muy pulclo, como en aplicaciones que
15:09son muy críticas. por ejemplo,
15:11aplicaciones bancarias, aplicaciones de
15:13impuestos, aplicaciones de salud, suelen
15:16ser algunas en las que por ahí tiene que
15:17haber un diseño muy muy específico para
15:20que no haya ningún tipo de confusión de
15:22datos y también cuando se busca un
15:24modelo académicamente correcto, me
15:26refiero a cuando hay trabajos de
15:27investigación, base datos
15:28investigativas, de datos que después se
15:30van a utilizar para ciertas tomas de
15:32decisiones y en ciertas cuestiones que
15:33por ahí es justamente que se pide algo
15:37muy preciso, ¿sí? como por ejemplo, si
15:39vamos a hacer automatización, luego ahí
15:41se necesita de que sea algo muy preciso
15:44y específico, pero no es necesario
15:47aplicar en estos casos que les muestro
15:48acá. Sí, si necesitamos rendimiento, es
15:51decir, rapidez de respuesta y no importa
15:53tanto los datos íntegros, por ejemplo,
15:55si tenemos que hacer reportes donde
15:56necesamos traer rápido los datos y
15:58demás, ahí no es necesario hacer formas
16:01normales, cuarta, quinta, sexta, no es
16:03necesario tampoco. Si hay, por ejemplo,
16:06ciertos joints que son muy heavis, muy
16:09pesados, pero que hay redundancia de
16:12datos, pero pueden ser, como dice acá en
16:13la teoría, controladas, no hay ningún
16:15problema porque podemos llevar hasta la
16:17tercera forma normal y si hay algún tipo
16:19de redundancia decimos, "Okay, no hay
16:21problema, podemos utilizar igual esa
16:24redundancia no me va a afectar en el
16:25resultado de las consultas y me aumenta
16:27el rendimiento." ¿Sí? Y acá es muy
16:30importante esto. Si estamos en un
16:31entorno donde estamos leyendo datos
16:33constantemente y estamos disponibilidad
16:35a todo el tiempo y rapidez, muchas veces
16:37normalizar puede quitarnos este
16:39rendimiento que necesitamos, como por
16:41ejemplo lo que les digo, donde hay un
16:43data warehouse, donde pasa esto, a veces
16:46es mejor incluso que la base de datos
16:47esté de normalizada o utilizar base de
16:50datos no relacionales que utilizar base
16:52de datos relacionales y normalizadas.
16:55Por eso les digo, va a depender siempre
16:57del contexto y del tipo de sistema.
Resumen
16:59Ahora, ¿cuál es el resumen de todo esto?
17:02Vamos a la primera parte, que es la más
17:04importante. La forma normal es de la a
17:07la tres. La cero, por supuesto, cuando
17:08está no normalizada. De la uno a la
17:11tres, tenemos este resumen. La primera
17:13forma normal, eliminamos las listas y
17:15los multivalores. Tienen que haber
17:17valores atómicos, ¿okay? Lo que hicimos
17:19de separar los idiomas en distintas e
17:23distintos atributos. Sí, que no estén
17:25todos en una misma línea. ¿Qué hicimos
17:27de la segunda forma normal? Se eliminan
17:29las dependencias parciales o las claves
17:31compuestas. Los que les conté que no
17:33puede haber esto de que hayan
17:36repeticiones de varios elementos que nos
17:39pasa tanto en departamentos como en
17:42idiomas asociadas a la misma clave
17:44primaria. Esto no puede pasar. Y en la
17:47tercera forma normal lo que se hace son
17:48se eliminan las dependencias
17:49transitivas. los que les conté que en el
17:52caso departamento, por ejemplo, ya se
17:54asociaba que la ID1 del empleado estaba
17:57asociado a un departamento, por lo cual
17:58automáticamente al nombre del
18:00departamento. Eso estaba mal porque si
18:02después agre un nuevo empleado, ¿qué
18:03pasaba? Tenía que estar automáticamente
18:05en ese departamento por la ID o crear un
18:08departamento nuevo, lo cual no tenía
18:10sentido si pertenecía al mismo. ¿Cuándo
18:12se usa cada una de la primera a la
18:14tercera forma normal? Siempre. Sí,
18:17porque es la base del diseño o
18:19prácticamente siempre.
18:20Ahora, cuarta y quinta forma normal solo
18:23en casos especiales, ¿okay? Sexta forma
18:27normal para lo que es investigación,
18:29cuestiones teóricas, académicas o big
18:32data, donde estamos manejando gran
18:33cantidad de datos. Y nos queda uno para
18:35mencionar, que es la voice code normal
18:39form o también forma normal de voice
18:41cod, que básicamente es como una tercera
18:42forma normal pero un poquito más
18:44estricta, donde si hay claves candidatas
18:47mal distribuidas como es acá, lo podemos
18:50mejorar aún más. Es como una, digamos,
18:52tercera forma normal plus, pero no se
18:54utiliza demasiado. Es tal como la cuarta
18:57y quinta forma normal para casos
18:59especiales o muy puntuales, como les
19:00mencioné anterior. Ahora me van a decir,
19:02"Luisin, esto me acaba de volar la
19:03cabeza. Si bien les expliqué con un
19:05ejemplo práctico, a veces es difícil de
19:07darnos cuenta cómo pasamos a las
19:09distintas formas normales. Acá les voy a
19:11decir una cosa y les voy a dejar una
19:12tarea también para ustedes. Aplicamos
19:14las formas normales sobre la tabla
19:16empleados. Sí, quedó bien prolija.
19:19Creamos la tabla departamentos y la
19:21tabla idiomas. Pero fíjense que la tabla
19:23idiomas, si van un poquito más atrás en
19:25el video, vuelvan, recorran, no quedó
19:28muy bien luego que aplicamos las formas
19:29normales, porque ahora tocaría aplicar
19:32sobre esa tabla idiomas. Podríamos
19:34aplicar las formas normales también y se
19:36van a dar cuenta que probablemente haya
19:38que hacer una separación más y que haya
19:40una tabla intermedia de más cuestiones,
19:42depende del tipo de relación que haya
19:43ahí. Así que les hago notar eso, a ver
19:47si quieren hacerlo como tareíta que
19:49apliquen las formas normales sobre
Ejercicio Práctico Normalización
19:51idiomas. Pero ahora, pero ahora para ser
19:53más práctico todavía, pues esto es una
19:54masterclass. Ya después de haber visto
19:55todos los las ejemplos teórico
19:58prácticos, porque vimos la teoría, pero
19:59también la práctica, vamos a hacer un
20:01ejercicio práctico. Les voy a mostrar
20:03una tabla en cuestión que va a ser la
20:05que vamos a tener que normalizar y les
20:07voy a ir mostrando qué tenemos que tener
20:08en cuenta para normalizarla. Así que
20:10vamos a eso. Bien, gente, como pueden
20:12ver estamos en Excel. Luisina, vamos a
20:14hacer un ejercicio de base de datos en
20:16Excel. Sí, porque tiene el diseño
20:18justamente que necesitamos de tablas
20:19para ir mostrándoles de forma gráfica
20:22cómo podemos ir transformando las
20:23tablas, ¿okay? No significa que Exceles
20:26va a dar. No confundamos, lo estoy
20:28ocupando simplemente como herramienta
20:29gráfica para que para ustedes sea mucho
20:31más sencillo. ¿Okay? Como pueden ver,
20:33tenemos una tabla que no está
20:35normalizada, que básicamente tiene
20:37distintos pilotos de Fórmula 1. Ni se
20:40nota que Luisina empezó a mirar Fórmula
20:411 por con la pinta hace un tiempo, que
20:43tiene distintos pilotos de la Fórmula 1
20:45que están aprendiendo distintos
20:46lenguajes de programación, que tienen
20:48distintos instructores dependiendo del
20:51curso en el que están y que tienen las
20:53clases en distintas aulas. Las aulas son
20:56cada uno de los espacios de clase, por
20:59así decir. Bien, como vemos está en la
21:02forma normal cero y vamos a hacer lo
21:05necesario para pasar a la primera forma
21:08normal, porque nos damos cuenta que esta
21:10tabla no está normalizada. ¿Cómo nos
21:11damos cuenta? Porque tenemos atributos
21:14acá que están repetidos. Java, fíjense,
21:18aparece las cuatro veces. Todos están
21:20aprendiendo Java. son inteligentes,
21:22están aprendiendo Java en la academia de
21:23todo code. Pónganle. Sí. Y el problema
21:27que tenemos acá también que García, el
21:29instructor que están teniendo, se repite
21:31cuatro veces. Sabemos que hay
21:32redundancia, lo mismo el aula A1. Y de
21:35igual manera también esto está como
21:38listas, es decir, hay más de un valor
21:40para un atributo. Y lo que busca la
21:42primera forma normal es que los
21:44atributos multivaluados sean atómicos,
21:47es decir, que tengan un solo atributo
21:51por cada asociación. Entonces, partiendo
21:53de eso, ¿cómo hacemos para pasar a la
21:56primera forma normal? Voy a copiar lo
21:59que va a ser nuestra tabla y tenemos,
22:00vamos a tener el mismo piloto, el uno
22:03que es Maxpen. Vamos a tenerlo, ¿cuántas
22:06veces? Tiene dos lenguajes que son Java
22:09y Python. Así que tenemos dos veces. Uno
22:12para Java, vamos a anotar bien, Java, y
22:16otro para Python. No se preocupen que
22:17ahora pongo para que quede el mismo
22:20formato y demás. Bien, ¿qué otro valor
22:23tiene repetido que tiene a dos profes, a
22:26García y a Fernán? A García lo tiene
22:30asociado a Java porque es el primer
22:31valor y a Fernán con
22:34Python. Perfecto. Lo mismo con las
22:37aulas. Tiene aula A1 y tiene aula B2.
22:42Fíjense como acá ya logramos la
22:44atomicidad. Sí, voy a copiar el formato
22:47para que acá sea todo igual. Ahí está.
22:49Perfecto, ya tenemos esta primera parte.
22:51Ahora vamos a mirar Leclerc. A ver,
22:54Leclerc tiene algo, ¿no? No tiene nada
22:56para separar, tiene todo atómico. Lo
22:58podemos copiar tal cual. Ahora miremos
23:00Hamilton. A ver, Hamilton tiene, vamos a
23:04ponerlo acá. Hamilton.
23:06Hamilton tiene e a JavaScript y a Java y
23:11tiene dos profes y dos aulas. Así que le
23:13vamos a tener a Hamilton dos veces. Sí.
23:16Uno para JavaScript. Vamos a poner acá
23:20Java
23:22script. Otro para Java. Sí. Y acá le va
23:26a tener a López. Y acá le va a tener
23:29también a García, que lo voy a copiar y
23:31pegar. Bien. Luego acá va a tener el
23:33aula C3 y acá va a tener el aula A1.
23:37Fíjense. C3 A1. López García. López
23:43García, JavaScript Java JavaScript Java.
23:46lo que busca es que si tenemos más de un
23:48atributo, es decir, atributos
23:50multivaluados en un mismo renglón,
23:52separarlo básicamente en nuevas tuplas,
23:55en nuevos registros, en nuevos renglones
23:57de nuestra tabla. Bien, si ahora voy a
24:00poner para que todo se vea igualito, ahí
24:02está. Si vimos ahora, se cumple la
24:05primera forma normal. ¿Por qué? Porque
24:08todos los valores son atómicos. Sí, ya
24:11no tenemos más de un valor en una línea,
24:14lo cual es espectacular. Pero, pero si
24:18vemos nuestra tabla, sigo viendo, lo
24:20pongo más cerca para que ustedes lo vean
24:22mejor. Siguen habiendo ciertas
24:24cuestiones a tener en cuenta. Sí, vamos
24:27a ver cuáles son. La primera cuestión a
24:28tener en cuenta es que me olvidé del
24:30pobre Franco con la pinto, así que vamos
24:31a agregarlo. Ahí está acá abajo. Franco,
24:34no me olvidé de vos, Franco, no me
24:36olvidé de vos. Bien, pero Franco en este
24:37caso no tenía atributos repetidos, así
24:40que no había problema y estaban
24:41anatómicos. Pero bien, si nos damos
24:43cuenta, vamos ahora a ver si es
24:45necesario una segunda forma normal o no.
24:47Voy a poner acá segunda forma normal,
24:50pero si empezamos a ser minuciosos,
24:52vamos a darnos cuenta de que tenemos una
24:54clave primaria compuesta. ¿Por qué?
24:56Fíjense la cantidad de datos repetidos
24:58que tenemos. Java está una, dos, tres,
25:00cuatro veces. García está cuatro veces.
25:02El aula A1 está cuatro veces. Y sin
25:05darnos cuenta también los nombres de los
25:07pilotos están repetidos y vemos que
25:09indirectamente la ID del piloto está
25:12asociada al lenguaje, ¿sí?, que cada uno
25:15maneja. Al mismo tiempo, el lenguaje
25:17está asociado al instructor y al aula.
25:20Esto hace de que tengamos una clave
25:21compuesta, que cada piloto tenga dos
25:24claves, que sea su ID y el lenguaje como
25:27tal. Acuérdense que la segunda forma
25:29normal lo que busca es justamente esto,
25:31romper la redundancia de datos y romper,
25:35sí, las dependencias parciales o lo que
25:37pueden ser claves compuestas. Entonces,
25:40básicamente lo que vamos a buscar acá es
25:42independizar a los pilotos de los
25:44lenguajes o de los datos repetidos que
25:46tengan. Entonces, vamos a seguir
25:48manteniendo nuestra tabla pilotos. Voy a
25:50copiar y pegar, ¿sí?, los dos datos que
25:52vamos a mantener, que no se repiten, y
25:55vamos a dejarla limpia la tabla. Sí,
25:56vamos a poner a Leclerk, vamos a ponerle
26:00a Hamilton tercero, a Colapinto cuarto y
26:03vamos a borrar los dos lugares ahí está
26:06que sobran. Perfecto. Así nos quedó
26:09nuestra tabla piloto, bien limpita. Sí,
26:12ahora vamos a empezar a manejar. Bien,
26:15¿cómo podemos separar esto? Bien,
26:17tenemos los lenguajes, ¿sí?, de cada
26:20piloto. Si vemos en detalle, tenemos
26:22Java, Python y demás. y tenemos el prof
26:24asociado y tenemos el aula donde se da
26:27cada clase, lo cual, a ver, podríamos
26:30hacer tranquilamente una nueva tabla
26:32lenguajes, ¿les parece? Podría ser.
26:35Entonces, vamos a buscar nuestra tabla
26:38lenguajes, que vendría a ser esta
26:39segunda parte en la que dividimos. Sí,
26:42voy a ponerla acá para dejar espacio. ¿Y
26:44qué nos faltaría? nos faltaría asociar,
26:47según lo que dice la segunda forma
26:48normal, el ID del piloto que está en
26:53cada uno. En este caso vamos a tener ID
26:55piloto uno y uno. Acá vamos a tener eh
26:59dos. Acá vamos a tener tres y tres y acá
27:01vamos a tener cuatro. Vamos a copiar el
27:03formato para que nos quede todo igual.
27:06¿Qué significa esto? Que básicamente
27:07estamos asociando de que verpen sí sabe
27:12Java y Python. Nosotros si miramos acá
27:14quién es el piloto que sabe Java y
27:15Python vamos a poder hacer referencia a
27:17Versappen. Si queremos ver quién sabe
27:19solo Java, le clerk, acá también tenemos
27:21JavaScript, le tenemos a Hamilton, Java
27:24también sabe Hamilton y Java también
27:25sabe colapinto. Esto es lo que establece
27:28la segunda forma normal. Básicamente,
27:30¿qué hicimos? Creamos una tabla, ¿sí?,
27:34empleados, la dividimos y sacamos esa
27:37dependencia, la doble clave primaria.
27:39Ahora cada uno de los pilotos tiene una
27:43sola clave primaria y la tabla de los
27:48lenguajes de cada uno de los pilotos
27:50está separada y ya no tenemos acá la
27:53redundancia de datos correspondientes.
27:56¿Okay? Sin embargo, sin embargo, creo
27:59yo, no sé qué piensan ustedes, que acá
28:01podemos hacer también una tercera forma
28:04normal. ¿Creen que sí? ¿Por qué? Porque
28:07hay una dependencia transitiva acá, ¿se
28:10acuerdan lo que yo le expliqué? La
28:12dependencia transitiva dice que si yo
28:13digo que A
28:16es B, ¿sí? Estoy poniendo acá. Vamos a
28:18poner un poquito más grande la letra, si
28:19ustedes lo ven mejor, ¿sí? Si yo digo
28:21que A es B, entonces automáticamente si
28:23digo que B es C, ¿sí? Que esto es lo que
28:27se establece en la matemática, entonces
28:29automáticamente si A es ig a B y B es ig
28:32a C, yo puedo decir que A
28:35es C. Eso es lo que decía la teoría. ¿Se
28:37acuerdan que la teoría decía eso? La
28:39matemática. Eso es una dependencia
28:41transitiva. ¿Cuál es la dependencia
28:43transitiva que yo estoy diciendo acá?
28:44Básicamente estoy diciendo que el
28:47instructor y el aula dependen del
28:50lenguaje, pero puede ser que un día
28:53García se enferme o que el aula uno esté
28:56ocupada y que o cambie instructor o
28:59cambie el aula. De esta manera yo estoy
29:00diciendo automáticamente que por ser el
29:03lenguaje ja automáticamente el
29:05instructor va a ser García y
29:06automáticamente por eso se va a dar
29:07siempre en el aula A1, que es lo que
29:10establece esta dependencia transitiva.
29:13Sin embargo, eso no es cierto, eso puede
29:15cambiar. Entonces, nosotros podemos
29:17hacer acá nuevamente una separación para
29:20nuestra tercera forma normal. ¿Y cómo
29:23establecemos nuestra tercera forma
29:24normal? Vamos a ponerla acá arriba, que
29:27me queda espacio todavía en la pantalla.
29:30Vamos a poner acá tercera forma normal.
29:32Y justamente vamos a hacer referencia a
29:34eso. Nuestra tabla de pilotos sigue
29:37exactamente igual, no va a cambiar
29:39porque ya está bastante prolija, ya está
29:42bastante normalizada, no tiene nada por
29:44cambiar. La que tiene el problema de las
29:46dependencias transitivas es justamente
29:49esta, la de lenguajes y pilotos.
29:51Entonces, lo que nosotros podemos hacer
29:53directamente es asociar, sí, cada uno de
29:57los pilotos de forma independiente con
30:00el lenguaje. Entonces, ¿qué podemos
30:02hacer? Podemos separar en una nueva
30:04tabla de lenguajes donde podramos decir
30:07que por cada lenguaje quién es el profe
30:10y en qué aula se lleva a cabo. Entonces,
30:12si luego queremos cambiar esos datos en
30:15la tabla, tranquilamente se podrían
30:16hacer o agregar elementos nuevos.
30:18Entonces, podemos crear una tabla que
30:21sea lenguajes. Sí. Y puedo poner
30:24directamente acá
30:27cada uno de los profes para evitar la
30:30redundancia y el lenguaje y el aula que
30:33enseñan.
30:36Ahí está cumpliendo en este caso con la
30:39tercera forma normal. Pero acá hay un
30:40detalle más. Acá hay un detalle más. Acá
30:43tengo solucionado que los lenguajes
30:45están por un lado y los pilotos por
30:47otro, pero me falta la asociación entre
30:51cada lenguaje y cada uno de los pilotos.
30:55¿Y cómo voy a hacer eso? Y lo puedo
30:57hacer dividiendo esto en una nueva tabla
31:02intermedia donde puedo decir, por
31:04ejemplo, el piloto uno sí está asociado
31:08al lenguaje Java, el piloto uno está
31:11asociado al lenguaje Python, el el
31:13piloto dos al lenguaje Java, el piloto 3
31:16a JavaScript. Esto siempre y cuando
31:20nuestra clave primaria en esta nueva
31:23tabla lenguajes sea el nombre del
31:26lenguaje. ¿Okay? Sin embargo, nosotros
31:30podríamos acá agregar una nueva columna
31:33que sea ID lenguaje y que cada lenguaje
31:36tenga su propio ID y que esta tabla
31:38intermedia tenga la ID y no el nombre
31:41como tal de el lenguaje para que acá no
31:44haya nuevamente datos repetidos. Esa
31:47mejora también la podríamos hacer al
31:49mismo tiempo. Al mismo tiempo, si
31:52queremos ponernos más minuciosos y
31:54normalizar aún más y dejar esto aún
31:57mejor, ¿sí? Porque acá llegamos hasta la
31:59tercera forma normal. Fíjense que si
32:01ustedes quieren ser un poquito más
32:03minuciosos, ustedes pueden al mismo
32:06tiempo a esta tabla lenguajes que
32:08agregamos, además de agregar una ID,
32:10pueden separar instructor en una nueva
32:13tabla, que tengamos una tabla exclusiva
32:15de instructores, donde podamos agregar
32:18todos los instructores que queramos y si
32:20hay instructores nuevos que los podamos
32:22agregar. Y lo mismo pasa con las aulas.
32:25Si las aulas van a ser algo que van a ir
32:26cambiando y vamos agregando aulas nuevas
32:28constantemente, puedo crear también una
32:31tabla más, una tabla aparte que sea
32:33aula, donde cada vez que se cree una
32:35aula nueva, yo pueda agregar ese nueva
32:38aula. Esto, gente, obviamente que va a
32:40depender del nivel que necesitemos de
32:43normalización. Con esto estaremos
32:45cumpliendo con el ejercicio. Teníamos
32:47todo esto desordenado, sin atributos
32:49atómicos y repetidos. Primero rescatamos
32:52todos los atributos atómicos. Primera
32:54forma normal. Segunda forma normal,
32:56logramos de que cada clave primaria, un
32:59piloto está asociado a un nombre y
33:01separamos los otros datos que estaban
33:03asociados en una nueva tabla. Sí, pero
33:06nos dimos cuenta que había dependencias
33:08transitivas y que el lenguaje dependía
33:10del instructor y del aule que hacíamos
33:13asociaciones que por ahí estaban también
33:15incluyendo redundancia de datos.
33:17Entonces, simplificamos en una nueva
33:19tabla intermedia donde está asociado a
33:22qué piloto pertenece a qué lenguaje o
33:25qué lenguaje está estudiando y en una
33:27nueva tabla aparte cada lenguaje con
33:30quien es su profe y su aula. Vuelvo a
33:32decir, si queremos hacer esto mejor
33:34todavía, podemos agregar una ID
33:37exclusiva a cada lenguaje, podemos
33:39separar instructor en otra tabla aparte
33:41y habla en otra parte más. Pero eso va a
33:43ser tarea para ustedes y quiero que me
33:45cuenten en los comentarios cómo lo
33:47harían y si creen que es óptimo o no
33:49hacerlo. Bien, gente, espero que se haya
Conclusiones
33:52entendido de alguna u otra forma con
33:53esta masterclass, que puedan haber
33:56captado un poco cuál es la idea de la
33:57normalización. A ver, si bien son reglas
34:00que se van cumpliendo, ¿sí? Que a medida
34:02que vemos las tablas decimos, "Uh, esto
34:04lo puedo mejorar, esto puedo pasar a
34:05primera forma, segunda forma, tercera
34:07forma." Sí, esto luego tiene que ser
34:09algo cotidiano para ustedes a la hora de
34:10normalizar base de datos, ya que no
34:12piensan, en uy, tengo que normalizar,
34:14sino que la hora de diseñar una base de
34:15datos, ustedes ya piensen en la forma
34:18más óptima y que una vez que diseñen, si
34:21se dan cuenta que no es la más óptima,
34:22ahí aplica normalización. Bien, pero es
34:25generalmente ya les digo, con la
34:26práctica y los años ya les va a salir el
34:28diseño de la base de datos ya
34:29automáticamente normalizadas, ni van a
34:31tener que pensar en todos estos procesos
34:33porque ya les va a salir de forma
34:34automática. Pero ahora que están
34:36aprendiendo, les recomiendo que si no lo
34:38entendieron bien, vayan de vuelta al
34:40primer ejemplo los que les expliqué con
34:42la teoría. Vengan de nuevo al ejercicio,
34:44pongan pausa, intenten hacerlo porque es
34:47algo que con la práctica van a ir
34:49agarrando. De hecho, si se animan, hagan
34:51otro ejercicio similar, agreguen o armen
34:53una tabla que tenga valores repetidos.
34:55Fíjense cómo se puede ir separando y
34:56demás cuestiones y van a ver que llega
34:59solo a la práctica. Bueno, gente, espero
35:00que les haya gustado esta masterclass,
35:02que se haya entendido. Si tienen dudas,
35:03déjenmela en los comentarios, que yo
35:05apenas puedo las voy a leer. No se
35:07olviden que tienen también la comunidad
35:08de Discord en la descripción donde
35:10tenemos un foro de preguntas y demás.
35:12Ustedes pueden dejar sus dudas y siempre
35:13los chicos de la comunidad cuando pueden
35:15responder o yo cuando tengo un tiempito
35:17también me pongo a responder. No se
35:18olviden dejar su me gusta, suscribirse,
35:20darle click a la campanita porque gente,
35:21créanme, es realmente difícil crecer con
35:24un canal educativo. Todo Cob es un canal
35:26educativo completamente, es gratuito y
35:29lo que buscamos es crecer para llegar a
35:31más gente, que más personas puedan
35:33educarse en estos temas y con la ayuda
35:35de ustedes compartiendo, dejan su me
35:36gusta, comentario, hace que el video se
35:38posicione y eso está buenísimo. Así que
35:40gente, nos vemos seguramente en un
35:42próximo video y estén atentos que se
35:44viene el mega video de varias horas con
35:47todo el remasterizado este curso de base
35:49de datos. ¿En dónde? En Todo C.
35:52Ciao. Ciao.
35:56[Música]
35:58[Aplausos]
36:06[Aplausos]