da 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.
...