Contenido principal
Programación de computadoras
Curso: Programación de computadoras > Unidad 3
Lección 3: Consultas relacionales en SQL- Separar datos en tablas relacionadas
- Unir tablas relacionadas con JOIN
- Desafío: los pasatiempos de Bobby
- Unir tablas relacionadas con LEFT OUTER JOIN
- Desafío: órdenes del cliente
- Unir tablas a sí mismas con SELF-JOIN
- Desafío: secuelas en SQL
- Combinar múltiples JOINs
- Desafío: FriendBook (libro de amigos)
- Proyecto: gente famosa
- SQL más eficiente con planeación y optimización de consultas
© 2023 Khan AcademyTérminos de usoPolítica de privacidadAviso de cookies
Separar datos en tablas relacionadas
Hasta ahora, solo hemos trabajado con una tabla a la vez, y visto qué datos interesantes podemos seleccionar de esa tabla. Pero en realidad, la mayor parte del tiempo, tenemos nuestros datos distribuidos en varias tablas, y todas esas tablas están "relacionadas" unas a otras de alguna manera.
Por ejemplo, digamos que tenemos una tabla para registrar qué tan bien les va a los estudiantes en sus exámenes, e incluimos direcciones de correo electrónico en caso de que necesitemos enviar mensajes a los papás acerca de resbalones en las calificaciones:
nombre_estudiante | correo_estudiante | examen | calificacion |
---|---|---|---|
Peter Rabbit | peter@rabbit.com | Nutrición | 95 |
Alice Wonderland | alice@wonderland.com | Nutrición | 92 |
Peter Rabbit | peter@rabbit.com | Química | 85 |
Alice Wonderland | alice@wonderland.com | Química | 95 |
También podríamos tener una tabla para registrar qué libros lee cada estudiante:
nombre_estudiante | titulo_libro | autor_libro |
---|---|---|
Peter Rabbit | El cuento de la señora Tiggy-Winkle | Beatrix Potter |
Peter Rabbit | Jabberwocky | Lewis Carroll |
Alice Wonderland | La Caza del Snark | Lewis Carroll |
Alice Wonderland | Jabberwocky | Lewis Carroll |
También podríamos tener una tabla solo para información detallada del estudiante:
id | nombre_estudiante | apellido_estudiante | correo_estudiante | telefono | cumpleaños |
---|---|---|---|---|---|
1 | Peter | Conejo | peter@rabbit.com | 555-6666 | 2001-05-10 |
2 | Alice | Wonderland | alice@wonderland.com | 555-4444 | 2001-04-02 |
¿Que piensas acerca de estas tablas? ¿Las cambiarías de alguna manera?
Hay una cosa importante que hay que darse cuenta acerca de estas tablas: describen datos relacionales, como en: describen datos que se relacionan unos a otros. Cada una de estas tablas describe datos relacionados a un estudiante en particular, y muchas de las tablas replican los mismos datos. Cuando los mismos datos están replicados en múltples tablas, puede haber consecuencias interesantes.
Por ejemplo, ¿qué pasa si cambia el correo electrónico de un estudiante? ¿Qué tablas serían necesarias cambiar?
Necesitaríamos cambiar la tabla de información del estudiante, pero como también incluimos esos datos en la tabla de calificaciones, también tendríamos que encontrar cada renglón acerca de ese estudiante, y cambiar el correo electrónico ahí también.
A menudo es preferible estar seguros de que una columna de datos en particular esté almacenada en una sola ubicación, de modo que haya menos lugares que actualizar y menos riesgo de tener diferentes datos en diferentes lugares. Si hacemos eso, necesitamos asegurarnos de tener una manera de relacionar los datos en distintas tablas, a lo cual llegaremos más adelante.
Digamos que decidimos quitar el correo electrónico de la tabla de calificaciones, porque nos dimos cuenta de que es redundante con el correo electrónico en la tabla de detalles del estudiante. Esto es lo que tendríamos:
nombre_estudiante | examen | calificacion |
---|---|---|
Peter Rabbit | Nutrición | 95 |
Alice Wonderland | Nutrición | 92 |
Peter Rabbit | Química | 85 |
Alice Wonderland | Química | 95 |
¿Cómo podríamos averiguar el correo electrónico para cada estudiante? Podríamos encontrar el renglón en la tabla de información de estudiantes, al hacer coincidir los nombres. ¿Qué pasa si 2 estudiantes tienen el mismo nombre? (¿Sabías que en Bali cada persona solo tiene 1 de 4 nombres posibles?) No podemos depender del nombre para buscar un estudiante, y en serio, nunca debemos depender en algo como el nombre para identificar algo de manera única en una tabla.
Así que lo mejor por hacer es quitar
nombre_estudiante
y reemplazarlo con id_estudiante
, ya que ese es un identificador único garantizado:id_estudiante | examen | calificacion |
---|---|---|
1 | Nutrición | 95 |
2 | Nutrición | 92 |
1 | Química | 85 |
2 | Química | 95 |
Podríamos hacer el mismo cambio en nuestra tabla de libros, al usar
id_estudiante
en vez de nombre_estudiante
:id_estudiante | titulo_libro | autor_libro |
---|---|---|
1 | El cuento de la señora Tiggy-Winkle | Beatrix Potter |
1 | Jabberwocky | Lewis Carroll |
2 | La Caza del Snark | Lewis Carroll |
2 | Jabberwocky | Lewis Carroll |
Te das cuenta de que tenemos el título del libro y autor repetidos dos veces para Jabberwocky? Ese es otro signo de alerta de que podríamos separar nuestra tabla en múltiples tablas relacionadas, de modo que no tengamos que actualizar múltiples lugares si algo cambia acerca de un libro.
Podríamos tener una tabla solo acerca de libros:
id | titulo_libro | autor_libro |
---|---|---|
1 | El cuento de la señora Tiggy-Winkle | Beatrix Potter |
2 | Jabberwocky | Lewis Carroll |
3 | La Caza del Snark | Lewis Carroll |
Y después nuestra tabla
libros_estudiantes
se convierte en:id_estudiante | id_libro |
---|---|
1 | 1 |
1 | 2 |
2 | 3 |
2 | 2 |
Ya sé, esta tabla no se ve tan legible como la anterior que tenía toda la información metida en cada renglón. Pero las tablas suelen no estar diseñadas para que las lea un humano, sino para que sean lo más fáciles de mantener y menos propensas a errores. En muchos casos, puede ser mejor separar la información en múltiples tablas relacionadas, de modo que haya menos datos redundantes y menos lugares que actualizar.
Es importante entender cómo usar SQL para lidiar con datos que han sido separados en múltiples tablas relacionadas, y traer de regreso los datos de varias tablas cuando sea necesario. Hacemos eso al usar un concepto llamado "join"s (uniones) y eso es lo que te mostraré a continuación.
¿Quieres unirte a la conversación?
- Hasta ahora todos los tutoriales una maravilla, felicidades por el gran trabajo...(4 votos)
- e aprendido mucho gracias a esta pagina es muy buena la verdad khan academy(2 votos)
- Sobre Normalizar tablas
hay muchos que dicen que no es necesario normalizar tablas cuando se trabaja con aplicaciones web, porque haría muy lenta las consultas (al tratar de unir una o muchas tablas). ¿Será cierto?(3 votos)- es mentira la rapidez de las consultas depende de la correcta realizacion de la base de datos,osea siguiendo estos principios fundamentales y luego aplicando la utilizacion de Indices,vistas,memoria cache y demas. :D es tedioso al principio pero es la forma correcta de ahcer bien las cosas(18 votos)
- ¿mi maestra puede explicar esto de alguna mejor manera?(2 votos)
- los maestros memorizan para que nosotros como alumnos podamos contrabuir todas las cosas aprendidas sobre la clase asi como como organizar tablas etc(2 votos)
- Muchas gracias sus tutoriales son los mejores sigan asi. Gracias :D(2 votos)
- aprovecho para agradecer !(2 votos)
- aprovecho para agradecer todo lo aprendido que nos enceñan en khan academy pues gracias a ello conocemos mas sobre programar o asimilar las acciones que se nos precenten(3 votos)
- Aquí aprendo mucho como hacer las programas(2 votos)
- esta pagina me a ayudado a entender mejor la progrmacion(2 votos)
- Muchas gracias por los videos y las pruebas, great!(2 votos)
- muy bueno el separador de tabla facilita mucho(2 votos)
- Son muy excelentes los temas(2 votos)