Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli

Appunti informatica documentale prof. Mantovani Univr, Appunti di Elementi di Informatica

Vendo gli appunti completi presi a lezione del corso di informatica documentale tenuto dal prof. Mantovani (Univr - SciCom)

Tipologia: Appunti

2021/2022

In vendita dal 05/06/2022

elisa-giona
elisa-giona 🇮🇹

4.7

(24)

15 documenti

Anteprima parziale del testo

Scarica Appunti informatica documentale prof. Mantovani Univr e più Appunti in PDF di Elementi di Informatica solo su Docsity! 1 INFORMATICA DOCUMENTALE LE BASI DI DATI Le basi di dati sono insiemi organizzati di dati e da un punto di vista informatico, esse sono un supporto digitale sui cui immagazzinare i dati, un software che permette di recuperare i dati e una rete che ne permette la condivisione. I concetti chiave riguardanti le basi di dati sono: 1. Modelli per l’organizzazione dei dati; 2. Linguaggi per l’utilizzo dei dati e 3. Metodologie di progettazione di basi di dati. Perchè? La comunicazione prevede lo scambio e quindi la trasmissione e il recupero di informazioni. I dati devono essere quindi conservati, aggiornati e gestiti in modo efficiente. SISTEMI INFORMATIVI, INFORMAZIONI E DATI La base di dati è quindi un insieme organizzato di dati usati per il supporto allo svolgimento di attività (di un ente, azienda, ufficio, persona…). Per informatica si intende la scienza del trattamento razionale, specialmente per mezzo di macchine automatiche, dell’informazione, considerata come supporto alla conoscenza umana e alla comunicazione. Le due anime presenti all’interno di questa definizione sono quindi: - Metodologica e - Tecnologica. IL SISTEMA INFORMATIVO Il sistema informativo è il componente di un’organizzazione che gestisce le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa (es. ateneo). Ogni organizzazione ha un sistema informativo, eventualmente non esplicitato nella struttura. Inoltre, il sistema informativo è di supporto ad altri sottosistemi e va quindi studiato nel contesto in cui è inserito. LA GESTIONE DELLE INFORMAZIONI La gestione delle informazioni prevede alcune fasi: 1. Raccolta e acquisizione -> quali dati? 2. Archiviazione e conservazione -> su che supporto? 3. Elaborazione, trasformazione e produzione e 4. Distribuzione, comunicazione e scambio. SISTEMI INFORMATIVI E AUTOMAZIONE Il concetto di sistema informativo è indipendente da qualsiasi automatizzazione ed esistono organizzazioni la cui ragion d’essere è la gestione delle informazioni (per esempio servizi anagrafici e banche che operano da soli). La parte automatizzata è dunque solo una parte del sistema informativo e non lo va ad esaurire. 2 Nelle attività umane le informazioni possono gestire in modo diverso: - Idee informali; - Linguaggio naturale -> tra linguaggio naturale e artificiale ci sono delle differenze anche se si cerca di fare in modo che il linguaggio artificiale possa essere capito dalle persone che lo utilizzano; - Disegni, grafici, schemi e - Numeri e codici. INFORMAZIONI E DATI Nei sistemi informatici, e non solo, le informazioni vengono rappresentate in modo essenziale e spartano attraverso i dati. L’informazione è una notizia, un dato o un elemento che consente di avere conoscenza più o meno esatta di fatti, situazioni e modi di essere. Il dato è invece ciò che è immediatamente presente alla conoscenza, prima di ogni elaborazione. In informatica i dati sono invece elementi di informazione costituiti da simboli che devono essere elaborati. Se dico “1850” senza essere contestualizzato, esso risulta un dato, ma non dice nulla. È l’elemento primitivo della conoscenza ed è costituito da simboli (numeri, simboli, caratteri alfanumerici). Aggiungendo elementi al contorno ho poi l’informazione (la quale deve essere contestualizzata rispetto a ciò che devo acquisire). Il dato serve a poco senza interpretazione e serve dunque una portata semantica che mi dia l’informazione. I dati sono spesso il risultato di forme di organizzazione e codifica delle informazioni. PERCHÉ I DATI? La rappresentazione precisa di forme più ricche di informazione e conoscenza è difficile. I dati costituiscono spesso una risorsa strategica perché più stabili nel tempo di altre componenti (processi, tecnologie e ruoli umani). BASI DI DATI E SISTEMI DI GESTIONE DI BASI DI DATI Tornando alle due accezioni, abbiamo: 1. Metodologica (generica) -> insieme organizzato di dati per il supporto allo svolgimento delle attività di un ente (azienda, ufficio, persona) e 2. Metodologica – tecnologica (specifica) -> indipendente dall’implementazione ma pronta a essere facilmente presentabile. L’insieme di dati viene gestito da un DBMS (Data Base Management System). I DBMS I DBMS sono sistemi di gestione della base di dati e sono molto complessi perché non solo devono gestire la parte vicina all’implementazione fisica, alla gestione e l’elaborazione del dato, ma devono anche garantire requisiti che devono avere i dati, gestire una grande mole di dati e una gerarchia di software complessi. Queste collezioni di dati che gestiamo sono molto: - Grandi (voluminosi); - Persistenti (devono essere mantenuti, non si possono perdere) e - Condivise (un unico DB può essere a disposizione di più agenti e realtà, dunque bisogna garantire questa condivisione). 5 I LINGUAGGI DELLE BASI DI DATI Interrogare una base di dati vuol dire fare una domanda in un linguaggio artificiale: la risposta è un sottoinsieme di dati che corrisponde a ciò che sto cercando. I linguaggi per basi di dati permettono di definire basi di dati e interrogarle. Esistono molti linguaggi e interfacce: - Linguaggi testuali interattivi (SQL); - Comandi (SQL) immersi in un linguaggio ospite (Pascal, Java, C...); - Comandi (SQL) immersi in un linguaggio ad hoc, con anche altre funzionalità (es. per grafici) e - Con interfacce amichevoli (senza linguaggio testuale, es. Access, Base di LibreOffice…). LA DISTINZIONE SUI LINGUAGGI I linguaggi per i dati si possono classificare in: - DML (Data Manipulation Language) -> per l’interrogazione e l’aggiornamento di (istanze di) basi di dati e - DDL (Data Definition Language) -> per la definizione di schemi (logici, esterni, fisici) e altre operazioni generali. Si utilizzano dei costrutti e dei comandi del linguaggio per costruire ad esempio le tabelle. SQL ha entrambe le caratteristiche: è sia DML che DDL (si può anche programmare con esso). I linguaggi più importanti sono quindi: - Algebra relazionale -> linguaggio procedurale, cioè una descrizione della procedura da attuare per ottenere il risultato (operazione complessa in micro-passettini). Permette di esaminare le query (interrogazioni) da effettuare nell’ambito della gestione di un database e - SQL -> linguaggio standardizzato per creare e modificare schemi di database (DDL) e inserire, modificare e gestire i dati memorizzati (DML). I MODELLI LOGICI DEI DATI I modelli logici sono tanti ma quello che noi vedremo è quello relazionale, che di fatto ha prevalso (è alla base dei DBMS). Tre modelli logici (ci poniamo al livello della strutturazione logica, dove andremo a rappresentare in modo più possibilmente consistente i dati) tradizionali sono: - Gerarchico; - Reticolare e - Relazionale. Più recenti (e poco diffusi) sono: - A oggetti e - Basato su XML. MODELLI LOGICI E CARATTERISTICHE - Gerarchico e reticolare -> utilizzano riferimenti espliciti (puntatori) fra record e - Relazionale -> è basato sui valori: il valore che assume il dato è l’unico oggetto sintattico che io vado a memorizzare. Vado a memorizzare solo la struttura tabellare e l’unica altra cosa che memorizzo 6 sono i dati che contiene. Non memorizzo i collegamenti o le meta-informazioni. Anche i riferimenti fra dati in strutture (relazioni) diverse sono rappresentati per mezzo di valori. IL MODELLO RELAZIONALE Venne proposto da Codd nel 1970 per favorire l’indipendenza dei dati e per avere un modello che tenesse traccia del dato. Prima di essere implementato passarono 10 anni: fu disponibile in DBMS reale nel 1981 (non è facile implementare l’indipendenza con efficienza e affidabilità). Inoltre, esso si basa sul concetto matematico di relazione (con una variante). Le relazioni hanno naturale rappresentazione per mezzo di tabelle (colonne con un’intestazione e un’insieme di righe che ne rappresentano l’istanza). Le strutture indicano come costruiamo le tabelle a partire dalla definizione di relazione che viene dalla teoria degli insiemi, mentre i vincoli di integrità sono richieste che facciamo per ottenere delle relazioni (e quindi un DB corretto semanticamente ma anche sintatticamente). IL MODELLO RELAZIONALE: LE STRUTTURE Le tre relazioni presenti all’interno del modello razionale sono: - Relazione matematica -> come nella teoria degli insiemi; - Relazione che rappresenta una classe di fatti (nel modello Entity-Relationship) tradotta anche con associazione o correlazione e - Relazione secondo il modello relazionale dei dati -> deve avere dei requisiti specifici. Per ottenere una relazione devo trovare un qualsiasi sottoinsieme del prodotto cartesiano. Fatto il prodotto cartesiano trovo tutti gli elementi di quest’ultimo e da quelli individuo un sottoinsieme del prodotto cartesiano stesso: quella è la relazione. LA RELAZIONE MATEMATICA: LE PROPRIETÀ Una relazione matematica è un sottoinsieme del prodotto cartesiano e un insieme di n-uple ordinate (d1,..., dn) tali che d1 ∈ D1,…, dn ∈ Dn. Una relazione è un insieme, quindi: - Non c'è ordinamento (reciproco) fra le n-uple (posso scambiare l’ordine degli elementi in relazione, una riga con un’altra); - Le n-uple sono distinte (non ho duplicati: una volta che ho una coppia non posso ripeterla) e - Ciascuna n-upla è ordinata -> l’ i-esimo valore proviene dall’ i-esimo dominio (posso scrivere a x, a z, b y… ma anche a z, b y, a x ma NON x a, y b, z a). Ciascuno dei domini ha due ruoli diversi, distinguibili attraverso la posizione: - La struttura è posizionale -> non posso scambiare le colonne, le righe si. Inoltre, posso scambiare le righe, ma all’interno della riga non posso cambiare l’ordine degli elementi e - L’ordinamento non è una proprietà ottimale (se io prendo tutta la prima riga e la metto in fondo non cambia nulla; quello che non posso fare è cambiare le colonne perché cambia la semantica). 7 LA STRUTTURA NON POSIZIONALE Per liberarmi di una posizionalità, a ciascun dominio si associa un nome (attributo -> nome della colonna), che ne descrive il “ruolo” e aggiunge una semantica a quello che vogliono rappresentare i dati sottostanti. L’ordine delle colonne ora non conta. Ora posso scambiare le righe (l’ordine delle righe non conta, lo avevo già prima, ma ora posso anche scambiare le colonne). Questi attributi all’interno di una relazione o tabella devono sempre avere nomi diversi, altrimenti non è possibile andare a identificarli. Facendo così, l’insieme delle righe è un insieme (le posso prendere nell’ordine che voglio) ma anche quello delle colonne è un insieme (l’ordine non conta più). Sganciamo così la posizione dalla tabella: nella tabella del modello relazionale dunque non conta l’ordine delle righe né quello delle colonne. Posso scambiare righe e colonne ma di fatto i dati portano sempre la stessa informazione. L’attributo dev’essere quindi univoco all’interno della stessa relazione (non tra relazioni diverse: posso avere tabelle diverse con lo stesso attributo). TABELLE E RELAZIONI In una tabella che rappresenta una relazione: - L’ordinamento tra le righe è irrilevante e - L’ordinamento tra le colonne è irrilevante. Una tabella secondo Codd rappresenta una relazione se: - Le righe (prese intere, globalmente, ci possono essere pezzettini che si sovrappongono) sono diverse fra loro; - Le intestazioni (attributi) delle colonne sono diverse tra loro -> ogni attributo ha un valore univoco nella relazione e - I valori di ogni colonna sono fra loro omogenei -> se prendo una colonna il tipo di dato è sempre uguale e omogeneo. Sono tutti elementi che vengono dal dominio di appartenenza al quale io ho dato il nome che è l’attributo. Il modello è basato sui valori: - I riferimenti fra dati in relazioni diverse sono rappresentati per mezzo di valori dei domini che compaiono nelle n-uple e - Noi uniamo dati di tabelle diverse per avere una tabella finale più interessante e complessa. STRUTTURA BASATA SU VALORI: I VANTAGGI - Indipendenza dalle strutture fisiche (si potrebbe avere anche con puntatori di alto livello) che possono cambiare dinamicamente; - Si rappresenta solo ciò che è rilevante dal punto di vista dell’applicazione (i valori, cioè la rappresentazione logica dei dati) -> stiamo strutturando i dati e cercando di rappresentarli nel modo più efficiente possibile per fare il nostro query e la nostra interrogazione per estrapolare i dati che ci interessano; - L’utente finale vede gli stessi dati dei programmatori (tutto è basato sui valori, sia per noi sia per chi ha implementato il database) e - I dati sono portabili più facilmente da un sistema ad un altro (se devo trasferire da un sistema all’altro più è primitivo ciò che vado a memorizzare più è facile trasferirlo -> operare solo sui dati minimizza la struttura e favorisce la trasmissione). 10 Qui ci sono diversi tipi di errore: subito vediamo un voto pari a 32, che nel sistema italiano non esiste. Sintatticamente è un dato corretto: in corrispondenza di un voto io mi aspetto un numero e 32 è un numero, ma semanticamente non ha senso perché a livello universitario non esiste. Lo stesso discorso vale per il 27 e lode, che può essere assegnata solo a chi prende 30. Un’altra cosa strana sono due studenti con la stessa matricola, quando la matricola dovrebbe essere un identificativo univoco (sarebbe come avere due persone con lo stesso codice fiscale). Bisogna quindi garantire che le istanze delle basi di dati siano corrette non solo sintatticamente, ma anche semanticamente. I vincoli di integrità intervengono su questo terreno: cercano di dare un'integrità semantica alle relazioni del modello relazionale di Codd. COS’È IL VINCOLO D’INTEGRITÀ? Il vincolo di integrità è una proprietà che deve essere soddisfatta dalle istanze (dai possibili insiemi di t- uple/righe/n-uple delle relazioni) che rappresentano informazioni corrette per l’applicazione. Un vincolo è un predicato, un’espressione sintattica costruita secondo le regole della sintassi, che in un determinato contesto può essere vera o falsa: esso associa ad ogni istanza il valore vero o falso (es. “Non posso avere un voto pari a 32”: devo stabilire se questo in un dato contesto può essere vero o falso.) Un vincolo di integrità è dunque una proprietà scritta in modo formale a cui posso associare un valore di verità, cioè stabilire se i miei dati lo soddisfano o meno. ESEMPIO L’esempio del voto è calzante: io voglio che il voto positivo stia tra 18 e 30. Esprimo con un predicato che può essere espresso in questo modo: il voto deve essere maggiore o uguale a 18 e minore o uguale a 30. Se l’attributo “Lode” è settato a “lode” (se nell’attributo lode c’è la lode) allora il voto deve necessariamente essere 30. - AND -> congiunzione “e” -> entrambi i rami devono essere veri e - OR -> disgiunzione “o” -> deve essere vero uno dei due rami: implicazione. Es. -> (voto ≥ 18) AND (voto ≤ 30) A COSA SONO UTILI I VINCOLI? I vincoli sono utili per: - Dare una descrizione più accurata della realtà; - Contribuire alla qualità dei dati; - Progettare e - L’esecuzione delle interrogazioni nei DBMS. 11 I VINCOLI SUPPORTATI DAI DBMS Alcuni tipi di vincoli (ma non tutti) sono “supportati” dai DBMS: - Possiamo quindi specificare (scriverli in un linguaggio comprensibile alla macchina, mediato da un linguaggio amichevole) vincoli di tali tipi alla nostra base di dati e il DBMS ne impedisce la violazione (ad esempio dandoci il messaggio di errore per dirci che stiamo violando il vincolo semantico o impedendoci di inserire un dato che non rispetta tale vincolo) e - Per i vincoli “non supportati” la responsabilità della verifica è dell’utente o del programmatore. TIPI DI VINCOLI Esistono due tipologie di vincoli: 1. Vincoli intra relazionali (vincolo definito rispetto alle singole relazioni della BdiD) -> riguardano la singola relazione o tabella del modello relazionale. Per verificare la proprietà relazionale non devo guardare tutto il database, ma una singola tabella. Io sono dentro una tabella e ho una serie di predicati/vincoli di proprietà che devo rispettare dentro questa relazione (non devo confrontare valori di tabelle diverse per dire che il vincolo è rispettato). Si possono dividere in due sottocategorie: o Vincoli di n-upla -> sono vincoli che riesco a verificare guardando la singola riga indipendentemente dalle altre (i valori relativi a colonne diverse ma sempre all’interno della stessa riga: per dire che 27 e lode è sbagliato devo leggere le due caselle, perché localmente vanno bene ma insieme non hanno senso: per capirlo devo guardare due campi del record). Essi esprimono dunque condizioni sui valori di ciascuna n-upla, indipendentemente dalle altre n-uple e o Vincoli su valori (o di dominio) -> li valuto localmente a un solo attributo (se il voto è 15 non va bene, perché non sta nell’intervallo tra 18 e 30). Essi coinvolgono un solo attributo (un caso particolare di vincolo di n-upla) e 2. Vincoli inter relazionali (tra relazioni diverse della BdiD) -> abbiamo due tabelle e il più importante è il vincolo di integrità referenziale. Riguardando due relazioni diverse va a suggellare la definizione del modello relazionale che si basa sui valori. ESEMPIO L’esempio mostra un predicato molto semplice, perché ci dà il Lordo costituito dal netto e le ritenute (tasse). Di fatto noi dobbiamo verificare che affinché il vincolo sia rispettato devo verificare tre colonne, ossia andare a fare la somma di ritenute + netto e verificare il lordo. LORDO = (Ritenute + Netto) è il vincolo. Rispetto al dato posso dire se lo rispetta, quindi se è VERO o FALSO. Se io volessi fare un vincolo di dominio potrei dire che il LORDO può essere al massimo di 50mila e chiedermi se i vari dati rispettano il vincolo di dominio: il vincolo è di dominio perché per verificare che sia rispettato mi basta verificare il valore singolo e non devo considerare tutta la riga. 12 L’IDENTIFICAZIONE DELLE T-UPLE È importante avere un modo per identificare univocamente all’interno di una stessa relazione le sue righe: nel modello relazionale di Codd importiamo un metodo che ci permette di identificare in modo univoco una relazione. SUPERCHIAVE E CHIAVE La superchiave è un insieme di attributi che identificano univocamente le n-uple di una relazione. La definizione si può formalizzare: - Un insieme K di attributi è superchiave per r (una relazione, il nome della nostra tabella) se r non contiene due n-uple distinte t1 e t2 con t1 [K] = t2 [K]. Es -> t1 [MAT] ≠ t2 [MAT]. - K è la chiave per r se è una superchiave minimale per r (cioè non contiene un’altra superchiave). L’insieme K è il minimo numero di attributi per identificare: è una chiave se non contiene al suo interno un’altra superchiave. Es -> matricola è una chiave, mentre la coppia matricola-cognome no perché può essere semplificata. Ogni tabella garantisce una superchiave perché la riga presa interamente è una superchiave. Essere chiave non implica essere fatti di un solo attributo: una chiave semplicemente non deve essere riducibile. Anche cognome-corso formano una chiave ma una coppia del genere non verrebbe mai scelta come chiave di una relazione perché spesso all’interno di un corso ci sono due persone con lo stesso cognome. Matricola è invece una chiave molto più robusta e con sicurezza può identificare le n-uple. Spesso quindi in una tabella ci sono chiavi che sono tali per caso, perché in quell’istanza non ci sono duplicati, ma non sono buoni identificatori delle n-uple. VINCOLI, SCHEMI E ISTANZE I vincoli corrispondono a proprietà del mondo reale modellato dalla base di dati ed essi interessano a livello di schema (con riferimento cioè a tutte le istanze). Ad uno schema viene associato un insieme di vincoli e consideriamo corrette le istanze che soddisfano tutti i vincoli. Un’istanza può inoltre soddisfare altri vincoli “per caso”. L’IMPORTANZA DELLE CHIAVI L’esistenza delle chiavi è importante perché: - Una relazione non può contenere n-uple distinte ma uguali -> non posso avere due righe diverse uguali dall’inizio alla fine. Le righe sono un insieme perché sono diverse tra loro e - Ogni relazione ha come superchiave l’insieme degli attributi su cui è definita e quindi ha almeno una chiave (ogni t-upla). L’esistenza delle chiavi garantisce l’accessibilità a ciascun dato della base di dati e le chiavi permettono anche di correlare i dati in relazioni diverse: ciò è fondamentale perché sappiamo che il modello relazionale è basato sui valori. La chiave permette di correlare tabelle diverse perché in tabelle diverse troverò gli stessi valori. CHIAVI E VALORI NULLI In presenza di valori nulli, i valori della chiave non permettono: 15 GLI OPERATORI DELL’ALGEBRA RELAZIONALE L’algebra è un linguaggio procedurale, basato su concetti di tipo algebrico. Essa è un insieme di operatori basato su un insieme di operatori: - Definiti su relazioni; - Che producono relazioni a partire da altre relazioni e - Che possono essere composti. I vari operatori sono: - Insiemistici -> si applicano solo a relazioni definite sugli stessi attributi -> unione, intersezione e differenza. Essi permettono di fare operazioni su tabelle seguendo la definizione del modello di Codd e - Tipici dell’algebra relazionale: o Ridenominazione -> ridenomina il nome degli attributi e a volte serve per esporre il risultato in maniera più leggibile; o Selezione; o Proiezione e o Join (naturale, prodotto cartesiano, theta-join). Selezione, proiezione e join godono di notazioni diverse: una più matematica con lettere greche, una più informatica che prende il prefisso delle operazioni. Selezione e proiezione sono due operazioni ortogonali: la selezione agisce in modo orizzontale e non si interessa delle righe della relazione, mentre la proiezione agisce in modo verticale e non si interessa delle colonne della relazione. LA SELEZIONE (SEL, SIGMA) La selezione: - È un operatore monadico (agisce in una sola relazione) e - Produce un risultato che: o Ha lo stesso schema dell’operando -> è definito in tutti i suoi attributi e il risultato avrà tutte le colonne della tabella di input e o Contiene un sottoinsieme delle n-uple dell’operando (quelle che soddisfano una condizione che si specifica nella query). SELEZIONE, SINTASSI E SEMANTICA - Sintassi -> SELcondizione (OPERANDO: nome della tabella su cui vogliamo agire); - Condizione -> espressione booleana (come i vincoli di n-upla -> V o F). Una condizione si può valutare con un si o un no; - Semantica -> il risultato contiene le n-uple dell’operando che soddisfano la condizione: non vado a intaccare le colonne ma scelgo le righe che soddisfano la condizione. Esempi: 1. Impiegati che guadagnano più di 50 -> SELstipendio > 50 (IMPIEGATI); 2. Impiegati che guadagnano più di 50 e lavorano a Milano -> SELstipendio > 50 AND filiale = Milano (IMPIEGATI) e 3. Impiegati che hanno lo stesso cognome della filiale presso cui lavorano -> SELcognome = filiale (IMPIEGATI). 16 LA PROIEZIONE (PROJ, PI GRECO) La proiezione è un operatore monadico: prende input da una sola relazione e produce un risultato che: - Ha parte degli attributi dell’operando e - Contiene n-uple cui contribuiscono tutte le n-uple dell’operando -> butta via le colonne ma mantiene tutte le n-uple. PROIEZIONE, SINTASSI E SEMANTICA - Sintassi -> PROJListaAttributi (OPERANDO) e - Semantica -> il risultato contiene le n-uple dell’operando ristrette agli attributi nella lista: ho una tabella di output che mi contiene tutte le righe ma ristrette a degli attributi. Esempi: 1. Matricola e cognome di tutti gli impiegati -> PROJmatricola,cognome (IMPIEGATI) e 2. Cognome e filiale di tutti gli impiegati -> PROJcognome,filiale (IMPIEGATI). CARDINALITÀ DELLE PROIEZIONI Una proiezione: - Contiene tante n-uple quante l’operando o - Può contenerne di meno. Se X è una superchiave di R allora PROJX(R) contiene esattamente tante n-uple (righe) quante R. Inoltre, combinando selezione e proiezione possiamo estrarre informazioni da una relazione. Esempio: 1. Voglio matricola e cognome degli impiegati che guadagnano più di 50 -> PROJmatricola,cognome (SELstipendio > 50 (IMPIEGATI)). Non si possono correlare informazioni presenti in relazioni diverse, né informazioni in n-uple diverse di una stessa relazione. ESERCIZIO 1 - Libro (ISBN, titolo, anno, codice autore, codice editore, lingua) - Scrittore (codice autore, nome, cognome, nazionalità, EdC) schema della base di dati - Editrice (codice editore, nome, città) Q1 -> ISBN dei libri scritti nel 1975 PROJISBN (SELanno = 1975 (LIBRO)) Possibili varianti: 1. ISBN e titolo dei libri scritti prima del 1975 -> PROJISBN,titolo (SELanno < 1975 (LIBRO)) e 2. ISBN e anno dei libri scritti entro il 1975 -> PROJISBN,anno (SELanno ≤ 1975 (LIBRO)). 17 Q2 -> titoli dei libri scritti in francese prima del 1990 PROJtitolo (SELanno < 1990 AND lingua = francese (LIBRO)) Possibili varianti: 1. ISBN e titolo dei libri scritti in italiano o in francese -> PROJISBN,titolo (SELlingua = italiano OR lingua = francese (LIBRO)) e 2. Titolo e anno dei libri scritti in spagnolo oppure dopo il 2010 -> PROJtitolo,anno (SELlingua = spagnolo OR anno > 2010 (LIBRO)). Q3 -> codice e cognome degli scrittori di nazionalità inglese PROJcodiceautore,cognome (SELnazionalità = inglese (SCRITTORE)) Possibili varianti: 1. Codice autori di nazionalità inglese o francese -> PROJcodiceautore (SELnazionalità = inglese OR nazionalità = francese (SCRITTORE)) e 2. Cognome scrittori che hanno come editrice principale l’editrice con codice FLTR -> PROJcognome (SELEdC = FLTR (SCRITTORE)). Q4 -> ISBN e titolo dei libri scritti nel 2010 in italiano o in inglese PROJISBN,titolo (SELanno = 2010 AND (lingua = italiano OR lingua = inglese) (LIBRO)). OPERATORI E CONNETTIVI La condizione della SEL può essere valutata mediante un operatore di confronto come [ ≤ ≥ ≠ < > = ]. Se la condizione deve valutare più sotto-condizioni, allora si usano dei connettivi come [ AND, OR, NOT ]. IL JOIN JOIN permette di correlare dati in relazioni diverse confrontando i valori contenuti in esse. Esistono due tipologie di JOIN: - JOIN naturale e - Theta JOIN. IL JOIN NATURALE È un operatore binario non monadico (può prendere in esame diverse tabelle) e produce un risultato: - Sull’unione degli attributi degli operandi e - Con n-uple costituite ciascuna a partire da una n-upla di ognuno degli operandi con valori uguali sugli attributi comuni. Il JOIN deve mettere insieme più relazioni e ogni n-upla contribuisce al risultato -> JOIN completo. Nel caso del JOIN vuoto nessuna t-upla è combinabile. Un altro caso estremo è quello del JOIN totalmente completato: noi avremo un numero di righe nel JOIN che va da 0 a un massimo del prodotto tra il numero di righe nella prima relazione e il numero di righe nella seconda. Un grosso limite è quello di avere esattamente lo stesso nome in tabelle diverse: posso avere due tabelle diverse che hanno due attributi con nomi diversi ma che di fatto contengono gli stessi dati. 20 IL LINGUAGGIO SQL Originariamente il nome era l’acronimo di “Structured Query Language” e ha varie funzionalità: - Contiene DDL -> Data Definition Language -> si occupa degli schemi e di creare relazioni e - Contiene DML -> Data Manipulation Language -> si occupa delle basi di dati, delle righe e delle interrogazioni. Con SQL si può: - Definire lo schema di una base di dati (tabelle che compongono la base di dati, i vincoli interrelazionali e quelli intrarelazionali); - Specificare delle interrogazioni sulla base di dati e - Modificare la base di dati. I COMANDI BASE IN SQL - Le parentesi angolari “> <” permettono di isolare un termine della sintassi; - Le parentesi quadre “[ ]” indicano un termine opzionale che può non comparire o comparire una volta sola; - Le parentesi graffe “{ }” indicano che il termine può non comparire o essere ripetuto un numero arbitrario di volte; - Le barre verticali “…|…|…” indicano che deve essere scelto uno dei termini separati dalle barre e - Le parentesi tonde “( )” non saranno simboli della grammatica ma parte di termini SQL. CREAZIONE DI UNA TABELLA Per creare una tabella con SQL si utilizza l’istruzione “Create Table”: Create Table NomeTabella ( Nome_Attributo Dominio [ValoreDiDefault] [Vincoli], … AltriVincoli ) L’istruzione Create Table definisce uno schema di relazione e ne crea un’istanza vuota. Oltre ciò, essa specifica attributi, domini e vincoli. Per creare una tabella devo scrivere Create Table e poi dichiarare il nome della tabella. Successivamente si apre e si chiude una parentesi dando delle dichiarazioni degli attributi delle colonne che voglio aggiungere alla costruzione della relazione: si elencano il nome attributo (es. Titolo), il dominio (es. stringa di caratteri, numeri…), il valore di default e una serie di vincoli. Una base di dati viene infatti creata mettendo insieme delle relazioni che a loro volta vengono unite tra loro attraverso i vincoli di integrità. Alcune indicazioni generali: - Le parole scritte con lettera maiuscola sono gli attributi della tabella (es. Matricola, Nome, Cognome…); 21 - Le parole scritte completamente in maiuscolo sono i vincoli della tabella (es. FOREIGN KEY, UNIQUE…); - La PRIMARY KEY deve essere solo una per tabella e non può essere nulla (contiene i vincoli UNIQUE e NOT NULL); - CHAR e NUMERIC/INTGER indicano il tipo di dati che ci aspetta -> CHAR sta per caratteri, NUMERIC sta per numeri di piccola entità; - Il vincolo UNIQUE indica che il dato deve essere unico e non posso averne uno uguale all’interno della tabella e - Il numero inserito dopo CHAR o NUMERIC indica il numero di caratteri o di numeri massimo da inserire (es. NUMERIC (9) = 9 numeri oppure CHAR (15) = 15 lettere/caratteri). I DOMINI I domini all’interno delle tabelle possono essere: - Domini elementari (predefiniti) e - Domini definiti dall’utente (semplici ma riutilizzabili). I DOMINI ELEMENTARI I domini elementari sono caratterizzati da singoli caratteri o stringhe, anche di lunghezza variabile (CHAR (n) -> lunghezza fissa; VARCHAR (n) -> lunghezza variabile). Oltre ciò, gli elementi numerici sono esatti e approssimati (NUMERIC (n), INTGER, SMALLINT…) e possono essere inseriti anche data, ora o intervalli di tempo (DATE…). LA DEFINIZIONE DEI DOMINI Per definire i domini si utilizza l’istruzione “Create Domain”, la quale definisce un dominio semplice utilizzabile in definizioni di relazioni, anche con vincoli e valori di default: Create Domain NomeDominio as TipoDiDato [ValoreDiDefault] [Vincolo] ESEMPIO: VOTO COMPRESO TRA 18 E 30 CREATE DOMAIN Voto —> Nome AS SMALLINT —> Tipo di dato DEFAULT NULL —> Valore di default CHECK (value ≥ 18 AND value ≤ 30) —> Vincolo I VINCOLI INTRARELAZIONALI Nei vincoli intrarelazionali (interni alle tabelle) ci sono parole chiave da usare dentro il Create Table: - NOT NULL -> il valore nullo non è ammesso per l’attributo, quindi il valore deve sempre essere specificato, o si assegna un valore di DEFAULT; - UNIQUE -> definisce le super-chiavi; - PRIMARY KEY -> è la chiave primaria (una sola, implica il NOT NULL) e - CHECK -> viene usato non solo dentro la creazione di un dominio, ma il DBMS permette di usarlo su tutta la base di dati per verificarne l’integrità. Si può così controllare la portata e la correttezza del DB e si ha la possibilità di esprimere dei predicati che siano relativi, racchiuderli in un CHECK e dire al sistema di controllare che la proprietà sia rispettata. 22 UNIQUE UNIQUE ha due forme: - Nella definizione di un attributo (se forma da solo la chiave e se opera su un solo attributo) e - Come elemento separato (se opera su più attributi). PRIMARY KEY La PRIMARY KEY si può definire una sola volta per ogni tabella (a differenza di UNIQUE e NOT NULL). Come UNIQUE, si può definire sul singolo attributo o su di un insieme. La definizione implica una definizione di NOT NULL per tutti gli attributi della chiave primaria: Nome VARCHAR (20) Cognome VARCHAR (20) PRIMARY KEY (Cognome, Nome) I VINCOLI INTERRELAZIONALI REFERENCES e FOREIGN KEY permettono di definire vincoli di integrità referenziale e anche in questo caso possiamo trovare due situazioni: - Su singoli attributi si usa una sintassi più snella e - Su più attributi possiamo avere una sintassi più elaborata. È inoltre possibile definire le politiche di reazione alla violazione con il CHECK: posso dunque definire delle proprietà relative a qualsiasi costrutto in SQL. I vincoli di integrità referenziale creano un legame tra un attributo di una tabella (detta “interna”) e i valori di attributi di un’altra tabella (detta “esterna”). Il vincolo impone che per ogni riga della tabella interna il valore dell’attributo specificato (se non è nullo) compaia tra le righe della tabella esterna tra i valori del corrispondente attributo. La sintassi impone che l’attributo cui si fa riferimento nella tabella esterna sia soggetto al vincolo di UNIQUE. REFERENCES E FOREIGN KEY Se è coinvolto un solo attributo basta usare il costrutto sintattico REFERENCES specificando la tabella esterna e il relativo attributo coinvolto. In alternativa, e necessariamente quando il legame coinvolge più attributi, si usa il costrutto FOREIGN KEY alla fine della definizione degli attributi, elencando gli attributi coinvolti e le definizioni dei corrispondenti attributi della tabella esterna, sempre grazie a REFERENCES. LE INTERROGAZIONI DI BASI DI DATI La parte di SQL dedicata alle dichiarazioni fa parte dei DML (anche se la separazione DDL/DML non è rigida). SQL esprime inoltre le dichiarazioni in modo dichiarativo (specifica l’obiettivo e non la procedura per ottenerlo, come l’algebra relazionale). Matricola CHAR (6) PRIMARY KEY oppure Matricola CHAR (6), … … PRIMARY KEY (Matricola) 25 Q1 -> ISBN libri scritti nel 1975 Select ISBN From LIBRO Where Anno = 1975 Q2 -> ISBN e titolo dei libri scritti prima del 1975 Select ISBN, titolo From LIBRO Where Anno < 1975 Q3 -> ISBN e anno dei libri scritti entro il 1975 Select ISBN, anno From LIBRO Where Anno ≤ 1975 Q4 -> titoli dei libri scritti in francese prima del 1990 Select titolo From LIBRO Where Anno < 1990 AND Lingua = francese Q5 -> ISBN e titolo dei libri scritti in italiano o in francese Select ISBN, titolo From LIBRO Where Lingua = italiano OR Lingua = francese Q6 -> titolo e anno dei libri scritti in spagnolo o dopo il 2010 Select titolo, anno From LIBRO Where Lingua = spagnolo OR Anno > 2010 Q7 -> codice e cognome degli scrittori di nazionalità inglese Select CodiceAutore, cognome From SCRITTORE Where Nazionalità = inglese 26 Q8 -> nome delle case editrici con sede a Torino Select nomeE From EDITRICE Where Città = Torino Q9 -> codice e nome delle case editrici con sede a Berlino e NY Select CodiceEditore, nomeE From EDITRICE Where Città = Berlino AND Città = NY IL JOIN IN SQL Si possono formulare interrogazioni che coinvolgono righe di più tabelle e poi si può specificare un JOIN per indicare esplicitamente il legame tra le diverse tabelle. In SQL il JOIN si può definire in due modi diversi: - Il primo non richiede l’uso di nuova sintassi, e specifica il legame tra le tabelle coinvolte a livello della clausola WHERE e - Il secondo usa una sintassi riservata a livello di clausola FROM. SQL permette di specificare il legame tra tabelle diverse nella condizione della clausola WHERE e il JOIN si può spostare nella clausola FROM, a livello delle tabelle. Select ListaAttributi From Tabella1 JOIN Tabella2 ON CondizioneDiJOIN [Where AltraCondizione] ESEMPIO CON JOIN Q1 -> nome e sede di lavoro di tutti gli impiegati Select Impiegato.Nome, Dipartimento.Città From Impiegato JOIN Dipartimento ON Impiegato.Dipart = Dipartimento.Nome (In rosso le tabelle, in blu gli attributi) L’ORDINAMENTO DEL RISULTATO Come abbiamo visto, una relazione è un insieme di t-uple non ordinato. Nella realtà, sorge spesso il bisogno di costruire un ordine sulle righe (ad esempio in ordine alfabetico). SQL permette di specificare un ordinamento (ascendente o discendente) sulle righe dell’output grazie alla clausola ORDER BY. Solitamente è ascendente (da 1 a 100 e non da 100 a 1). 27 Esempio: nome e reddito delle persone con meno di 30 anni in ordine alfabetico Select nome, reddito From PERSONE Where Età < 30 Order by Nome GLI OPERATORI AGGREGATI Possiamo anche avere espressioni che calcolano valori a partire da insiemi di n-uple: - Conteggio; - Minimo; - Massimo; - Media e - Totale. È una delle più importanti estensioni rispetto all’algebra relazionale, dove ogni condizione è un predicato che viene valutato su ciascuna t-upla indipendentemente. Gli operatori aggregati sono estensioni delle normali interrogazioni: prima il sistema esegue le clausole FROM e WHERE, quindi applica l’operatore per restituire il risultato desiderato. ESEMPIO DI COUNT Q -> il numero dei figli di Franco Select count (*) as NumeroFigliDiFranco From PATERNITÀ Where padre = Franco LE MODIFICHE DEGLI SCHEMI SQL offre delle primitive per modificare schemi già introdotti, attraverso l’uso dei comandi: - ALTER -> effettua modifiche (posso aggiungere una colonna o una relazione) e - DROP (DOMAIN, TABLE) -> permette di rimuovere i vari componenti di domini e tabelle (posso cancellare una tabella). Oltre ciò si possono imporre delle restrizioni. OPERAZIONI DI AGGIORNAMENTO DEI DATI (no esercizi all’esame) SQL offre le seguenti operazioni di aggiornamento dei dati: - Inserimento -> INSERT; - Eliminazione -> DELETE e - Modifica -> UPDATE. 30 From OPERA join ARTISTA on CodA = Cod Where Nome = Tokiiro AND Cognome = Nigata N°2 - CANZONE (CodC, Titolo, Anno, Album, CodiceA) - CANTAUTORE (CodiceAutore, Nome, Cognome, Nazionalità, DataN) Q1 -> titolo degli album delle canzoni di Freddie Mercury scritte dopo il 1975 Select Album From CANZONE join CANTAUTORE on CodiceA = CodiceAutore When Anno > 1975 AND Nome = Freddie AND Cognome = Mercury Q2 -> codice degli autori della canzone dal titolo “Piove” nati dopo il 1960 Select CodiceAutore From CANTAUTORE join CANZONE on CodiceAutore = CodiceA When Titolo = Piove AND DataN > 1960 ESERCIZIO SU BASE DI DATI POPOLATA Q1 -> cosa restituisce la seguente interrogazione? Select Nome From MATERNITÀ join REDDITO on MATERNITÀ.Figlio = REDDITO.Nome Where MATERNITÀ.Madre = Luisa AND REDDITO.Età > 50 Risposta -> Maria 31 Q2 -> cosa restituisce la seguente interrogazione? Select Nome From MATERNITÀ join REDDITO on MATERNITÀ.Figlio = REDDITO.Nome Where MATERNITÀ.Madre = Luisa AND REDDITO.Età ≥ 50 Risposta -> Luigi e Maria Q3 -> cosa restituisce la seguente interrogazione? Select Nome From MATERNITÀ join REDDITO on MATERNITÀ.Figlio = REDDITO.Nome Where MATERNITÀ.Madre = Luisa AND REDDITO.Età < 50 Risposta -> viene lasciato lo spazio vuoto Q4 -> cosa restituisce la seguente interrogazione? Select Nome, Reddito From MATERNITÀ join REDDITO on MATERNITÀ.Figlio = REDDITO.Nome Where MATERNITÀ.Madre = Anna AND REDDITO.Reddito > 40 Risposta -> Nome: Olga e Reddito: 41 Q5 -> cosa restituisce la seguente interrogazione? Select Nome, Reddito From PATERNITÀ join REDDITO on PATERNITÀ.Figlio = REDDITO.Nome Where PATERNITÀ.Padre = Franco AND REDDITO.Età > 24 Risposta -> Nome: Andrea, Reddito: 21 e Nome: Aldo, Reddito: 15 Scrittura da usare all’esame: NOME REDDITO Andrea 21 Aldo 15 Q6 -> cosa restituisce la seguente interrogazione? Select Nome, Reddito From PATERNITÀ join REDDITO on PATERNITÀ.Figlio = REDDITO.Nome 32 Where PATERNITÀ.Padre = Franco AND REDDITO.Età < 24 Risposta -> viene lasciato lo spazio vuoto Scrittura da usare all’esame: NOME REDDITO Q7 -> cosa restituisce la seguente interrogazione? Select Nome, Reddito From PATERNITÀ join REDDITO on PATERNITÀ.Figlio = REDDITO.Nome Where PATERNITÀ.Padre = Luigi AND REDDITO.Età < 28 Risposta -> Nome: Filippo e Reddito: 30 Q8 -> cosa restituisce la seguente interrogazione? Select Figlio, Età, Reddito From MATERNITÀ join REDDITO on MATERNITÀ.Figlio = REDDITO.Nome Where MATERNITÀ.Madre = Olga Risposta -> viene lasciato lo spazio vuoto perché non esiste madre di nome Olga FIGLIO ETÀ REDDITO Q9 -> cosa restituisce la seguente interrogazione? Select Figlio, Età, Reddito From MATERNITÀ join REDDITO on MATERNITÀ.Figlio = REDDITO.Nome Where MATERNITÀ.Madre = Maria Risposta -> FIGLIO ETÀ REDDITO Andrea 27 21 Aldo 25 15 35 Raggruppando attributi di una stessa entità o relazione e che presentano affinità nel loro significato o nel loro uso si ottengono gli attributi composti (es. via, numero e CAP formano l’indirizzo). L’attributo viene solitamente indicato con una pallina vuota collegata all’entità o alla relazione alla quale fa riferimento. Quindi… - Entità -> classe di oggetti della realtà che vogliamo catturare; - Relazione -> legame logico tra entità e - Attributo -> proprietà delle entità o delle relazioni. LA CARDINALITÀ DELLA RELAZIONE La cardinalità è una coppia di valori associati ad ogni entità che partecipa a una relazione. I valori specificano il numero minimo e massimo di occorrenze delle relazioni cui ciascuna occorrenza di un’entità può partecipare. (1,5) (0,50) IMPIEGATO ASSEGNAMENTO INCARICO In questo esempio, un singolo impiegato può avere da 1 a 5 assegnamenti di un incarico, mentre a un singolo incarico possono essere assegnati da 0 a 50 impiegati. Per semplicità vengono quindi usati solo tre simboli: - 0 e 1 per la cardinalità minima (1,5): o 0 per la partecipazione opzionale e o 1 per la partecipazione obbligatoria e - 1 e N per la cardinalità massima -> N non pone alcun limite (0,50). 0 non può essere usato come valore massimo!! TIPI DI RELAZIONE Con riferimento alle cardinalità massime, abbiamo relazioni: - Uno a uno (1-1); - Uno a molti (1-N) e - Molti a molti (N-N). Bisogna comunque prestare attenzione al verso delle relazioni uno a molti e al fatto che le relazioni obbligatorie-obbligatorie nelle progettazioni reali sono molto rare. CARDINALITÀ DEGLI ATTRIBUTI È possibile associare delle cardinalità anche agli attributi, con due scopi: - Indicare l’opzionalità (informazione incompleta, cardinalità (0,…)) o l’obbligatorietà (cardinalità (1,…)) e - Indicare attributi multivalore (…,N). 36 Numero di cellulare IMPIEGATO Patente Un attributo può essere quindi semplice o composto (ovvero formato da più attributi). Guardando alla cardinalità minima (primo numero della coppia), se essa è 0 l’attributo è opzionale, mentre se essa è 1 l’attributo è obbligatorio. Guardando alla cardinalità massima, invece: - Se l’attributo è 1 non è multivalore e - Se l’attributo è N è multivalore. L’IDENTIFICATORE DI UN’ENTITÀ È uno strumento per l’identificazione univoca delle occorrenze di un’entità. Si specifica per ogni entità ed è costituito da: - Attributi dell’entità (identificatore interno -> chiave) e - Entità esterne attraverso relazione (identificatore esterno). Un identificatore può coinvolgere uno o più attributi mentre un’identificazione esterna può coinvolgere una o più entità ed è possibile solo attraverso una relazione a cui l’entità di identificazione partecipa con cardinalità (1,1). Oltre ciò, ogni entità deve possedere almeno un identificatore, ma può averne in generale più di uno. LA GENERALIZZAZIONE Nel modello E-R è possibile rappresentare gerarchie tra concetti. Una generalizzazione mette in relazione una o più entità E1, E2, E3… (dette entità figlie) con un’entità E (detta entità genitore), che le comprende come casi particolari. Le entità figlie specializzano quindi il concetto dell’entità genitore. Lo schema E-R descrive la realtà di interesse che stiamo modellando da un punto di vista astratto e generale. Un E-R, in generale, non è equivalente a un modello relazionale (tabelle), perché è in grado di esprimere concetti non traducibili (gerarchie, attributi…). La progettazione logica si occupa quindi del passaggio da E-R a relazionale. LA PROGETTAZIONE LOGICA La progettazione logica traduce lo schema concettuale in uno schema logico che rappresenti gli stessi dati in maniera corretta ed efficiente. La progettazione logica richiede due fasi: - Ristrutturazione -> il modello E-R deve essere ristrutturato in modo da rendere possibile, più semplice e più efficiente la traduzione. La ristrutturazione è necessaria perché alcuni costrutti di E-R non hanno una corrispondenza diretta nel modello relazionale e - Traduzione -> traduzione effettiva tra il modello E-R ristrutturato e uno schema logico equivalente. (0,1) (0,1) 37 LA RISTRUTTURAZIONE La ristrutturazione viene usata per semplificare la traduzione verso il modello relazionale e per ottimizzare le prestazioni. Uno schema E-R ristrutturato non è più uno schema concettuale. LE ATTIVITÀ DELLA RISTRUTTURAZIONE Le attività della ristrutturazione sono: - Analisi delle ridondanze; - Partizionamento di entità e relazioni; - Eliminazione delle generalizzazioni; - Eliminazione attributi multivalore e - Scelta degli identificatori primari. Le generalizzazioni e gli attributi multivalore non sono direttamente traducibili nel modello relazionale: non è quindi possibile tradurre direttamente senza averli eliminati. Inoltre, anche la scelta dell’identificatore principale per ogni entità è un attività indispensabile. ELIMINAZIONE DELLE GERARCHIE Il modello relazionale non può rappresentare direttamente le generalizzazioni, mentre entità e relazioni sono direttamente rappresentabili: si eliminano quindi le gerarchie per sostituirle con entità e relazioni. ELIMINAZIONE DI ATTRIBUTI MULTIVALORE Si crea una nuova entità per rappresentare l’attributo eliminato e una nuova relazione che la collega a quella di partenza (in cui sparisce l’attributo in questione). SCELTA DEGLI IDENTIFICATORI PRINCIPALI Operazione indispensabile per la traduzione nel modello relazionale è la scelta degli identificatori principali (nel quale le chiavi giocano un ruolo fondamentale, stabilendo relazioni tra i valori di relazioni diverse). I criteri sono: - Non scegliere attributi che ammettono valori nulli; - Scegliere identificatori semplici con uno o pochi attributi e - Scegliere attributi di utilizzo nelle operazioni più frequenti o importanti. LA TRADUZIONE DELLE RELAZIONI La seconda fase della progettazione logica prevede una traduzione tra modelli diversi. Si parte quindi da uno schema senza generalizzazione ed attributi multivalore. Quindi: - Le entità diventano relazioni (tabelle) sugli stessi attributi; - Le relazioni diventano relazioni (tabelle) sugli identificatori delle entità coinvolte (più gli attributi propri) e - Se gli attributi sono opzionali in E-R, possono poi assumere valori nulli. Per le relazioni si deve prima di tutto esaminare la cardinalità: - Le relazioni molti a molti devono essere tradotte in tabelle a se stanti che hanno come attributi gli eventuali attributi della relazione e le chiavi di entrambe le entità collegate dalla relazione, con le quali sussisteranno vincoli d’integrità referenziale;
Docsity logo


Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved