Spiegazione sull'algebra relazionale

Messaggioda palladino.al » 18/01/2024, 15:52

Ciao a tutti raga, mi stavo esercitando un pò sulle algebre relazionali e mi è venuto questo dubbio:
Ho questa relazione:

Si consideri il database che contiene le seguenti relazioni:
DEPUTATI (Codice, Cognome, Nome, Commissione, Provincia,Collegio)
COLLEGI (Provincia , Numero, Nome)
PROVINCE (Sigla, Nome, Regione)
REGIONI (Codice, Nome)
COMMISSIONI (Numero, Nome, Presidente)

Con i Vincoli di integrità referenziale tra:
Commissioni.Presidente e Deputati.Codice
Deputati.Commissione e Commissioni.Numero
Deputati.Provincia e Province.Sigla
Deputati.Collegio e Collegi.Numero
Province.Regioni e Regioni.Codice
Collegi.Provincia e Province.Sigla

Sto risolvendo la query: Trovare nome e cognome dei presidenti di commissioni cui partecipa
almeno un deputato eletto in una provincia della Sicilia

$\pi Nome, Cognome(Deputati \bowtie_ {Presidente=codice}$\\
$(Commissioni\bowtie_{Numero=Commisioni}(Deputati\bowtie_{Provincia=Sigla}$\\
$(Province\bowtie_{Regione=Codice}(\sigma_{Nome=’Sicilia’} (Regioni)))))$\\

Mentre come soluzione ho:

$\pi Nom, Cognom((\rho_{Nom \leftarrow Nome, Cogn \leftarrow Cognome}(Deputati) \bowtie_ {Presidente=codice}$\\
$(Commissioni\bowtie_{Numero=Commisioni}(\rho Comm \leftarrow Commissione)(Deputati\bowtie_{Provincia=Sigla}$\\
$(Province\bowtie_{Regione=Codice}(\sigma_{Nome=’Sicilia’} (Regioni)))))$\\

Quale è quella giusta?
P.S. Ho spezzato la scrittura solo perchè nello stesso rigo non entrava tutta
palladino.al
Starting Member
Starting Member
 
Messaggio: 6 di 11
Iscritto il: 08/07/2019, 11:39

Re: Spiegazione sull'algebra relazionale

Messaggioda apatriarca » 19/01/2024, 12:01

Per prima cosa, espressioni di questo tipo non sono in generale uniche. Quindi più che altro c'è da chiedersi se la tua query è corretta anche se diversa da quella fornita dal professore/libro/dispensa/... L'idea di costruire un'algebra delle relazioni è in effetti proprio quella di poter manipolare gli elementi delle espressioni in modo da ottimizzare le query.

Prima di tutto il modo probabilmente più leggibile per rompere una espressione complessa come questa è quella di definire delle relazioni temporanee come segue per la tua soluzione.
\[
\begin{align*}
\mathrm{SICILIA} &= \sigma_{\mathrm{Node}=\mathrm{'Sicilia'}}\,\mathrm{REGIONI} \\
\mathrm{PROV\_SICILIA} &= \mathrm{PROVINCE} \Join_{\mathrm{Regione}=\mathrm{Codice}} \mathrm{SICILIA} \\
\mathrm{DEP\_SICILIA} &= \mathrm{DEPUTATI} \Join_{\mathrm{Provincia}=\mathrm{Sigla}} \mathrm{PROV\_SICILIA} \\
\mathrm{COM\_DEP\_SICILIA} &= \mathrm{COMMISSIONI} \Join_{\mathrm{Numero}=\mathrm{Commissione}} \mathrm{DEP\_SICILIA} \\
\mathrm{PRESIDENTI} &= \mathrm{DEPUTATI} \Join_{\mathrm{Presidente}=\mathrm{Codice}} \mathrm{COM\_DEP\_SICILIA} \\
\mathrm{RISULTATO} &= \pi_{\mathrm{Nome}, \mathrm{Cognome}} \mathrm{PRESIDENTI}
\end{align*}
\]
A questo punto vediamo che cosa abbiamo ad ogni passaggio e se sono corrette:
1. Il primo passaggio abbiamo semplicemente una singola tupla corrispondente alla regione Sicilia. Questa avrà attributi (Codice, Nome).
2. Al secondo passaggio stiamo selezionando le province siciliane. Per farlo costruiamo una join tra REGIONI e PROVINCE. Nota che Nome appare in entrambe le relazioni. Gli attributi saranno quindi (PROVINCE.Sigla, PROVINCE.Nome, PROVINCE.Regione=REGIONI.Codice, REGIONI.Nome).
3. In questo passaggio aggiungiamo i deputati alla tabella con un'altra join. Di nuovo abbiamo Nome come attributo. Quindi a questo punto abbiamo gli attributi (DEPUTATI.Codice, DEPUTATI.Cognome, DEPUTATI.Nome, DEPUTATI.Commissione, DEPUTATI.Provincia=PROVINCE.Sigla, DEPUTATI.Collegio, PROVINCE.Nome, PROVINCE.Regione=REGIONI.Codice, REGIONI.Nome).
4. Fino al punto precedente non c'erano differenze tra la tua soluzione e quella corretta. A questo punto però la soluzione del professore rinomina Commissione in Comm prima di fare una join su Commissione. Non mi è chiaro devo dire questo passaggio perché rende la join impossible. Per cui continuo con la tua soluzione. Otteniamo delle tuple con un sacco di attributi: (COMMISSIONI.Numero=DEPUTATI.Commissione, COMMISSIONI.Nome, COMMISSIONI.Presidente, DEPUTATI.Codice, DEPUTATI.Cognome, DEPUTATI.Nome, DEPUTATI.Provincia=PROVINCE.Sigla, DEPUTATI.Collegio, PROVINCE.Nome, PROVINCE.Regione=REGIONI.Codice, REGIONI.Nome).
5. A questo punto stai cercando di ottenere il presidente facendo una join tra la relazione che hai ottenuto e quella nuovamente DEPUTATI. Il problema che la rinominazione sta cercando di risolvere è quello di avere un sacco di attribute Nome. A quale di questi attributi deve fare riferimento la successiva proiezione? In questo caso direi quindi che la rinominazione è necessaria.

Siccome ho detto che è possibile avere espressioni diverse per la stessa query, osserva che è ad esempio possible fare delle proiezioni per ottenere solo quello che ci serve come segue:
\[
\begin{align*}
\mathrm{COD\_SICILIA} &= \pi_{\mathrm{Codice}}\,\sigma_{\mathrm{Node}=\mathrm{'Sicilia'}}\,\mathrm{REGIONI} \\
\mathrm{SIGLA\_PROV\_SICILIA} &= \pi_{\mathrm{Sigla}}\,(\mathrm{PROVINCE} \Join_{\mathrm{Regione}=\mathrm{Codice}} \mathrm{COD\_SICILIA}) \\
\mathrm{COM\_DEP\_SICILIA} &= \pi_{\mathrm{Commissione}}\,(\mathrm{DEPUTATI} \Join_{\mathrm{Provincia}=\mathrm{Sigla}} \mathrm{SIGLA\_PROV\_SICILIA}) \\
\mathrm{PRESIDENTI} &= \pi_{\mathrm{Presidente}}\,(\mathrm{COMMISSIONI} \Join_{\mathrm{Numero}=\mathrm{Commissione}} \mathrm{COM\_DEP\_SICILIA}) \\
\mathrm{RISULTATO} &= \pi_{\mathrm{Nome}, \mathrm{Cognome}}\,(\mathrm{DEPUTATI} \Join_{\mathrm{Codice}=\mathrm{Presidente}} \mathrm{PRESIDENTI}) \\
\end{align*}
\]
Il risultato è sempre lo stesso ma ha probabilmente caratteristiche diverse quando viene calcolata. Altri modi alternativi di scrivere la query avrebbero potuto essere quella di seguire le seguenti descrizioni (troppo lungo scrivere la query):
* Costruire una relazione PRESIDENTI facendo la join tra DEPUTATI e COMMISSIONI. Fare a questo punto la natural join tra PRESIDENTI e COM_DEP_SICILIA dell'ultimo esempio in modo da estrarre solo i presidenti con commissioni con deputati siciliani.
* Puoi associare ad ogni deputato la sua regione con delle join con PROVINCE e REGIONI e poi fare la selezione per estrarre quelli siciliani. E poi proseguire come negli altri casi.
...
apatriarca
Moderatore
Moderatore
 
Messaggio: 5782 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite