Note dalle lezioni di INFORMATICA (per gli allievi della classe quinta - indirizzo MERCURIO) “Elem enti di Algebra Relazionale” prof. Stefano D.L.Campanozzi I.T.C. “Giulio Cesare” – Bari - a.s. 2008-2009 S.D.L. Campanozzi – “Note di Algebra relazionale” § 1 – Introduzione Il modello logico relazionale è, di fatto, un modello matematico dei dati, pertanto un qualunque approccio volto alla manipolazione di questo modello e, in particolare, alla sua interrogazione, per apparire naturale, deve avere natura matematica. In questa ottica due sono gli approcci fondamentali: 1. Approccio algebrico, in cui il risultato di una interrogazione è una relazione ottenuta dalla valutazione di una espressione costruita mediante operatori di un’algebra relazionale 2. Approccio logico, in cui il risultato di una interrogazione viene descritto come una relazione soddisfacente una formula di un linguaggio logico del primo ordine (calcolo relazionale) I due approcci sono equivalenti per semantica sia denotazionale, sia operazionale; nondimeno il primo approccio appare più accessibile, richiedendo soltanto la conoscenza di nozioni elementari della teoria degli insiemi; tale approccio sarà oggetto di studio in queste pagine. § 2 – Cosa è l’Algebra Relazionale In matematica con il termine algebra si denota ogni coppia (A, O) dove A è l’insieme di sostegno, ovvero un insieme di valori (operandi), mentre O è un insieme di operazioni su A. Esempi noti sono le algebre dei numeri (e.g.: algebra degli interi, dei reali) e le algebre di Boole. Nel caso dell’algebra relazionale i valori sono le relazioni; le operazioni, agendo su relazioni, restituiscono relazioni. Queste ultime sono “anonime” nel senso che il loro schema ha un nome non definito in modo esplicito dall’utente. Alcune operazioni, di natura insiemistica, agiscono sulle relazioni quali insiemi di tuple, quindi a livello estensionale; altre operazioni, di natura più specifica, operano invece a livello intensionale e, eventualmente, anche a livello estensionale. Inoltre è possibile che operazioni più complesse non siano definite come primitive, ma in forma derivata per composizione di operazioni primitive. Infine, ogni insieme di operatori relazionali deve essere funzionalmente completo, deve cioè consentire la stessa capacità espressiva esibita dall’approccio logico. Un insieme funzionalmente completo è il seguente insieme di operatori: O : = {Unione, Differenza, Prodotto, Proiezione, Restrizione, Ridenominazione} Componendo questi operatori è possibile formulare ogni interrogazione sul modello relazionale dei dati. E’ tuttavia opportuno introdurre altre due operazioni che, pur potendo essere derivate da quelle di base, consentono, se assunte come primitive, di scrivere formule più semplici e sintetiche. In definitiva si assume perciò il seguente insieme di operatori: 2 S.D.L. Campanozzi – “Note di Algebra relazionale” O’: = O ∪ { Intersezione, Giunzione } Prima di procedere alla descrizione delle singole operazioni, formuliamo la seguente definizione, particolarmente utile nel prosieguo: Definizione: Due relazioni si dicono compatibili se hanno lo stesso grado e se gli attributi in posizioni corrispondenti sono dello stesso tipo o di tipi compatibili. In particolare due relazioni con lo stesso schema sono compatibili. § 3 – Operatori dell’Algebra Relazionale 3.1 Operatori primitivi Differenza di relazioni Date due relazioni compatibili R e S, la differenza di R con S è la relazione, compatibile con R e S, ottenuta dalla differenza insiemistica sulle estensioni delle due relazioni nell’ordine assegnato. In simboli: Difference (R, S) = R - S = {t | t ∈ R ∧ t ∉ S} dove il simbolo t indica una generica tupla. Osservazioni 1) Non vale la proprietà commutativa: R - S ≠ S - R ! 2) L’operatore Difference agisce esclusivamente a livello estensionale. Si ha inoltre: • Grado(R - S) = Grado(R) = Grado(S) • 0 ≤ Cardinalità(R - S) ≤ Cardinalità(R) Intersezione di relazioni Date due relazioni compatibili R e S, la intersezione di R e S è la relazione, compatibile con R e S, ottenuta dalla intersezione insiemistica sulle estensioni delle due relazioni. In simboli: Intersection (R, S) = R ∩ S = {t | t ∈ R ∧ t ∈ S} dove il simbolo t indica una generica tupla. 3 S.D.L. Campanozzi – “Note di Algebra relazionale” Osservazioni 1) L’operatore Intersection è derivabile dalla Differenza di relazioni: R ∩ S = R - (R - S) 2) L’operatore Intersection agisce esclusivamente a livello estensionale. Si ha inoltre: • Grado(R ∩ S) = Grado(R) = Grado(S) • 0 ≤ Cardinalità(R ∩ S) ≤ min {Cardinalità(R), Cardinalità(S)} Unione di relazioni Date due relazioni compatibili R e S, l’unione di R e S è la relazione, compatibile con R e S, ottenuta dalla unione insiemistica sulle estensioni delle due relazioni. In simboli: Union (R, S) = R ∪ S = {t | t ∈ R ∨ t ∈ S} dove il simbolo t indica una generica tupla. L’operatore Union agisce esclusivamente a livello estensionale. Si ha inoltre: • Grado(R∪S) = Grado(R) = Grado(S) • Cardinalità(R∪S) = Cardinalità(R) + Cardinalità(S) - Cardinalità(R∩S) Prodotto cartesiano di due relazioni Siano A1, A2,....An1 e B1, B2,......,Bn2 gli attributi, fra loro tutti diversi, di due relazioni qualunque R ed S, rispettivamente di grado n1, n2, e di cardinalità c1, c2. Il prodotto (cartesiano) di R e S è la relazione di attributi A1, A2,....An1, B1, B2,......,Bn2 di grado n1+n2 e di cardinalità c1 x c2 le cui tuple si ottengono concatenando ciascuna tupla di R con ciascuna tupla di S. In simboli: R x S = {t | t = r conc s ∧ r ∈ R ∧ s ∈ S} dove l’espressione t = r conc s sta ad indicare che la generica tupla t del prodotto è, appunto, generata concatenando una tupla r di R e una tupla s di S. Più precisamente, il concetto di concatenazione è il seguente: date le tuple r = (x1, x2, ....., x n1) e s = (y1, y2, ....., yn2) risulta r conc s = (x1, x2, ....., x n1, y1, y2, ....., yn2) 4 S.D.L. Campanozzi – “Note di Algebra relazionale” Osservazioni 1) Non vale la proprietà commutativa: R x S ≠ S x R ! 2) Se nelle due relazioni R ed S implicate nel prodotto figurano due attributi di uguale nome è necessario procedere alla ridenominazione di uno di essi per evitare ambiguità nella relazione prodotto. 3) Il prodotto cartesiano, a differenza degli operatori fin qui esaminati, genera una relazione che ha un chiaro significato dal punto di vista “costruttivo” insiemistico, ma la cui interpretazione è oscura o del tutto assente nel contesto del micromondo rappresentato dal modello relazionale. In effetti, accade in genere che il prodotto cartesiano fornisca, nell’algebra relazionale, non il risultato ultimo di una elaborazione, ma solo un risultato intermedio all’interno di una elaborazione complessa (cfr. Giunzione). Proiezione di una relazione Sia R una relazione con insieme di attributi A = { A1, A2,...., An } e sia A’ = { Ai 1 , Ai 2 ,..., Ai k } un sottoinsieme di A arbitrariamente scelto. Si definisce proiezione di R sull’insieme di attributi A’ la relazione di grado k che si ottiene da R ignorando le colonne relative agli attributi che non appartengono ad A’, ed eliminando poi le eventuali tuple duplicate (in conformità ai vincoli del modello relazionale). In simboli: Π A’ (R) oppure project R on Ai 1 , Ai 2 , ...., Ai k Osservazione La proiezione agisce prevalentemente a livello intensionale e, eventualmente anche a livello estensionale. Restrizione di una relazione Sia R una relazione con insieme di attributi A = { A1, A2,...., An }, sia A’ = { Ai 1 , Ai 2 ,..., Ai k } un sottoinsieme di A arbitrariamente scelto e sia P un predicato sugli attributi in A’. Si definisce restrizione di R a P (Ai 1 , Ai 2 ,..., Ai k ) la relazione di grado n costituita da tutte la tuple di R che soddisfano P. In altre parole la operazione di restrizione (o selezione) consente di estrarre delle tuple dalla relazione R in base al criterio P stabilito. In simboli: 5 S.D.L. Campanozzi – “Note di Algebra relazionale” σP (R) oppure restrict R where P Osservazioni 1) La restrizione agisce esclusivamente a livello estensionale. Si ha in particolare: 0 ≤ Cardinalità (σ σP (R)) ≤ Cardinalità (R) 2) Il predicato che definisce la restrizione può essere sia semplice, sia composto per mezzo degli operatori logici And, Or, Not. Inoltre nella espressione del predicato figurano, oltre alle variabili degli attributi Ai 1 , Ai 2 ,..., Ai k , (e agli operatori di confronto: >, <, =, ≤ , ≥ , ≠ ) anche costanti compatibili con il tipo degli attributi. Esempi: N_Figli > 0; Cognome = ‘Rossi’ And Nome ≠ ‘Antonio’ Ridenominazione Si considera tra le operazioni primitive la ridenominazione di un attributo di una relazione, operazione non significativa in sè, ma a volte indispensabile per evitare conflitti di sinonimia conseguenti ad altre operazioni. Sia R una relazione avente un attributo A. Rinominare A come B in R significa generare una nuova relazione identica a R sia intesionalmente, sia estensionalmente, con la sola eccezione dell’attributo A rinominato come B. In simboli: rename A as B in R 3.1 Operatori derivati Giunzione interna di relazioni Fra le operazioni derivate, quelle di maggiore utilità sono le operazioni di giunzione interna (“inner join” in inglese) che permettono di generare una nuova relazione, a partire da due relazioni assegnate, applicando uno specifico criterio di restrizione sul loro prodotto cartesiano. In base alla natura specifica del criterio si distinguono diversi tipi di giunzione interna. a) Equigiunzione (Equijoin) L’equigiunzione (equijoin) di due relazioni R ed S, rispetto a un attributo A di R ed un attributo B di S, è la relazione che si ottiene dal prodotto di R ed S selezionando le tuple in cui sono uguali i valori degli attributi A e B. In simboli: 6 S.D.L. Campanozzi – “Note di Algebra relazionale” ><| S : = σ A = B (R x S) R |> A=B Osservazioni 1) Il grado della relazione ottenuta con equijoin di R ed S è uguale al grado di R x S, quindi pari a Grado(R) + Grado(S), mentre la cardinalità è compresa tra zero e Grado(R) x Grado(S). 2) Nella relazione ottenuta per equijoin di R ed S le due colonne A e B sono identiche. b) θ -join Con il termine θ – join si denota una operazione definita in tutto come l’equijoin, ad eccezione del predicato di restrizione sugli attributi A e B. Fra i due attributi si può porre non solo il vincolo di uguaglianza, ma una qualunque condizione data dagli operatori di confronto: >, <, =, ≤ , ≥ , ≠. L’equijoin è quindi un caso particolare di θ – join. In simboli: R |> >< | S : = σ A AθB θB (R x S) ove θ ∈ { >, <, =, ≤ , ≥ , ≠ } c) Giunzione naturale (natural join) La giunzione naturale (natural join) di due relazioni R ed S richiede l’ipotesi che esista un attributo A comune alle due relazioni. Il natural join delle relazioni R e S è una relazione che ha nello schema tutti gli attributi di R e S, ma l’attributo comune A figura una sola volta; nella relazione di natural join le tuple si ottengono per concatenazione delle tuple di R con le tuple di S sotto la condizione di uguaglianza dell’attributo comune A. E’ possibile quindi pensare al natural join come a un operatore costruito con una ridenominazione, un equijoin e una proiezione nel modo seguente: R |> ><| S := Π <t ut t i gl i a tt ri but i t r an ne B > ( R |> ><| (rename A as B in S)) A=B Il grado della relazione ottenuta con natural join di R ed S è uguale a Grado(R x S) -1, quindi pari a Grado(R) + Grado(S) - 1, mentre la cardinalità è compresa tra zero e Grado(R) x Grado(S). 7 S.D.L. Campanozzi – “Note di Algebra relazionale” d) Semi-giunzione (semi-join) La semi-giunzione (semi-join) di due relazioni R ed S è definita operativamente in modo quasi identico alla giunzione naturale, con l’unica differenza che la proiezione finale viene eseguita solo sugli attributi di R; ciò significa, in pratica, che si ottiene una relazione con lo schema di R, e con le sole tuple di R che partecipano alla giunzione naturale di R e S. In simboli: >< S := Π R |> <t utt i gl i at t ri b uti di R > ><| S) ( R |> Giunzione esterna di relazioni Comunemente si annoverano fra gli operatori di giunzione e, quindi, fra gli operatori derivati, le cosiddette giunzioni esterne (“outer join” in inglese). Esse sono apparentemente affini alle giunzioni interne, ma, a differenza di quelle, non sono esprimibili in termini di operatori primitivi. Tuttavia, poichè le giunzioni esterne sono assai utili nelle applicazioni, esse sono ormai considerate “de facto” una estensione della giunzione interna. Si segnalano tre forme di giunzione esterna, estensioni della giunzione naturale: consentono di congiungere le due relazioni R ed S conservando nella relazione risultante anche le tuple di R e/o di S che non sono state coinvolte in operazioni di concatenazione. Left outer join R ]> >< | S Si conservano, anche se non concatenate, le tuple di R. Right outer join R |> ><[ S Si conservano, anche se non concatenate, le tuple di S. Full outer join R ]><[ S Si conservano, anche se non concatenate, sia le tuple di R, sia le tuple di S. 8