Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Basi di dati ~ informatica triennale
 
appello 10 aprile 2006
Clicca QUI per vedere il messaggio nel forum
middu
Si consideri lo schema relazionale seguente, relativo ad una base di dati di gestione ordini per consegne di pizze a domicilio (le chiavi primarie delle relazioni sono sottolineate):
CLIENTE (Nr.telefono, Nome, Indirizzo)
ORDINE (Nr.telefono, Codice-Pizza, Codice-Operatore, Data, Costo)
PIZZA (Codice-Pizza, Nome, Prezzo)

Ditemi se la soluzione è giusta : determinare numero di telefono dei clienti che hanno ordinato sia pizza margherita che pizza marinara .

∏nr_telefono(ORDINE * (∏codice-pizza(δnome = 'margherita'(PIZZA))))

intersezione
∏nr_telefono(ORDINE * (∏codice-pizza(δnome = 'marinara'(PIZZA))))

middu
altro pezzo dell'esercizio :determinare telefono e nome dei clienti che non hanno ordinato pizze in gennaio 2006.

∏nr_telefono,nome(CLIENTE)
-
∏nr_telefono,nome(CLIENTE * (∏nr_telefono(δdata ='gennaio 2006'(ORDINE))))

number15
Devo ripassarla perché non me la ricordo più benissimo, però forse conviene anticipare la proiezione:

(∏nr_telefono,nome(CLIENTE)
-
(∏nr_telefono,nome(CLIENTE) * (∏nr_telefono(δdata ='gennaio 2006'(ORDINE)))))

Come ti sembra?

middu
ma la mia domanda è la risuposta è giusta o è da modificare???

number15
Eh, se guardi la mia è diversa: quindi se dai per giusta la mia devi modificarla.
Sarebbero giuste entrambe, ma nel mio caso anticipi la proiezione, quindi fai il join tra il numero di telefono di ordine (dopo la selezione) con nr. di tel e nome di cliente, mentre con la tua versione ti portavi nel join anche l'indirizzo di cliente.

middu
uguale alla mia

middu
prova a guardare anche la prima per favore

middu
quindi devo chiudere la parentesi in cliente ???

number15
Ti butto giù una roba a colori e te la posto, così vediamo se mi spiego meglio. Dammi un paio di minuti.

Edit: sbagliato una roba. Te la riposto

middu
quindi devo chiudere la parentesi in cliente ???

number15
Si, ma devi anche aprirla davanti. Tu stai facendo il join su tutto cliente, mentre invece di anticipare la proiezione.



Idem per la prima.

middu
quindi da quello che ho capito : devo mettere le parentesi all'inizio delle due proiezioni e chiuderle alla fine !!!!

middu
vediamo se ho capito.Adesso mi faccio un altro esercizio e poi vediamo

number15
Rifai il primo, che a mio avviso è sbagliato pure quello, sempre per lo stesso motivo

middu
ma tu hai fatto l'esame???

number15
Non ancora, faccio l'appello di giugno, ma l'ho preparato già 2 volte: una volta mi son scordato di iscrivermi, e la volta dopo hanno spostato la data di esame e non ero in Italia.

middu
(∏nr_telefono(ORDINE) * (∏codice-pizza(δnome = 'margherita'(PIZZA)))

intersezione
(∏nr_telefono(ORDINE * (∏codice-pizza(δnome = 'marinara'(PIZZA)))))



Ieri alle 16:50

middu
ah no io faccio l'appello di luglio.Controlla per fevavore la risposta modificata

number15
No, così stai andando a joinnare codice_pizza(PIZZA) con nr_tel(ORDINE).

middu
∏nr_telefono((∏nr_telefono(ORDINE)) * (∏codice-pizza(δnome = 'margherita'(PIZZA))))

intersezione
∏nr_telefono((∏nr_telefono(ORDINE) * (∏codice-pizza(δnome = 'marinara'(PIZZA))))))
Non so se le parentesi sono chiuse bene

middu
∏nr_telefono((∏nr_telefono,codice-pizza(δnome = 'margherita'(ORDINE * PIZZA)))))

intersezione
∏nr_telefono(∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA)))

o è giusta questa ???

number15
Non ancora, è una via di mezzo tra le due. Però più o meno hai capito, il discorso delle proiezioni è giusto, ma hai fatto casino con ORDINE

middu
∏nr_telefono(ORDINE) *((∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA))

intersezione
∏nr_telefono (ORDINE) *((∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA)))))

middu
(∏nr_telefono(ORDINE) *((∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA))

intersezione
∏nr_telefono (ORDINE) *((∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA))))))

number15
∏nr_telefono((∏nr_telefono(ORDINE))* (∏codice-pizza....

Qua, a prescindere dalle parentesi, stai joinnando codice_pizza con nr_di tel e non puoi.

∏nr_telefono((∏nr_telefono,codice-pizza(δnome = 'margherita'(ORDINE * PIZZA)))))

Qua joinni tutto ordine con tutto pizza e poi selezioni le margherite...


∏nr_telefono(ORDINE) *((∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA))

Qua stai joinnando nr_telefono con nr_tel e codice pizza di Pizza (nr_tel di pizza non esiste)

middu
∏nr_telefono(ORDINE *((∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA)

intersezione
∏nr_telefono (ORDINE) *((∏nr_telefono,codice-pizza(δnome = 'margherita'(PIZZA))))))

middu
∏nr_telefono((∏nr_telefono,codice-pizza(ORDINE *(∏codice-pizza(δnome = 'margherita'(PIZZA)))

intersezione
∏nr_telefono((∏nr_telefono,codice-pizza(ORDINE *(∏codice-pizza(δnome = 'marinara(PIZZA)))))

number15
Quasi perfetto (però ci sei quasi).
Stai rifacendo l'errore della prima richiesta (quella con la sottrazione).

middu
∏nr_telefono((∏nr_telefono,codice-pizza(ORDINE) *(∏codice-pizza(δnome = 'margherita'(PIZZA)))

intersezione
∏nr_telefono((∏nr_telefono,codice-pizza(ORDINE) *(∏codice-pizza(δnome = 'marinara(PIZZA)))))

number15
Il senso è giusto... occhio alle parentesi. Parti sempre dalla fine.
Ad esempio, nella prima riga, hai (pizza), (margherita PIZZA), (codice_pizza margherita) e (ordine).
Le parentesi all'inizio non si chiudono.
Ti posto come la farei io (con un bordello di parentesi, però a mio avviso necessarie, tranne forse quelle che racchiudono il blocco)


((∏nr_telefono(∏nr_telefono,codice_pizza (ORDINE) * (∏codice-pizza(δnome = 'margherita'(PIZZA))))

intersezione
(∏nr_telefono(∏nr_telefono,codice_pizza (ORDINE) * (∏codice-pizza(δnome = 'marinara'(PIZZA))))))

middu
possiamo vedere un'altro esercizio ???

number15
Se sono ancora qua e so farlo volentieri (magari se qualcun'altro si intromettesse nel discorso meglio...., per aver conferma che non sto dicendo cagate, anche se comunque capendo penso che ti sembrano anche a te corrette).

Comunque ti consiglio le videolezioni con ferrara (quelle sulle esercitazioni) e i pdf di esercitazione. Anche per capire meglio le parentesi, che all'inizio sembrano sempre davvero troppe.

middu
Si consideri il seguente schema relazionale (le chiavi primarie sono sottolineate):
VENDITA(CodVend,CodCli,CodProd,Qta)
VENDITORE(Codice,Nome, Città)
CLIENTE(CodiceCli,NomeCli,CittàCli)

middu
determinare codice e nome dei venditori che hanno effettuato vendite a clienti milanesi;

middu
(∏codice,nome(VENDITORE)) * (∏codice(ρcodice-codicevend(VENDITA)) * (∏codicecli(σcittcli = 'milano'(CLIENTI))))

number15
Mi sfugge cosa hai fatto: hai ridenominato codicevend in codice pef joinnarlo con codice di venditore?

Edit: se vuoi ti posto la mia con gli equijoin (poi se vuoi te puoi usare le ridenominazioni)

middu
OK

number15
(∏Codice,Nome(VENDITORE) *Codice=CodVend
(∏CodVend (∏CodVend,CodCli(VENDITA) *CodCli=CodiceCli
(∏CodiceCli(σCittàCli = 'Milano'(CLIENTI))))))

middu
(∏codice,nome(VENDITORE)) || codice =codicevend (∏codicevend(VENDITA) * (∏codicecli(σcittacli ='milano(CLIENTE))));

middu
determinare codice dei venditori che hanno venduto solo a clienti della propria città.

middu
PUBBLICAZIONE (CodiceP, Titolo, Giorno-Pubblicazione, Mese-Pubblicazione,
Anno-Pubblicazione, Ricercatore, Argomento, Abstract)
RICERCATORE (CodiceR, Nome, Cognome, Email)

middu
determinare i ricercatori che non hanno scritto pubblicazioni di Algoritmi

number15
Non ti sto più dietro così, metti troppa roba :D.
Poi mi si impalla pure il dsy.
Ti rispondo alla larga, poi nel caso ci risentiamo stasera.
Per quella delle città così su due piedi non mi viene.
Per la seconda mi sembra che sia il caso in cui tu debba prendere quelli che hanno scritto pubblicazioni di algoritmi e levarli da tutti gli altri.
Se hai msn scrivi qui o mandami un pm che ti dico qualcosa veloce lì, che poi inizio a studiare.

middu
berra@hotmail.it;

number15
Mi son accorto di un errore che ho fatto praticamente in tutte (di solito io non uso la parentesi per indicare le tabelle, metto solo il nome maiuscolo):
Es: Questa
(∏Codice,Nome(VENDITORE) *Codice=CodVend
(∏CodVend (∏CodVend,CodCli(VENDITA) *CodCli=CodiceCli
(∏CodiceCli(σCittàCli = 'Milano'(CLIENTI))))))

è così (credo):
((∏Codice,Nome(VENDITORE)) *Codice=CodVend
(∏CodVend ((∏CodVend,CodCli(VENDITA)) *CodCli=CodiceCli
(∏CodiceCli(σCittàCli = 'Milano'(CLIENTI))))))

Comunque scrivile così:
((∏Codice,Nome VENDITORE) *Codice=CodVend
(∏CodVend ((∏CodVend,CodCli VENDITA) *CodCli=CodiceCli
(∏CodiceCli(σCittàCli = 'Milano' CLIENTI))))))

Idem per tutte le altre: guarda quello che ho scritto qua e sistemale.

middu
ho questo esercizio e vedere se ho capito :

SCRITTORE(NOME,AnnoNascita,Annomorte*)
LIBRO(TITOLO,AUTORE,Genere,CasaEditrice,Anno,Copie
)

in cui l'attributo Anno di morte ha valore nullo per gli scrittori viventi.
Esprimere la seguente interrogazione in algebra relazionale "Trovare le case editrici che hanno pubblicato solo libri di fantascienza.
(∏CasaEditrice(LIBRO)
-
∏CasaEdirtice(σgenere ¥ 'fantascienza'(LIBRO)))

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate