Título: Ejer Alg relacional Publicado por: rubcr en 15 Abril 2020, 20:34 pm Buenas tardes a todos, tengo un ejercicio de álgebra relacional que ya he resuelto pero no estoy seguro si está completamente bien resuelto.
Es el siguiente: Ejercicio. Se pide conocer el nombre de los Proveedores que han suministrado artículos de color rojo y verde dadas las siguientes tablas: PROVEEDORES(#Cod_Prov, Nombre, Ciudad, Calle, Número) ARTÍCULOS(#Cod_Art, Nombre_a, Precio, Descr, Color) PEDIDOS(#Cod_Prov, #Cod_Art, Cantidad) *Para la realización del ejercicio se prohíbe el uso de condiciones complejas en las selecciones, es decir, se permiten operaciones como σ(nombre=Federico)(PERSONAS) pero está prohibido usar expresiones del tipo σ(nombre="Federico" ⋀ ciudad="Madrid")(PERSONAS). Mi solución es la siguiente: πNombre(Proveedores *(σCOLOR=’ROJO’(Artículos)) ∩ πNombre(Proveedores *(σCOLOR=’VERDE’(Artículos)) Espero que alguien pueda ayudarme, un saludo. Título: Re: Ejer Alg relacional Publicado por: K-YreX en 15 Abril 2020, 22:01 pm No es correcta esa solución. Te pongo un ejemplo para que lo veas:
Código: PROVEEDORES: Código: ARTICULOS: Con el supuesto de los registros descritos arriba, tu primera parte de la intersección obtiene 3 registros (filas) cogiendo el artículo A1 y pegándole cada uno de los proveedores. Código: RESULTADO R1 = (Proveedores * Sigma(Color = 'Rojo')(Articulos)): Luego coges el nombre de cada proveedor: Código: RESULTADO R2 = PI(nombre)(R1): Lo que tienes que hacer es coger los artículos de color Rojo: Código: R1 = Sigma(color = 'Rojo')(Artículos) Código: R2 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(PEDIDOS x R1) Código: R3 = Sigma(Proveedores.Cod_prov = R2.Cod_prov)(Proveedores x R2) Código: R4 = PI(Nombre)(R3) Con eso ya tienes los nombres de los proveedores que han suministrado artículos de color rojo. Te quedaría hacer lo mismo para los de color verde. Es más fácil si lo vas haciendo por partes como te he puesto yo aquí porque te quedan consultas más cortas. Hazlo detenidamente y en caso de duda siempre puedes ponerte un ejemplo pequeño con 3 tablas y ver lo que va saliendo. Cualquier duda que tengas no dudes en comentar. PD: Si utilizas tablas de ejemplo que sean pequeñas porque cada vez que multiplicas dos tablas A y B con un número de filas #A = n y #B = m, tendrás una tabla resultado C con un número de filas #C = m*n por lo que las tablas crecerán muy rápido de número de filas. Título: Re: Ejer Alg relacional Publicado por: rubcr en 15 Abril 2020, 22:23 pm No es correcta esa solución. Te pongo un ejemplo para que lo veas: Código: PROVEEDORES: Código: ARTICULOS: Con el supuesto de los registros descritos arriba, tu primera parte de la intersección obtiene 3 registros (filas) cogiendo el artículo A1 y pegándole cada uno de los proveedores. Código: RESULTADO R1 = (Proveedores * Sigma(Color = 'Rojo')(Articulos)): Luego coges el nombre de cada proveedor: Código: RESULTADO R2 = PI(nombre)(R1): Lo que tienes que hacer es coger los artículos de color Rojo: Código: R1 = Sigma(color = 'Rojo')(Artículos) Código: R2 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(PEDIDOS x R1) Código: R3 = Sigma(Proveedores.Cod_prov = R2.Cod_prov)(Proveedores x R2) Código: R4 = PI(Nombre)(R3) Con eso ya tienes los nombres de los proveedores que han suministrado artículos de color rojo. Te quedaría hacer lo mismo para los de color verde. Es más fácil si lo vas haciendo por partes como te he puesto yo aquí porque te quedan consultas más cortas. Hazlo detenidamente y en caso de duda siempre puedes ponerte un ejemplo pequeño con 3 tablas y ver lo que va saliendo. Cualquier duda que tengas no dudes en comentar. PD: Si utilizas tablas de ejemplo que sean pequeñas porque cada vez que multiplicas dos tablas A y B con un número de filas #A = n y #B = m, tendrás una tabla resultado C con un número de filas #C = m*n por lo que las tablas crecerán muy rápido de número de filas. Gracias por responder. Comprendo lo que explicas, pero al intentar realizar la fórmula completa no soy capaz de plasmar lo que has expuesto Título: Re: Ejer Alg relacional Publicado por: K-YreX en 15 Abril 2020, 22:30 pm Gracias por responder. Si entiendes lo que he ido haciendo por partes, al final solo tienes que juntarlo, es decir, donde pone R3 pones toda la expresión de R3 y te quedará un R2 que tendrás que sustituir por R2 y lo mismo con R1 y ya tendrás la fórmula completa.Comprendo lo que explicas, pero al intentar realizar la fórmula completa no soy capaz de plasmar lo que has expuesto No sé si es ese tu problema. Título: Re: Ejer Alg relacional Publicado por: rubcr en 15 Abril 2020, 22:38 pm Si entiendes lo que he ido haciendo por partes, al final solo tienes que juntarlo, es decir, donde pone R3 pones toda la expresión de R3 y te quedará un R2 que tendrás que sustituir por R2 y lo mismo con R1 y ya tendrás la fórmula completa. No sé si es ese tu problema. Código: R2 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(PEDIDOS x R1) En esta parte en concreto que significa el . entre medias y por qué hay un igual y un símbolo de multiplicar No comprendo lo que significa. Título: Re: Ejer Alg relacional Publicado por: K-YreX en 15 Abril 2020, 23:01 pm Código: El símbolo de multiplicar es igual que lo que habías puesto tú pero tú has usado un asterisco (*) y yo he usado una x. Es un producto cartesiano, es decir, que el resultado de hacer un producto entre dos tablas es una tabla nueva en la que relacionas cada fila de la primera tabla con cada fila de la segunda tabla.R2 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(PEDIDOS x R1) En esta parte en concreto que significa el . entre medias y por qué hay un igual y un símbolo de multiplicar No comprendo lo que significa. Código: Tabla 1: Lo que queremos con eso es juntar en una misma fila los campos de la tabla Pedidos con los campos de la tabla Artículos. Pero si tenemos la siguiente situación: Código: PEDIDOS (#Cod_prov, #Cod_art, Cantidad): Si hacemos el producto de PEDIDOS x ARTICULOS sin más obtenemos: Código: P1 A1 5 A1 NombreA1 Rojo R1 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(Pedidos x Articulos) da como resultado: Código: P1 A1 5 A1 NombreA1 Rojo Para tener el nombre de los proveedores tenemos que volver a "mezclar" las 4 filas de arriba con la tabla Proveedores que por ejemplo es: Código: PROVEEDORES(#Cod_prov, Nombre): Y el resultado de hacer otro producto cartesiano entre PROVEEDORES x R1 (que es la tabla anterior) sin más sería: Código: P1 A1 5 A1 NombreA1 Rojo P1 NombreP1 R2 = Sigma(R1.Cod_prov = Proveedor.Cod_prov)(R1 x Proveedor): Código: P1 A1 5 A1 NombreA1 Rojo P1 NombreP1 Ahora: Nombre de los proveedores que suministran artículos rojos. Pues de la tabla R2 que tenemos justo encima cogemos con Sigma() las filas cuyo Color es Verde (por ejemplo) y de ahí mostramos con PI() el Nombre del proveedor. RFinal1 = PI(NombreProveedor)(Sigma(Color = 'Verde')(R2): Código: NombreP1 Hacemos lo mismo con el Rojo: RFinal2 = PI(NombreProveedor)(Sigma(Color = 'Rojo')(R2): Código: NombreP1 Si queremos saber los que suministran artículos tanto de color Verde como Rojo hacemos la intersección de ambos, es decir, los nombres que estén tanto en RFinal1 como en RFinal2. RFinal = RFinal1 INTERSECCION RFinal2: Código: NombreP1 Título: Re: Ejer Alg relacional Publicado por: rubcr en 15 Abril 2020, 23:12 pm El símbolo de multiplicar es igual que lo que habías puesto tú pero tú has usado un asterisco (*) y yo he usado una x. Es un producto cartesiano, es decir, que el resultado de hacer un producto entre dos tablas es una tabla nueva en la que relacionas cada fila de la primera tabla con cada fila de la segunda tabla. Código: Tabla 1: Lo que queremos con eso es juntar en una misma fila los campos de la tabla Pedidos con los campos de la tabla Artículos. Pero si tenemos la siguiente situación: Código: PEDIDOS (#Cod_prov, #Cod_art, Cantidad): Si hacemos el producto de PEDIDOS x ARTICULOS sin más obtenemos: Código: P1 A1 5 A1 NombreA1 Rojo R1 = Sigma(Pedidos.Cod_art = Articulos.Cod_art)(Pedidos x Articulos) da como resultado: Código: P1 A1 5 A1 NombreA1 Rojo Para tener el nombre de los proveedores tenemos que volver a "mezclar" las 4 filas de arriba con la tabla Proveedores que por ejemplo es: Código: PROVEEDORES(#Cod_prov, Nombre): Y el resultado de hacer otro producto cartesiano entre PROVEEDORES x R1 (que es la tabla anterior) sin más sería: Código: P1 A1 5 A1 NombreA1 Rojo P1 NombreP1 R2 = Sigma(R1.Cod_prov = Proveedor.Cod_prov)(R1 x Proveedor): Código: P1 A1 5 A1 NombreA1 Rojo P1 NombreP1 Ahora: Nombre de los proveedores que suministran artículos rojos. Pues de la tabla R2 que tenemos justo encima cogemos con Sigma() las filas cuyo Color es Verde (por ejemplo) y de ahí mostramos con PI() el Nombre del proveedor. RFinal1 = PI(NombreProveedor)(Sigma(Color = 'Verde')(R2): Código: NombreP1 Hacemos lo mismo con el Rojo: RFinal2 = PI(NombreProveedor)(Sigma(Color = 'Rojo')(R2): Código: NombreP1 Si queremos saber los que suministran artículos tanto de color Verde como Rojo hacemos la intersección de ambos, es decir, los nombres que estén tanto en RFinal1 como en RFinal2. RFinal = RFinal1 INTERSECCION RFinal2: Código: NombreP1 Si me pudieses poner lo que es la operación entera te lo agradecería de verdad, lo que es la teoría lo entiendo pero lo demás no lo comprendo. Título: Re: Ejer Alg relacional Publicado por: K-YreX en 15 Abril 2020, 23:31 pm Si me pudieses poner lo que es la operación entera te lo agradecería de verdad, lo que es la teoría lo entiendo pero lo demás no lo comprendo. Te he puesto la operación entera pero explicada por partes tanto con teoría como con ejemplos para que se vea lo que hace cada cosa.Que me pidas "la operación entera" me da a entender que quieres copiar la solución tal cual y no preocuparte en hacerla tú. Si la teoría la entiendes, deberías entender las explicaciones y si entiendes las explicaciones, deberías saber hacer tú mismo la operación. EDIT: Además que me remito a tu propio mensaje del otro tema (ya sabrás de lo que te hablo)... Citar Estoy pidiendo ayuda porque NO SÉ HACERLO , no quiero que nadie me lo haga sólo quiero ayuda crack mastodonte Aquí el tema (que no está muy lejos): https://foro.elhacker.net/bases_de_datos/ejercicio_algebra_relacional-t503904.0.htmlPorque siendo dos cuentas nuevas, recién creadas y para el mismo problema... Las probabilidades de que ambas cuentas sean de la misma persona son muy altas. Visto que no tenía respuestas el otro tema pues habrás optado por hacer una cuenta nueva para "engañarnos" a todos, has añadido una consulta básica que no hace nada para que parezca que lo has intentado pero tu objetivo sigue siendo que te lo den hecho. Título: Re: Ejer Alg relacional Publicado por: rubcr en 15 Abril 2020, 23:40 pm Te he puesto la operación entera pero explicada por partes tanto con teoría como con ejemplos para que se vea lo que hace cada cosa. Te estoy pidiendo la operación entera porque los ejemplos no los entiendo, y no la otra cuenta no soy yo.Que me pidas "la operación entera" me da a entender que quieres copiar la solución tal cual y no preocuparte en hacerla tú. Si la teoría la entiendes, deberías entender las explicaciones y si entiendes las explicaciones, deberías saber hacer tú mismo la operación. EDIT: Además que me remito a tu propio mensaje del otro tema (ya sabrás de lo que te hablo)...Aquí el tema (que no está muy lejos): https://foro.elhacker.net/bases_de_datos/ejercicio_algebra_relacional-t503904.0.html Porque siendo dos cuentas nuevas, recién creadas y para el mismo problema... Las probabilidades de que ambas cuentas sean de la misma persona son muy altas. Visto que no tenía respuestas el otro tema pues habrás optado por hacer una cuenta nueva para "engañarnos" a todos, has añadido una consulta básica que no hace nada para que parezca que lo has intentado pero tu objetivo sigue siendo que te lo den hecho. Somo más gente en una clase con el mismo problema. Título: Re: Ejer Alg relacional Publicado por: K-YreX en 15 Abril 2020, 23:50 pm Te estoy pidiendo la operación entera porque los ejemplos no los entiendo, y no la otra cuenta no soy yo. Y si no entiendes una consulta hecha por partes, comentada y con ejemplos... Vas a entender mejor una consulta completa que ocupa dos líneas sin más?Somo más gente en una clase con el mismo problema. Los ejemplos no los entiendes. Muy bien. Pues qué no entiendes de los ejemplos? Lo que es un producto cartesiano? Por qué utilizo la tabla Pedidos? Por qué igualo los códigos de una tabla con los de la otra? Si eres más específico con tu duda, podré hacer otro intento en explicártelo. Por si no lo has notado estoy prefiriendo gastar más tiempo en hacerte una explicación completa que en darte la respuesta y que no la entiendas. Y por estúpida que te parezca la pregunta que quieras hacer te dejo una frase para que te sirva de motivación: "Quien hace una pregunta es ignorante cinco minutos; quien no la hace será siempre ignorante." Título: Re: Ejer Alg relacional Publicado por: rubcr en 16 Abril 2020, 00:07 am Y si no entiendes una consulta hecha por partes, comentada y con ejemplos... Vas a entender mejor una consulta completa que ocupa dos líneas sin más? Para empezar, no entiendo por qué usas valores de una tabla que no se pide en el enunciado, no entiendo por qué igualas valores, no entiendo por qué usas productos cartesianos en vez de natural joinLos ejemplos no los entiendes. Muy bien. Pues qué no entiendes de los ejemplos? Lo que es un producto cartesiano? Por qué utilizo la tabla Pedidos? Por qué igualo los códigos de una tabla con los de la otra? Si eres más específico con tu duda, podré hacer otro intento en explicártelo. Por si no lo has notado estoy prefiriendo gastar más tiempo en hacerte una explicación completa que en darte la respuesta y que no la entiendas. Y por estúpida que te parezca la pregunta que quieras hacer te dejo una frase para que te sirva de motivación: "Quien hace una pregunta es ignorante cinco minutos; quien no la hace será siempre ignorante." Título: Re: Ejer Alg relacional Publicado por: K-YreX en 16 Abril 2020, 00:42 am Para empezar, no entiendo por qué usas valores de una tabla que no se pide en el enunciado, no entiendo por qué igualas valores, no entiendo por qué usas productos cartesianos en vez de natural join Qué valores uso de tablas que no se piden en el enunciado? Hay 3 tablas Proveedores, Artículos y Pedidos que son las que estoy usando todo el tiempo, los campos que uso son los que están definidos en el enunciado (quitando los que no son importantes obviamente por escribir menos) y las tablas que te estoy mostrando son ejemplos de filas que tengas guardadas en tus tablas (excepto tabla1 y tabla2 que las he puesto para mostrarte lo que era un producto cartesiano).Una natural join en líneas generales no es otra cosa que un producto cartesiano con dos campos igualados. Las dos consultas siguientes son idénticas. (En algunos casos puedes encontrar especificado en la JOIN cuáles son los campos que se igualan pero si son obvios, se pueden no poner). Código: Sigma(Pedidos.Cod_art = Articulos.Cod_art)(Pedidos x Articulos) Volvemos a hacer lo mismo pero usando JOINS: Para empezar, mirando tu solución: Citar πNombre(Proveedores *(σCOLOR=’ROJO’(Artículos)) ∩ πNombre(Proveedores *(σCOLOR=’VERDE’(Artículos)) No puedes hacer una JOIN entre Proveedores y Artículos porque no tienes un campo/columna que igualar. La tabla que relaciona a los proveedores con los artículos es la tabla Pedidos. Cada pedido está formado por el código del proveedor, el código del artículo que suministra y la cantidad de éste.Objetivo: Nombre de los proveedores que suministran artículos de color rojo y verde. Preguntas que te tienes que hacer:
Ahora el nombre de los proveedores que suministran artículos de color rojo y verde lo podemos obtener como la intersección de los nombres de los proveedores que suministran artículos rojos con los nombres de los que suministran artículos verdes. Vamos haciendo el ejercicio por partes: RFinal (resultado final) = RRojo (resultado rojo) INTERSECCION RVerde (resultado verde) Ahora vamos a calcular primero RRojo que son los nombres de los proveedores que suministran artículos rojos: Empezamos cogiendo de la tabla Artículos los que son de color rojo: Código: R1 = Sigma(color = 'Rojo')(Artículo) Ahora queremos saber qué proveedores han suministrado esos artículos (los rojos). Para saberlo tenemos que utilizar la tabla Pedidos. Como ambas tablas (Pedidos y Artículos) tienen un campo en común (Cod_art) podemos hacer una natural join para obtener los códigos de los proveedores que han suministrado cada uno de los artículos que tenemos: Código: R2 = Pedidos JOIN R1 Código: R3 = Proveedores JOIN R2 Código: RRojo = PI(Nombre)(R3) Ahora tienes que hacer lo mismo con los artículos verdes para obtener RVerde con los nombres de los proveedores que han suministrado artículos verdes. Y cuando lo tengas vas deshaciendo las "variables" (R1, R2,...) para que te quede la consulta completa. Te lo voy a deshacer para RRojo: Código: RRojo = PI(Nombre)(R3) PD: En este caso no te he puesto ejemplos por si era eso lo que te liaba. Pero desde mi punto de vista con los ejemplos es con lo que mejor se ve lo que estás haciendo con cada operación. Título: Re: Ejer Alg relacional Publicado por: rubcr en 16 Abril 2020, 00:55 am Qué valores uso de tablas que no se piden en el enunciado? Hay 3 tablas Proveedores, Artículos y Pedidos que son las que estoy usando todo el tiempo, los campos que uso son los que están definidos en el enunciado (quitando los que no son importantes obviamente por escribir menos) y las tablas que te estoy mostrando son ejemplos de filas que tengas guardadas en tus tablas (excepto tabla1 y tabla2 que las he puesto para mostrarte lo que era un producto cartesiano). Muchísimas gracias por gastar tu tiempo en explicarmelo de verdad, estoy empezando en este tipo de cosas y no sabes lo que me cuesta en comprenderlo.Una natural join en líneas generales no es otra cosa que un producto cartesiano con dos campos igualados. Las dos consultas siguientes son idénticas. (En algunos casos puedes encontrar especificado en la JOIN cuáles son los campos que se igualan pero si son obvios, se pueden no poner). Código: Sigma(Pedidos.Cod_art = Articulos.Cod_art)(Pedidos x Articulos) Volvemos a hacer lo mismo pero usando JOINS: Para empezar, mirando tu solución:No puedes hacer una JOIN entre Proveedores y Artículos porque no tienes un campo/columna que igualar. La tabla que relaciona a los proveedores con los artículos es la tabla Pedidos. Cada pedido está formado por el código del proveedor, el código del artículo que suministra y la cantidad de éste. Objetivo: Nombre de los proveedores que suministran artículos de color rojo y verde. Preguntas que te tienes que hacer:
Ahora el nombre de los proveedores que suministran artículos de color rojo y verde lo podemos obtener como la intersección de los nombres de los proveedores que suministran artículos rojos con los nombres de los que suministran artículos verdes. Vamos haciendo el ejercicio por partes: RFinal (resultado final) = RRojo (resultado rojo) INTERSECCION RVerde (resultado verde) Ahora vamos a calcular primero RRojo que son los nombres de los proveedores que suministran artículos rojos: Empezamos cogiendo de la tabla Artículos los que son de color rojo: Código: R1 = Sigma(color = 'Rojo')(Artículo) Ahora queremos saber qué proveedores han suministrado esos artículos (los rojos). Para saberlo tenemos que utilizar la tabla Pedidos. Como ambas tablas (Pedidos y Artículos) tienen un campo en común (Cod_art) podemos hacer una natural join para obtener los códigos de los proveedores que han suministrado cada uno de los artículos que tenemos: Código: R2 = Pedidos JOIN R1 Código: R3 = Proveedores JOIN R2 Código: RRojo = PI(Nombre)(R3) Ahora tienes que hacer lo mismo con los artículos verdes para obtener RVerde con los nombres de los proveedores que han suministrado artículos verdes. Y cuando lo tengas vas deshaciendo las "variables" (R1, R2,...) para que te quede la consulta completa. Te lo voy a deshacer para RRojo: Código: RRojo = PI(Nombre)(R3) PD: En este caso no te he puesto ejemplos por si era eso lo que te liaba. Pero desde mi punto de vista con los ejemplos es con lo que mejor se ve lo que estás haciendo con cada operación. Ya me ha quedado claro. Te vuelvo a dar las gracias por todo. Un saludo Título: Re: Ejer Alg relacional Publicado por: rubcr en 16 Abril 2020, 01:38 am Qué valores uso de tablas que no se piden en el enunciado? Hay 3 tablas Proveedores, Artículos y Pedidos que son las que estoy usando todo el tiempo, los campos que uso son los que están definidos en el enunciado (quitando los que no son importantes obviamente por escribir menos) y las tablas que te estoy mostrando son ejemplos de filas que tengas guardadas en tus tablas (excepto tabla1 y tabla2 que las he puesto para mostrarte lo que era un producto cartesiano). Perdona que te moleste otra vez.Una natural join en líneas generales no es otra cosa que un producto cartesiano con dos campos igualados. Las dos consultas siguientes son idénticas. (En algunos casos puedes encontrar especificado en la JOIN cuáles son los campos que se igualan pero si son obvios, se pueden no poner). Código: Sigma(Pedidos.Cod_art = Articulos.Cod_art)(Pedidos x Articulos) Volvemos a hacer lo mismo pero usando JOINS: Para empezar, mirando tu solución:No puedes hacer una JOIN entre Proveedores y Artículos porque no tienes un campo/columna que igualar. La tabla que relaciona a los proveedores con los artículos es la tabla Pedidos. Cada pedido está formado por el código del proveedor, el código del artículo que suministra y la cantidad de éste. Objetivo: Nombre de los proveedores que suministran artículos de color rojo y verde. Preguntas que te tienes que hacer:
Ahora el nombre de los proveedores que suministran artículos de color rojo y verde lo podemos obtener como la intersección de los nombres de los proveedores que suministran artículos rojos con los nombres de los que suministran artículos verdes. Vamos haciendo el ejercicio por partes: RFinal (resultado final) = RRojo (resultado rojo) INTERSECCION RVerde (resultado verde) Ahora vamos a calcular primero RRojo que son los nombres de los proveedores que suministran artículos rojos: Empezamos cogiendo de la tabla Artículos los que son de color rojo: Código: R1 = Sigma(color = 'Rojo')(Artículo) Ahora queremos saber qué proveedores han suministrado esos artículos (los rojos). Para saberlo tenemos que utilizar la tabla Pedidos. Como ambas tablas (Pedidos y Artículos) tienen un campo en común (Cod_art) podemos hacer una natural join para obtener los códigos de los proveedores que han suministrado cada uno de los artículos que tenemos: Código: R2 = Pedidos JOIN R1 Código: R3 = Proveedores JOIN R2 Código: RRojo = PI(Nombre)(R3) Ahora tienes que hacer lo mismo con los artículos verdes para obtener RVerde con los nombres de los proveedores que han suministrado artículos verdes. Y cuando lo tengas vas deshaciendo las "variables" (R1, R2,...) para que te quede la consulta completa. Te lo voy a deshacer para RRojo: Código: RRojo = PI(Nombre)(R3) PD: En este caso no te he puesto ejemplos por si era eso lo que te liaba. Pero desde mi punto de vista con los ejemplos es con lo que mejor se ve lo que estás haciendo con cada operación. En la parte de join pedidos, no sería necesaria escribir pi cod_articulo porque se entiende que se utiliza? Título: Re: Ejer Alg relacional Publicado por: K-YreX en 16 Abril 2020, 02:59 am Perdona que te moleste otra vez. Puedes especificarlo, sí, para así no trabajar con todas las columnas. Las columnas necesarias de cada tabla son:En la parte de join pedidos, no sería necesaria escribir pi cod_articulo porque se entiende que se utiliza?
El resto de columnas del enunciado son innecesarias. Puedes ir haciendo una proyección (PI()) de las columnas que necesitas para no trabajar con todas. Eso demuestra que sabes optimizar las consultas eliminando lo que no necesitas pero también hará que te queden las soluciones un poco más largas. Es por eso que he preferido dejar todas las columnas hasta el final y al final hacer la proyección del nombre solo (PI(nombre)). Pero respecto a tu consulta, necesario no es ya que al no decir nada nos estamos quedando con todas las columnas. Y en caso de que te refieras a que si es necesario especificar que la join entre Pedidos y Artículos se va a hacer por medio de la columna cod_art, no es necesario ya que es la única columna que tienen en común y además son claves (llevan #) por lo que se sobrentiende que la join se va a hacer por medio de esa columna. Pero en este caso no se usaría PI() para indicar eso. Título: Re: Ejer Alg relacional Publicado por: rubcr en 16 Abril 2020, 17:37 pm Puedes especificarlo, sí, para así no trabajar con todas las columnas. Las columnas necesarias de cada tabla son: Hola buenas, me ha surgido una pequeña cuestión, por qué se utiliza una intersección en vez de una unión?.
El resto de columnas del enunciado son innecesarias. Puedes ir haciendo una proyección (PI()) de las columnas que necesitas para no trabajar con todas. Eso demuestra que sabes optimizar las consultas eliminando lo que no necesitas pero también hará que te queden las soluciones un poco más largas. Es por eso que he preferido dejar todas las columnas hasta el final y al final hacer la proyección del nombre solo (PI(nombre)). Pero respecto a tu consulta, necesario no es ya que al no decir nada nos estamos quedando con todas las columnas. Y en caso de que te refieras a que si es necesario especificar que la join entre Pedidos y Artículos se va a hacer por medio de la columna cod_art, no es necesario ya que es la única columna que tienen en común y además son claves (llevan #) por lo que se sobrentiende que la join se va a hacer por medio de esa columna. Pero en este caso no se usaría PI() para indicar eso. Título: Re: Ejer Alg relacional Publicado por: K-YreX en 16 Abril 2020, 20:10 pm La unión es como el "o" de toda la vida. Si usases una unión obtendrías: los proveedores que suministran artículos rojos o verdes.
La intersección es como la "y" de toda la vida. Si usas la intersección obtienes: los proveedores que suministran artículos rojos y verdes. Código: Tabla 1: Título: Re: Ejer Alg relacional Publicado por: rubcr en 16 Abril 2020, 20:51 pm La unión es como el "o" de toda la vida. Si usases una unión obtendrías: los proveedores que suministran artículos rojos o verdes. De acuerdo, muchísimas gracias.La intersección es como la "y" de toda la vida. Si usas la intersección obtienes: los proveedores que suministran artículos rojos y verdes. Código: Tabla 1: Título: Re: Ejer Alg relacional Publicado por: rubcr en 17 Abril 2020, 20:01 pm La unión es como el "o" de toda la vida. Si usases una unión obtendrías: los proveedores que suministran artículos rojos o verdes. La intersección es como la "y" de toda la vida. Si usas la intersección obtienes: los proveedores que suministran artículos rojos y verdes. Código: Tabla 1: Buenas tardes, perdona que te moleste. Tengo un ejercicio nuevo pero le tengo resuelto ya, el apartado a creo que está bien pero en los demás dudo por los natural join y no se como aplicarlos muy bien. El ejer es el siguiente: Dadas las siguientes tablas. BOMBERO(#Cod_Bom, Nombre, Apellidos, Fecha_Nac, DNI, Dirección, Teléfono, Cod_Parque, Cod_Eq, Puesto) PARQUE BOMBEROS(#Cod_Parque, Nombre, Dirección, Teléfono, Categoría) EQUIPO(#Cod_Eq, Nombre) PETICION_SERVICIO(#Cod_Pet_Serv, Tipo_Serv, Grado_Urgencia, Cod_Eq) RECIBE(#Cod_Parque, #Cod_Pet_Serv, Fecha, Hora) Se pide: a) Código de todas las peticiones de servicio de gravedad 7. b) Código de todas las peticiones de servicio de gravedad 7 recibidas por el parque de bomberos “Casa de Campo”. c) Códigos de todos los equipos que respondieron a cualquier petición de servicio de gravedad 7 recibidas por el parque de bomberos “Casa de Campo”. d)Nombre de los bomberos que pertenecen a cualquier equipo que respondiera a cualquier petición de servicio de gravedad 7 recibida por el parque de bomberos “Casa de Campo”. Mis soluciones son: a)Pi(CodPeticion) (Sigma(grado = 7) (peticiones)) b)(Pi(CodParque) (Sigma Nombre = C.campo) (Parque) ∗ Recibe) ∩ (π (CodPeticion) Sigma (Grado = 7) (Peticiones)) ∗ Recibe) c)Pi(CodEquipo) (BOMBEROS * ((CodParque) (Sigma Nombre = C.campo) (Parque) ∗ Recibe) ∩ (Pi(CodPeticion) Sigma(Grado = 7) (Peticiones)) ∗ Recibe)) d)Pi(Nombre) (Bombero * ((CodParque) (Sigma Nombre = C.campo) (Parque) ∗ Recibe) ∩ (Pi(CodPeticion)Sigma(Grado = 7) (Peticiones)) ∗ Recibe)) Título: Re: Ejer Alg relacional Publicado por: K-YreX en 18 Abril 2020, 16:57 pm Dadas las siguientes tablas. BOMBERO(#Cod_Bom, Nombre, Apellidos, Fecha_Nac, DNI, Dirección, Teléfono, Cod_Parque, Cod_Eq, Puesto) PARQUE BOMBEROS(#Cod_Parque, Nombre, Dirección, Teléfono, Categoría) EQUIPO(#Cod_Eq, Nombre) PETICION_SERVICIO(#Cod_Pet_Serv, Tipo_Serv, Grado_Urgencia, Cod_Eq) RECIBE(#Cod_Parque, #Cod_Pet_Serv, Fecha, Hora) Se pide: a) Código de todas las peticiones de servicio de gravedad 7. b) Código de todas las peticiones de servicio de gravedad 7 recibidas por el parque de bomberos “Casa de Campo”. c) Códigos de todos los equipos que respondieron a cualquier petición de servicio de gravedad 7 recibidas por el parque de bomberos “Casa de Campo”. d)Nombre de los bomberos que pertenecen a cualquier equipo que respondiera a cualquier petición de servicio de gravedad 7 recibida por el parque de bomberos “Casa de Campo”. Mis soluciones son: a)Pi(CodPeticion) (Sigma(grado = 7) (peticiones)) b)(Pi(CodParque) (Sigma Nombre = C.campo) (Parque) ∗ Recibe) ∩ (π (CodPeticion) Sigma (Grado = 7) (Peticiones)) ∗ Recibe) c)Pi(CodEquipo) (BOMBEROS * ((CodParque) (Sigma Nombre = C.campo) (Parque) ∗ Recibe) ∩ (Pi(CodPeticion) Sigma(Grado = 7) (Peticiones)) ∗ Recibe)) d)Pi(Nombre) (Bombero * ((CodParque) (Sigma Nombre = C.campo) (Parque) ∗ Recibe) ∩ (Pi(CodPeticion)Sigma(Grado = 7) (Peticiones)) ∗ Recibe))
PD: El foro es para preguntar dudas concretas. No para tener aquí a un grupo de personas para corregirte todos los ejercicios. Para eso están tus profesores que para algo están cobrando... También debería ser suya la obligación de enseñar pero como todos sabemos ya, muchas veces no saben ni lo que dicen... Bueno que me caliento y esto da para un tema entero y tampoco es plan... :silbar: PD 2: Deberías acostumbrarte a usar más Joins y no tantas intersecciones. Con esto ya te doy la pista de que estos ejercicios pueden hacerse sin usar intersecciones. Título: Re: Ejer Alg relacional Publicado por: rubcr en 18 Abril 2020, 17:04 pm
PD: El foro es para preguntar dudas concretas. No para tener aquí a un grupo de personas para corregirte todos los ejercicios. Para eso están tus profesores que para algo están cobrando... También debería ser suya la obligación de enseñar pero como todos sabemos ya, muchas veces no saben ni lo que dicen... Bueno que me caliento y esto da para un tema entero y tampoco es plan... :silbar: PD 2: Deberías acostumbrarte a usar más Joins y no tantas intersecciones. Con esto ya te doy la pista de que estos ejercicios pueden hacerse sin usar intersecciones. Nos ha dado un pdf y nos ha mandado esto sin explicarnos nada, y nos tenemos que buscar la vida empezando en algo nuevo. Título: Re: Ejer Alg relacional Publicado por: K-YreX en 18 Abril 2020, 17:25 pm Pues una recomendación es que busques en Internet cosas de álgebra relacional o consultas SQL directamente si quieres (es muy parecido y así te preparas para lo que viene después). Habrá un montón de sitios donde explican Joins y con ejemplos visuales que es como mejor se ve.
Y cuando tengas una duda concreta de uno de esos sitios en los que hayas buscado es cuando deberías abrir un tema para resolver ese tema en concreto. Al final el aprendizaje va a cuenta de cada uno y aunque te parezca que estás leyendo muchas páginas y que ninguna te sirve, llegará un momento en que todo te encaje y empieces a relacionar lo que acabas de entender con aquello que viste en tal sitio y que en su momento no entendiste. PD: Al margen de lo que está pasando, seguro que tus profesores tienen un correo al que molestarles para que te corrijan los ejercicios. Porque encima los profesores que menos se esfuerzan son luego los más tiquismiquis y te dirán que tal método no sirve o que los hagas de tal forma. Título: Re: Ejer Alg relacional Publicado por: rubcr en 18 Abril 2020, 17:44 pm Pues una recomendación es que busques en Internet cosas de álgebra relacional o consultas SQL directamente si quieres (es muy parecido y así te preparas para lo que viene después). Habrá un montón de sitios donde explican Joins y con ejemplos visuales que es como mejor se ve. En el apartado b, la parte de: recibidas por el parque de bomberos Casa de campo tengo claro que se usa un sigma, pero me has puesto antes que hacer in pi cod_parque no tiene sentido, como se juntaria con la parte del apartado a? Sería con un joint pero entonces la tabla recibe no le vería sentido.Y cuando tengas una duda concreta de uno de esos sitios en los que hayas buscado es cuando deberías abrir un tema para resolver ese tema en concreto. Al final el aprendizaje va a cuenta de cada uno y aunque te parezca que estás leyendo muchas páginas y que ninguna te sirve, llegará un momento en que todo te encaje y empieces a relacionar lo que acabas de entender con aquello que viste en tal sitio y que en su momento no entendiste. PD: Al margen de lo que está pasando, seguro que tus profesores tienen un correo al que molestarles para que te corrijan los ejercicios. Porque encima los profesores que menos se esfuerzan son luego los más tiquismiquis y te dirán que tal método no sirve o que los hagas de tal forma. Título: Re: Ejer Alg relacional Publicado por: K-YreX en 18 Abril 2020, 18:48 pm En el apartado b, la parte de: recibidas por el parque de bomberos Casa de campo tengo claro que se usa un sigma, pero me has puesto antes que hacer in pi cod_parque no tiene sentido, como se juntaria con la parte del apartado a? Sería con un joint pero entonces la tabla recibe no le vería sentido. Citar Código de todas las peticiones de servicio de gravedad 7 recibidas por el parque de bomberos “Casa de Campo”. (Pi(CodParque) (Sigma Nombre = C.campo) (Parque) ∗ Recibe) ∩ (π (CodPeticion) Sigma (Grado = 7) (Peticiones)) ∗ Recibe) Explicado con un ejemplo. Vamos a suponer que los CodParque se forman con "Cpa" + 4 dígitos y los CodPeticion se forman con "CPe" + 4 dígitos. Imagina que haces la primera parte de la intersección. Así obtienes el CodParque de los parques que se llamen C.campo y que hayan recibido alguna petición. Y los CodParque obtenidos son (por ejemplo): Código: CPa0001 Y ahora vamos a hacer la segunda parte de tu intersección. Con ello obtienes los CodPeticion de las peticiones de gravedad 7 y que han sido recibidas por algún parque. Y esto nos da como resultado los siguientes CodPeticion (por ejemplo): Código: CPe0005 Y tu solución es la intersección de ambos (cosa que te adelanto que no se puede hacer porque estás trabajando con campos diferentes CodParque por un lado y CodPeticion por otro... Pero supongamos que se puede hacer la intersección) que es: NADA. 0. Mejor dicho {Vacio}. No hay ninguna coincidencia entre una tabla y otra. Hay dos formas de hacer esto:
Código: (PI(CodPeticion)(SIGMA(Nombre = C.campo)(Parque) JOIN Recibe) INTERSECT (PI(CodPeticion)(SIGMA(gravedad = 7)(Peticion)) La primera parte de la intersección obtiene los CodPeticion de todas las peticiones que haya recibido el parque C.campo. Por ejemplo, siguiendo con el ejemplo de antes: Código: CPe0005 Código: CPe0004 Código: CPe0005 Recalco que la JOIN entre Parque y Recibe se hace por medio de CodParque (campo que tienen ambas en común).
Código: PI(Peticion.CodPeticion)(SIGMA(gravedad = 7)(Parque JOIN Recibe JOIN Peticion) Así tal cual esta consulta es peor porque trabaja con mayor cantidad de datos ya que hemos dejado los SIGMAs y PIs para el final pero eso hace que la consulta quede más simple. Ahora ya papel y boli (o lo que prefieras) y a leer todos los mensajes de este tema con todos los ejemplos que he ido poniendo hasta entenderlo. Creo que ya tienes ejemplos y explicaciones de sobra. :rolleyes: :rolleyes: Título: Re: Ejer Alg relacional Publicado por: rubcr en 18 Abril 2020, 20:28 pm Explicado con un ejemplo. Vamos a suponer que los CodParque se forman con "Cpa" + 4 dígitos y los CodPeticion se forman con "CPe" + 4 dígitos. En la fórmula:Imagina que haces la primera parte de la intersección. Así obtienes el CodParque de los parques que se llamen C.campo y que hayan recibido alguna petición. Y los CodParque obtenidos son (por ejemplo): Código: CPa0001 Y ahora vamos a hacer la segunda parte de tu intersección. Con ello obtienes los CodPeticion de las peticiones de gravedad 7 y que han sido recibidas por algún parque. Y esto nos da como resultado los siguientes CodPeticion (por ejemplo): Código: CPe0005 Y tu solución es la intersección de ambos (cosa que te adelanto que no se puede hacer porque estás trabajando con campos diferentes CodParque por un lado y CodPeticion por otro... Pero supongamos que se puede hacer la intersección) que es: NADA. 0. Mejor dicho {Vacio}. No hay ninguna coincidencia entre una tabla y otra. Hay dos formas de hacer esto:
Código: (PI(CodPeticion)(SIGMA(Nombre = C.campo)(Parque) JOIN Recibe) INTERSECT (PI(CodPeticion)(SIGMA(gravedad = 7)(Peticion)) La primera parte de la intersección obtiene los CodPeticion de todas las peticiones que haya recibido el parque C.campo. Por ejemplo, siguiendo con el ejemplo de antes: Código: CPe0005 Código: CPe0004 Código: CPe0005 Recalco que la JOIN entre Parque y Recibe se hace por medio de CodParque (campo que tienen ambas en común).
Código: PI(Peticion.CodPeticion)(SIGMA(gravedad = 7)(Parque JOIN Recibe JOIN Peticion) Así tal cual esta consulta es peor porque trabaja con mayor cantidad de datos ya que hemos dejado los SIGMAs y PIs para el final pero eso hace que la consulta quede más simple. Ahora ya papel y boli (o lo que prefieras) y a leer todos los mensajes de este tema con todos los ejemplos que he ido poniendo hasta entenderlo. Creo que ya tienes ejemplos y explicaciones de sobra. :rolleyes: :rolleyes: (PI(CodPeticion)(SIGMA(Nombre = C.campo)(Parque) JOIN Recibe) INTERSECT (PI(CodPeticion)(SIGMA(gravedad = 7)(Peticion)) (PI(CodPeticion) de la parte de la izquierda de la intersección, sería de la tabla recibe? Título: Re: Ejer Alg relacional Publicado por: K-YreX en 18 Abril 2020, 20:37 pm En la fórmula: Obviamente. La tabla Parque no tiene ninguna columna CodPeticion.(PI(CodPeticion)(SIGMA(Nombre = C.campo)(Parque) JOIN Recibe) INTERSECT (PI(CodPeticion)(SIGMA(gravedad = 7)(Peticion)) (PI(CodPeticion) de la parte de la izquierda de la intersección, sería de la tabla recibe? Título: Re: Ejer Alg relacional Publicado por: rubcr en 18 Abril 2020, 21:19 pm Obviamente. La tabla Parque no tiene ninguna columna CodPeticion. En el apartado C me ha surgido una duda, como junto los códigos de los equipos con el resto de la operación?Supongo que un joint porque con una intersección no me cuadra. Y al obtener esos código a parte del sigma también se usaría pi cod pet servicio como el anterior apartado? Título: Re: Ejer Alg relacional Publicado por: K-YreX en 18 Abril 2020, 22:32 pm Dadas las siguientes tablas. BOMBERO(#Cod_Bom, Nombre, Apellidos, Fecha_Nac, DNI, Dirección, Teléfono, Cod_Parque, Cod_Eq, Puesto) PARQUE BOMBEROS(#Cod_Parque, Nombre, Dirección, Teléfono, Categoría) EQUIPO(#Cod_Eq, Nombre) PETICION_SERVICIO(#Cod_Pet_Serv, Tipo_Serv, Grado_Urgencia, Cod_Eq) RECIBE(#Cod_Parque, #Cod_Pet_Serv, Fecha, Hora) Se pide: a) Código de todas las peticiones de servicio de gravedad 7. b) Código de todas las peticiones de servicio de gravedad 7 recibidas por el parque de bomberos “Casa de Campo”. c) Códigos de todos los equipos que respondieron a cualquier petición de servicio de gravedad 7 recibidas por el parque de bomberos “Casa de Campo”. d)Nombre de los bomberos que pertenecen a cualquier equipo que respondiera a cualquier petición de servicio de gravedad 7 recibida por el parque de bomberos “Casa de Campo”. Si necesitas CodEq, tendrás que mirar en todas las tablas para ver dónde tienes ese dato y luego ver de todas las tablas que lo tengan, cuál es el que necesitas usar. Para ahorrarme un mensaje: En este caso tienes un CodEq en la tabla Peticion y esa tabla ya la usabas en la consulta del apartado b, por lo que solo tienes que cambiar el campo seleccionado con PI() de CodPeticion a CodEq... Para qué quieres usar PI(CodPetServ)?? Estás buscando el código de la petición?? Yo creo que no. Título: Re: Ejer Alg relacional Publicado por: rubcr en 18 Abril 2020, 22:43 pm Si necesitas CodEq, tendrás que mirar en todas las tablas para ver dónde tienes ese dato y luego ver de todas las tablas que lo tengan, cuál es el que necesitas usar. Para el apartado d simplemente se haria pi Nombre de la tabla bomberos y natural join con lo demás (apartado c)? Y si es así se pondría en la parte derecha de la intersección?Para ahorrarme un mensaje: En este caso tienes un CodEq en la tabla Peticion y esa tabla ya la usabas en la consulta del apartado b, por lo que solo tienes que cambiar el campo seleccionado con PI() de CodPeticion a CodEq... Para qué quieres usar PI(CodPetServ)?? Estás buscando el código de la petición?? Yo creo que no. |