FONDAMENTI DI INFORMATICA PER LE SCIENZE UMANISTICHE Modulo A 20 febbraio 2014 Informatica = disciplina scientifica che si occupa di studiare il trattamento dell'automazione dei testi Algoritmo = istruzioni non ambigue ( informazioni eseguite meccanicamente ); l'uso di algoritmi era già in uso prima della nascita dei calcolatori ( ENIAC, 1946 ). L 'informatica esiste da 50/60 anni e le persone che facevano parte di questa disciplina erano le più disparate, ora se ne occupano per lo più ingegneri informatici. L'informatica è una disciplina eclettica ed è usata dalla comunicazione sia come strumento che come metodo. Informazione = insieme di dati che altera il mio patrimonio conoscitivo ed è misurabile. CODICE E CONCETTO DI COMUNICAZIONE Comunicazione = idea di trasmettere un messaggio a un ricevente. É necessario concretizzare il messaggio in qualcosa di trasmissibile, ovvero codificarlo trasformandolo in un sistema simbolico. messaggio attraverso Sorgente trasmettitore ricevitore destinazione segnale fisico Un codice: • non è univoco ( la stessa informazione può essere codificata in altri codici ) • può significare diverse diverse cose, infatti non basta la conoscenza del codice simbolico, ma anche del contesto interprerativo, ovvero di un accordo tra trasmettitore e ricevente Possono essere codificati: • dati • operazioni compiute sui dati MESSAGGIO E CODICE Messaggio = successione ordinata di simboli ( es. nell 'alfabeto, il messaggio è la parola : irto/trio ) Codice = insieme di simboli ( alfabeto ) regolato da norme per la loro combinazione e la creazione di messaggi validi Esempio 1. Codice: alfabeto G, I, N, O Regola: ogni messaggio è una successione di 3 dei simboli di G,I,N,O Con 1 simbolo , possono trasmettere 4 messaggi diversi ( 14 ) Con 2 simboli, possono trasmettere 16 messaggi diversi ( 24 ) Con 3 simboli, possono trasmettere 81 messaggi diversi ( 34 ) Più simboli ho, più regole devo avere, però aumentando il numero di messaggi si usano meno simboli, in particolare, messaggi più lunghi portano all'utilizzo di meno simboli Esempio 2. In un mazzo di 52 carte ho 52 diverse informazioni e posso costruire 52 simboli. Se ogni 2 simboli ho un messaggio allora il numero di messaggi aumenta esponenzialmente. In particolare, avremo: I = quantità di informazioni n = numero di simboli dell'alfabeto L = lunghezza del messaggio L I = n I calcolatori sono costituiti da fili elettrici all ' interno dei quali può passare o non può passare la corrente elettrica; basandosi si questo principio è stato creato il sistema binario. Più l'informazione è particolareggiata, più essa è precisa. TEORIA DI SHANNON: la quantità di informazioni è inversamente proporzionale alla probabilità ( un'alta probabilità porta ad una bassa quantità di informazione e viceversa ). L 'informazione minima che posso ottenere è l'unità di misura, è l 'informazione che mi sa il 50 e 50 di possibilità. La quantità minima è detta bit e contiene 2 simboli. Per bit intendiamo: 1. unità di misura dell' informatica ( che viene a coincidere con una delle posizioni occupate del messaggio ) 2. un messaggio minimo lungo uno 1bit = 2 informazioni 2bit = 4 informazioni Essendo il bit piccolo e avendo pochi simboli, si creano messaggi molto lunghi. CODIFICA DEL TESTO Un file di testo è un file che contiene solo caratteri testuali ( Notepad ). File = multipli di but Quantà informazione è stata codificata? • 26 simboli ( in USA ) • minuscole • maiusole • segni di punteggiature • spazio per queste informazioni sono stati necessari 128 segni, quindi 7 bit. ASCII = linguaggio di codifica per codificare 128 segni È stato poi creato un ASCII da 8 bit per includere anche quei caratteri che mancavano nell ' ASCII da 7 bit. UNICOD: usa 2 BITE, o BYTE, per carattere. Consente quindi di rappresentare 2 alla 16 caratteri diversi. Usato per le lingue che utilizzano altri alfabeti (cirillico, ebraico, arabo, greco) Convenzionalmente una successione di 8 bit è chiamata byte e quindi avremo: 8 bit = 1 byte 1Kb = 1024 byte 1Mb = 1024 kilobyte 1Gb = 1024 megabyte 1Tb = 1024 gigabyte 26 febbraio 2014 Il calcolatore elettronico ( più comunemente computer ) è presente in tutti dispositivi elettronici, dal cellulare alla lavatrice. Tramite l' uso dei calcolatori riusciamo a vedere informazioni di input e output che essere semplici (es. scrivere un messaggio di testo ) o complesse ( es. giocare con i videogames ). Nell'uso dei calcolatori abbiamo due macro strati, un primo livello molto alto in cui abbiamo due livelli : 1. utenti 2. struttura fisica del calcolatore, hardware ( livello più basso HARDWARE Esso è composto da: • CPU ( processore ): circuito in grado di fare operazioni • RAM ( Random Access Memery ) o memoria primaria: componente elettronica in grado di memorizzare dati dalla CPU; è una memoria veloce è momentanea • Disco rigido o memoria secondaria: disco magnetico per memorizzare in maniera permanente Quando si lavora su di un file, le sue informazioni vengono caricate dalla memoria primaria a quella secondaria. I dispositivi elettronici sono costituiti anche da un software in grado di compiere le operazioni di calcolo e distinguiamo due livelli : 1. software operativo: si occupa di operazioni di basso livello ed è a questo livello che avvengono i processi di codifica rendendoli poi disponibili al livello successivo dove si collocano tutti i software detti applicativi. ( es. quando uso word e devo salvare un file, viene richiamato il software per trasformare i bit da memoria primaria a memoria secondaria ). Esempi di sistema operativo sono: Windows, Linux, Ios, Android 2. software applicativo: sfruttano le capacità del software operativo e non sono necessari al funzionamento del calcolatore; svolgono operazioni di alto livello e non tutti i software applicativi sono compatibili con quelli operativi, ad esempio Word è compatibile solo con Windows Il testo è un input del software applicativo che poi rimanda i comandi a quello operativo. Le operazioni di tipo numerico e quantitativo mi fanno perdere la codifica, infatti un codice testuale non consente di produrre le quantità; un numero di telefono è invece un codice. Esempio. Considero i numeri inferiori al 10 ( 0­9 ) voglio fare l'operazione: 6+2 = 8 alfabeto: A, B, C, D lunghezza messaggi: 2 AA: 0 AB: 1 AC: 2 AD: 3 BA: 4 BB: 5 BC: 6 BD: 7 CA: 8 BC+AC = CA Devo trovare una regola per cui io abbia sempre che B+A = C e C+C = A, quindi la cosa importante è che non basta tradurre semplicemente i messaggi, ma bisogna avere anche delle proprietà da seguire. Il sistema decimale è congegnato in modo tale che io riesca a scrivere tutti i numeri e vengano mantenute anche le loro proprietà. Come codifichiamo? 24 = 2x10 + 4 nella b10 ogni cifra spostandosi a sinistra diventa potenza della stessa base, quindi avremo: b0 → unità b1 → decine b2 → centinaia Potrei ragionare con dei sassolini. Se facessi gruppi di sassolini uguali conto i gruppi e non la quantità ( che potrebbe essere grande ) di sassolini. Quindi se io prendessi 10 sassolini allora avrei un unico grande gruppo di 10 senza alcuni sassolini esclusi dal gruppo. In particolare, nella base 10, l' 1 rappresenta il gruppo di sassolini e 0 quelli fuori dal gruppo Esempio 1. Due codifiche differenti: 42 in b6 a quanto equivale in b10 ? La b6 usa come sole cifre 0, 1, 2, 3, 4, 5 e avremo: 4x61 + 2x60 = 26 42 in b6 è 26 in b10 Esempio 2. Partiamo da una quantità e usiamo la b4 e le cifre che posso considerare sono 0, 1, 2, 3 e, ragionando con i sassolini, avremo: o o o o o o o o o o sassolini che avanzano: 2 gruppi creati: 2 quindi avremo: 10 b10 22 in b4 Oppure più semplicemente si possono tenere in considerazione i resti: 10 : 4 = 2 con R = 2 2: 4 = 2 con R = 2 22 in b4 Possiamo fare anche una verifica della decodifica, ovvero: 2x41 + 2x40 = 10 Esempio 3. Vogliamo scrivere 7 ( decimale ) in b2. o o o o o o o o o o o o o sassolini che avanzano: 1 gruppi creati: 3 di cui 2 si ragguppano insieme e di conseguenza un gruppo rimane solo e un altro più grande ne contiene due quindi avremo: 7 b10 111 in b2 Oppure: 7 : 2 = 3 con R = 1 3: 2 = 1 con R = 1 111 in b2 1: 2 = 0 con R = 1 Esempio 4. convertire il numero 211 in b3 alla b10 2113 = 1x30 + 1x31 + 2x32 = 1 + 3 +18 = 22 211 in b3 è 22 in b10 Da b10 a bx → metodo della divisione Da bx a b10 → metodo delle potenze SOMMA NEL SISTEMA BINARIO Se fossimo in b10 , avremmo: 7 + 2 = 9, ma in b2 dobbiamo tenere conto che i simboli a noi disponibili sono solo 0 e 1 e quindi, se capitasse di fare 1+1 è nostro compito trasformare il 2 in b2 ; essendo 2 = 10 allora l' 1 sarà il riporto. Esempio. 7 in b10 = 111 in b2 2 in b10 = 10 in b2 riporto 1 7 in b10 1 1 1 2 in b10 1 0 risultato 10 0 1 + ovvero 9 in b10 27 febbraio 2014 Una caratteristica del metodo codifica di tipo binario è quella di essere discreto, in quanto si possono riconoscere i componenti; questo discorso però non si può fare per l'immagine perchè di essa non abbiamo una concezione discreta, ma continua. Come si codifica? Per codificare un' immagine è necessario renderla discreta dividendo l' immagine in quadratini sempre più piccoli, finchè diventano punti, che si chiamano pixel. Chiaramente più pixel vengono fatti e più il livello di approssimazione sarà migliore. Risoluzione = quantità di pixel Spesso, essendo grandi le immagini, si esprime la sua grandezza mediante la risoluzione indicando la quantità di pixel in verticale e in orizzonale ( 1024x800 ). FORMATI DELLE IMMAGINI Tra i diversi formati è minima la differenza in cui vengono memorizzati i bit o come questi vengono letti, ma è più interessante analizzare il modo in cui vengono compresse le immagini. Comprimere un' immagine = considerare i bit che la compongono e creare una stringa di bit più piccola. Abbiamo due diversi tipi di compressione: 1. compressione senza perdita: riproduco la stessa stringa che avevo preso in considerazione 2. compressione con perdita: perdo alcuni bit nella riproduzione; chiaramente avrò un' immagine meno nitida con un' approssimazione sui colori ( formato gif ) Esempio. Considero la stringa di bit 000000000000010010 Essa si può scrivere come 01311 02 11 01 e in questo modo occupo meno spazio e non ho alcuna perdita e il 13 lo codifico con 4 bit ( 13: 2 = 6 R =1, 6: 2 = 3 R = 0, 3: 2 = 1 R = 1, 1:2 = 0 R= 1 ). Come coloro un 'immagine? Ogni pixel è un bit, quindi se avessimo una foto in bianco in nero possiamo codificare questi colori con il codice binario, in particolare si ha: bianco → 0 nero → 1 Se avessimo invece una foto a colori i bit da rappresentare sono in numero più elevato e bisogna tenere anche conto che l'occhio umano vede circa 16milioni di sfumature, quindi per ogni bit devo rappresentare 1 di 16milioni di informazioni. Dai colori primari si ottengono tutti gli altri colori, per cui 1 bit, che equivale a un colore, va scomposto nelle sue componenti; se scegliessimo una solo sfumatura di rosso – verde – blu otteniamo pochi colori. Da qui si è giunti a considerare: 256 possibili sfumature di rosso 256 possibili sfumature di verde 2563 circa 16milioni 256 possibili sfumature di blu Quanti bit ci servono per codificare i colori? Utilizzo la codifica binaria per i colori rosso – verde – blu e per ognuno di questi uso 8 bit ( 23 ) ovvero 1 byte 24 bit ( 8x3 ) per ogni colore ovvero 3 byte; spesso il numero che rimanda ai colori viene espresso in b16 così da risparmiare. RGB = nome di un modello di colori Esempio. RGB ( 0, 128, 8 ) → assenza di rosso, tanto verde e poco blu RGB ( # CC, 66, 00 ) → molto rosso, un po' di verde e assenza di blu nero in b16 ( 00, 00, 00 ) binco in b16 ( FF, FF, FF ) CODIFICA AUDIO L' idea di fondo è la stessa della codifica di immagine in quanto anche un suono è di tipo continuo. Come si codifica? Allo stesso modo dell' immagine è necessario rendere il suono discreto facendo un campionamento: misuro l'altezza in diversi punti dell'onda ottenendo dei numeri che posso così codificare. L'approssimazione è più precisa in base alla frequenza dei punti > frequenza del campionamento e > è la qualità del suono HERTZ = misura del campionamento al secondo INFORMAZIONE E META­INFORMAZIONE Quando codifichiamo un' insieme di informazioni accade che si instaurino delle relazioni tra esse; possiamo distinguere tra informazioni e meta – informazioni e un buon sistema di codifica deve codificare sia le une che le altre. Esempio. Codifichiamo ad esempio il voto dato dai critici a un film sulla scala : pessimo mediocre diverse informazioni legate tra di loro da una relazione d'ordine; discreto le informazioni sono rappresentate dai voti possibili dati e e meta – buono informazioni dalle relazioni tra i diversi voti ottimo Se codificassimo i voti con il seguente codice binario , avremo: 100 pessimo 001 mediocre abbiamo così una codifica corretta dell’informazione ma non 110 discreto della meta­informazione, in quanto: 010 buono discreto < buono < ottimo non corrisponde a 110 < 010 < 000 000 ottimo Come posso codificare un' informazione mantenendo anche le meta­ informazioni? Esistono due strategie perché questo avvenga, ed esse sono: 1. Utilizzare un sistema in cui tra i simboli intercorre la stessa relazione che è presente fra le informazioni da codificare; in questo modo la meta­ informazione è esplicita e, essendo il sistema analogo all' informazione che codifica, si parla di sistema codifica analogica 2. Utilizzare un sistema in cui la relazione fra i simboli corrisponde alla relazione fra le informazioni solo in virtù della regola usata per associare simboli e informazioni ; in questo modo la meta­informazione è implicita nella regola di codifica e chiamiamo questa strategia codifica digitale Prendendo in considerazione la scala di giudizi utilizzata nell'esempio precedente, possiamo dire che: • abbiamo una codifica analogica se la relazione fra i giudizi corrisponde esplicitamente al numero di stelline usate per esprimerlo abbiamo una codifica digitale se la relazione fra giudizi corrisponde alla relazione fra i simboli solo in virtù della regola con cui abbiamo associato ad ogni simbolo il giudizio corrispondente GG GN NI NN NG • 5 marzo 2014 BANCHE DATI ( DATABASE ) Prendendo in considerazione un' informazione che appare a noi utenti già in forma testuale, vogliamo gestire questa informazione in maniera funzionale per l'uso che dobbiamo farne. Ci si pone però un problema, ovvero il come gestire una grande quantità di dati e organizzarli in modo che essi siano funzionali per l'utilizzo delle applicazioni, le informazioni infatti devono essere funzionali allo scopo di archiviarle da un lato ed estrarle dall'altro; normalmente è un'azione che facciamo quotidianamente quando usiamo i calcolatori, infatti, ogni volta che viene creato un file, questo viene salvato dalla macchina che, in qualche modo, archivia le informazioni in un sistema, in questo caso quello del file ( insieme di bit codificati in un certo modo che vengono salvati fisicamente sul disco fisso ). Quando recuperiamo questi dati, accediamo ad una rappresentazione astratta del disco, rappresentata generalmente dalle cartelle. Questa struttura in linguaggio informatico viene detta file system Struttura ad albero = struttura assunta dalle cartelle, poiché dentro una cartella qualsiasi possiamo salvare tutti i file possibili insieme ad altre cartelle Radice = una cartella d'origine da cui parte tutto Da questa struttura ne deriva che: • la stessa cartella non può avere più di una cartella madre (cartella superiore ): ogni file/cartella deve avere un nome diverso dagli altri, altrimenti il sistema operativo non sarebbe in grado di sapere quali dati recuperare; infatti il vero nome del file è composto dal nome di tutte le cartelle che lo precedono fino al nome del file, in questo modo i nomi di file e cartelle sono tutti diversi. Ogni sistema operativo, utilizza modi propri per separare cartelle e file, in particolare abbiamo: • / (barra rovesciata): separatore usato dal file system di Windows • | ( barra dritta ): separatore usato dal file system di Unix ( es. Linux ) Anche Internet si avvale della stessa logica, perciò ogni separatore ci ricorda l'indirizzo dei vari siti: anche in questo caso abbiamo un distinzione in base ai sistemi operativi, nel modo di indicare la cartella radice, in particolare: • C:: in Windows • /: nei sistemi Unix Questo sistema di memorizzazione dell'informazione ha due principali difetti nell'uso di particolari casi: 1. In generale quando mettiamo diverse informazioni all'interno di un file, queste informazioni non vengono separate le une dalle altre, infatti, per manipolarle devo manipolare il file stesso manualmente. 2. Non abbiamo una rappresentazione standard di queste informazioni. Tutto questo complica le cose dal punto di vista della gestione dei dati perciò intorno agli anni 70' si è pensato ad una soluzione Inserire i dati nei cosiddetti database = una collezione di dati ordinati organizzati con qualche criterio logico che ha per scopo di rappresentare le informazioni relative di un certo dominio applicativo Abbiamo a che fare con banche dati quotidianamente, ma non lo sappiamo Esempio. Facebook: le informazioni contenute sul mio profilo e le informazioni relative a tutti i miei contatti sono inserite in una banca dati. Questa realtà viene chiamata universo del discorso poiché una banca dati non viene costruita per rappresentare tutta la realtà, ma si fa una selezione dei dati. Questi dati vengano aggiornati continuamente da più utenti anche nello stesso momento e inoltre, obbiettivo di una banca dati è di rappresentare le informazioni in maniera coerente, con la possibilità di correlarle tra di loro. Per fare questo dobbiamo porci il seguente problema: come possiamo rappresentare questi dati in modo da offrire alle applicazioni che potrebbero utilizzarli una struttura dati di riferimento, cioè un'organizzazione di dati tale per cui l'applicazione sappia come recuperarli automaticamente? Principio sul quale si costruiscono i database = è necessario riprendere la distinzione tra informazione e dato. Sappiamo che questo ultimo indica una qualsiasi informazioni registrata su un supporto materiale di un atto accaduto e sono rappresentati come successioni di stringhe (di testo o di numeri) correlati da un contesto interpretativo ( poiché un dato in sé non ha nessun significato ) e infatti per poter diventare informazione deve assumere un contesto informativo e interpretativo. Il significato di un dato deriva dalla relazione tra i dati, dal fatto che questi sono correlati; possiamo dire che l'informazione non sta nel dato in sé, ma nella correlazione dei dati. Uno degli scopi principali dei database, per l'appunto, è quello di mettere in correlazione i dati in modo che abbiamo significato. Dal punto di vista pratico tutto questo discorso si concretizza nel fatto che una volta creato un modello questo viene incrementato attraverso alcuni programmi che hanno lo scopo di gestire i dati secondo un certo modello e interrogarli. DBMS ( Database Management System ) = sistema software realizzato allo scopo di gestire in maniera efficiente i dati correlati secondo un modello logico e il più diffuso è il modello relazionale; questo sistema software non è qualcosa di visibile, ma è qualcosa che è in funzione sulla macchina e che posso interrogare tramite un'interfaccia. Cosa succede dietro le quinte di un sito web quando schiacciamo il pulsante “Cerca”? C'è un database costituito da tabelle e c'è un'applicazione che costruisce questa informazione, inviandola al DBMS, il quale risponde con questi dati; l'applicazione prende i dati interessati e costruisce la pagina web. Questo meccanismo è talmente generale che funziona per la maggior parte delle applicazioni che utilizziamo. Cambiano i dati, il modo in cui sono organizzati e cambiano le tabelle. Principio di Centralità dei Dati = un database si occupa di centralizzare la gestione dei dati e renderla indipendente rispetto alle applicazioni. Si segue l'idea di costruire un unico posto con un'unica struttura dati coerente ( fatta di tabelle ) in cui inseriamo tutti i dati. Una volta centralizzati i dati in una banca, questa li raccoglie inserendoli nello stesso posto e le varie applicazioni possono accedervi. MODELLO DI DATI Un modello di dati è un'insieme di tabelle, costituito da tre principali elementi: 1. Un'insieme di costrutti logici ovvero una qualsiasi rappresentazione formale che consente di correlare i dati 2. Una notazione per specificare i dati tramite i costrutti del modello 3. Un' insieme di operazioni che posso fare su questi costrutti per interrogare e modificare i dati secondo quel modello COSTRUZIONE DI UN DATABESE La costruzione di un database conta due fasi: 1. Fase di progettazione: definizione di una struttura dati, ovvero la creazione di un' organizzazione logica che voglio dare ai dati che ho a disposizione e produce come risultato lo schema della base dati, cioè la struttura vuota delle tabelle e i vincoli che devono rispettare i dati per essere validi. 2. Inserimento dei dati e il loro aggiornamento che avviene più frequentemente in quanto i dati vengono aggiornati costantemente Progettazione concettuale = passaggio intermedio fatto perché, sebbene la costruzione di un database avvenga inserendo dei dati in specifiche tabelle, la realtà non è concepita in tabelle; la progettazione concettuale può essere fatta anche su carta. Schema concettuale = schema intermedio prodotto dall' insieme di conoscenze formalizzate che è una via di mezzo tra il modo in cui concepiamo la realtà e il modo in cui questa viene tradotta nel modello. Una volta fatto questo, tradurremo questo passaggio intermedio nel database finale; la costruzione di un database si può fare tramite l' istallazione di un DBMS o con l' utilizzo di un software SQL Lite ( famiglia di programmi che consente di gestire le tabelle e salvare tutto in un file ). Esempio. Supponiamo di costruire un database su un argomento generico, in questo caso sceglieremo i libri. A questo punto devo compiere tre operazioni: 1. Raccogliere le specifiche: dati testuali che mi servono 2. Utilizzare un modello concettuale: in questo caso ER, chiamato così perché i due macro costrutti che utilizziamo sono le entità e le relazioni. Entità = qualsiasi raggruppamento di oggetti della realtà ( libri ) Relazioni = tutti quegli elementi che ci servono a collegare le categorie di oggetti ( es. una categoria di libri potrebbe essere quella degli autori) 3. Definire le caratteristiche dell'entità del modello ER con un altro costrutto chiamato attributo ( es. titolo, anno pubblicazione ) Rappresentazione nello schema concettuale: Entità → rappresentata graficamente attraverso un rettangolo in cui scriveremo il nome che voglio dare al mio raggruppamento di oggetti Relazione → rappresentata graficamente con un rombo Attributo → rappresentato graficamente associando un pallino all'entità o anno di pubblicazione AUTORE LIBRO o titolo Poiché quando costruiamo un data base dobbiamo compiere delle scelte specifiche, potrei sostituire il termine LIBRI con il termine VOLUMI se considero l'edizione specifica e non l'oggetto materiale in sé. o editore data morte s anno data nascita sesso o sovrageneri lingua t pagine VOLUME AUTORE t o g e GENERE n. o giallo OPERA 12 marzo 2014 Creare un insieme vuol dire stabilire una regola ( un ragionamento che sta dietro l' entità ). Distinguiamo due tipi di metodi, ovvero: 1. metodo intensionale basato sulle caratteristiche 2. metodo estensionale basato sulla quantità di oggetti Un obbiettivo della base dati è quella di non rappresentare in modo ridondante l' informazione, infatti non è obbligatorio che una relazione colleghi entità diverse. In una base dati, oltre alla struttura dei dati, sono presenti: • vincoli = regola, proprietà soddisfatta dalle istanze di una base dati. • identificatori = insieme di attributi o entità connesse a un ' entità che permettono di identificare in modo univoco gli elementi dell ' entità; quindi quando un database cerca dei dati, questi devono essere unici e univoci e un attributo che identifica univocamente un’istanza è tale per cui non vi sono due o più istanze caratterizzate dallo stesso valore per quell’attributo ( es. codice fiscale di una persona ). Distinguiamo due tipologie di identificatori: ­ interno: uno o più attributi di E sono sufficienti ad individuare un identificatore ­ esterno: si utilizzano entità con cui E ha un vincolo di dipendenza e cardinalità ( 1,1 ) Gli insiemi si creano stabilendo delle regole e abbiamo delle gerarchie in base al legame che intercorre fra le entità; l ' entità più generale è detta entità padre, mentre quelle più specifiche sono chiamate entità figlie ed è per questo che si parla di legame di specializzazione di un ' entità rispetto ad un 'altra → meccanismo di ereditarietà In base al legame, distinguiamo quindi: 1. Gerarchia totale: l' unione delle entità figlie coincide con l' entità padre tutti gli oggetti dell' entità padre coincidono con tutti gli oggetti di almeno un ' entità figlia 2. Gerarchia parziale: l' unione delle entità figlie non coincide con l' entità padre posso esserci elementi dell' entità padre che non appartengono ad alcuna entità figlia Se facessimo l' intersezione tra le entità figlie, possiamo ottenere: 1. Gerarchia esclusiva: quando questo insieme non contiene alcun oggetto 2. Gerarchia sovrapposta: quando ogni oggetto compare al più in una sola delle entità figlie Le caratteristiche di una gerarchia vengono indicate con una coppia di lettere, in particolare: T → totale P → parziale E → esclusiva O → overlapping La cardinalità = quante istanze di entità partecipano ad una relazione ; Distinguiamo due vincoli di cardinalità: 1. vincolo di cardinalità minima mc : numero minimo di istanze di relazione a cui un’istanza di entità può partecipare 2. vincolo di cardinalità massima MC : numero massimo di istanze di relazione a cui un’istanza di entità può partecipare MC = n indica che il limite massimo è un numero arbitrario In base ai valori di cardinalità massima MC, possiamo ottenere diverse tipologie di relazioni binarie, in particolare: • 1:1, in cui MC = 1 per entrambe le entità • 1:N, in cui MC = 1 per un 'entità e MC = N per l'altra • N:N, in cui MC = N per entrambe le unità Esempio. ( 1,1 ) ( 0,N ) residenza PERSONE CITTÀ ( 0,N ) visite ( 0,N ) Leggendo le cardinalità, avremo: • una persona può avere una sola residenza in una città e a sua volta la residenza di una persona è solo in una città • una città può non essere residenza per nessuno e allo stesso modo tutte possono esserlo • una persona può non avere visitato alcuna città come può averne visitate • una città può non essere mai stata visitata da una persona o può esserlo stata N volte 13 marzo 2014 residenza P C visite il vincolo di cardinalità è utile perchè è necessario quantificare la relazione; esiste una cardinalità massima e una cardinalità minima e, in questa relazione saranno: ( 1,1 ) ( 0, N ) P C presa una persona può deve risiedere in una sola città; presa una città, essa può avere come minimo 0 abitanti e come massimo n° abitanti. Le cardinalità massime possono essere: ( 1, 1 ) → relazione particolare, biunivoca e capita raramente ( 1, N ) ( N, N ) → relazioni meno vincolate Per passare dal modello concettuale al modello logico si usano delle tabelle che rappresentano il modello logico dei dati Modello relazionale = modello basato sulla nozione di relazione in senso matematico. Pensiamo di avere 3 insiemi chiamati “ dominio” D1 D2 D3 α β A B x x γ X Y C Alla base della nozione di relazione, c'è il prodotto cartesiano ( D1 x D2 x D3 ) che combina gli oggetti degli insiemi, e avremo quindi: D1 x D2 x D3 A x α A y α A x β A y β … … … … … … da queste combinazioni, scelgo solo alcune, isolando degli elementi e creo una relazione. Esempio. Dati D1 che contiene gli animali e D2 che contiene i colori , voglio rappresentare i colori degli animali D1 D2 Gatto Bianco Pappagallo Nero Corvo Il prodotto cartesiano D1 x D2 diventa: Gatto bianco Gatto nero Pappagallo bianco Pappagallo nero Corvo bianco Corvo nero Nella realtà i corvi bianchi non esistono e lo stesso vale per i pappagalli neri, per questo dall 'insieme del prodotto cartesiano scelgo solo alcune relazioni. La relazione creata può essere rappresentata in tabella, ovvero: Animale Colore Gatto Bianco Gatto Nero Pappagallo Bianco Corvo Nero La struttura della tabella è fissa, quindi abbiamo: 1. schema della relazione → colonne 2. celle → dati 3. domini → prima riga della colonna 4. n° colonne → grado della tabella 5. n° righe → cardinalità perchè indica quanti elementi ci sono in tabella Se dovessi fare una tabella con nome, cognome, matricola ed età, allora si ha che: • matrcola → stringa o CHAR ( non ho numeri perchè non faccio un0 operazione ) • nome → CHAR ( carattere ) • cognome → CHAR • età → INTEGER ( numero intero ) 20 marzo 2014 LOGICHE PREDICATIVE Dominio = tipo di dati che può contenere NULL = valore nullo che denota l 'assenza di informazione. Il valore NULL è compatibile con tutti i domini Esempio. Costruisco un 'espressione che contenga parti variabili A B C (età ) x y 12 La domanda : “l 'utente ha più di 10 anni” viene tradotta in predicato → l' utente ha eta > 10 e questo è vero perchè 12 > 10 Sostituisco il valore del predicato coi dati e essi possono far diventare vera o falsa la domanda generale. Semantica del mondo aperto = se non so qualcosa, è provabile Semantica del mondo chiuso = semantica usata dai database relazionali in cui le nullità vengono scartate Persone CF Nome Città Età 1 Giulio Milano 26 2 Mario Milano 18 3 Luca Verona 26 Voglio trovare le persone con meno di 20 anni. Trova età < 20 ( è quello che fa la macchina ) e trova così solo la seconda riga. Se volessi invece trovare chi abita a Milano, allora la domanda sarà: Trova città = 'MI' Per domande più complicate, faccio ricordo ad alcuni connettivi logici, tra cui: • AND:connettivo che unisce due valori variabili e la macchina trova la verità che serve Esempio. Supponiamo di avere trova città = 'Mi' and età < 20 trova città='MI' ( A in tabella ) età < 20 ( B in tabella ) Devo prendere in considerazione tutti i casi possibili e poi metto solo ciò che mi interessa e rispecchi l' and. A B AND V V V V F F F V F F F F • OR: connettivo logico che non ha valore esclusivo Esempio. Troviamo solo le persone di Milano o con età < 20 A B A or B V V V V F V F F F F V V Perchè la relazione A or B sia V, mi basta che anche una sola delle due proposizioni sia V • NOT: connettivo che esprime un concetto di negazione, nel senso che la proposizione è F nel momento in cui affermo e nego qualcosa nello stesso momento ( es. Se “oggi piove” è ( F ) la sua negazione: “oggi non piove” è V ) La tabella del not, sarà: A Not A V F F V NB: – A and ( not A ) → esprima in modo aritmetico il concetto di contrario – A or ( not A ) → è sempre vera Le tabelle sono la realizzazione delle entità e nei database possiamo avere anche più di una tabella. Esempio. Supponiamo di avere due tabelle ( PERSONE e CITTÀ ) PERSONE ( tabella1 ) COD Nome Nazionalità 1 Gino ITA 2 John USA 3 Carlos ES CITTÀ ( tabella2 ) Sigla Nome Nazionalità MI Milano IT PA Palermo IT MA Madrid ES NY New York USA SE Seattle USA Le persone della tabella1, risiedono nelle città presenti nella tabella2, a questo punto abbiamo bisogno di un nodo per collegare persone e residenza, devo quindi aggiungere un campo alla tabella persone ( tabella1 ) e ottengo: COD Nome Nazionalità Sigla 1 Gino ITA MI 2 John USA PA 3 Carlos ES MA In questo modo non perdo alcuna informazione e la nazionalità delle persone posso ottenerla andando nella tabella2; la colonna Sigla rappresenta una chiave esterna, ovvero un campo artificiale di una tabella per arrivare arrivare ai campi di un' altra tabella e i dati aggiungi ad una tabella devono essere univoci. • Nelle relazioni 1 a molti, aggiungo una tabella nel lato1. ( 0;1 ) ( 0; N ) U S iscritti Traducendo questa relazione in tabelle, avremo: Studenti Matricola Nome 01 Gino 02 Luca 03 Mario Università COD Nome Città Unimi Gino MI Polimi Luca MI Poli Mario NA Aggiungendo la chiave esterna, ho: Matricola Nome Università 01 Gino Unimi 02 Luca Null 03 Mario Poli / Unimi Nelle relazioni molti a molti ( persone che visitano città ), avrò: • ( 0; N ) ( 0; N ) P C visitate Traducendo questa relazione in tabelle, ho: Persone COD Nome Età 1 Gino 20 2 Maria 30 Città COD Nome Nazione MI Milano IT PA Palermo IT Costruisco la terza tabella in cui ad ogni COD di persona corrisponde il COD della città e ottengo: Visita COD persona COD città 01 MI 02 PA 26 marzo 2014 L' idea è che ogni oggetto reale diventi una riga della tabella, ma so che nella realtà ci sono relazioni e legami. Come posso collegare le diverse righe della tabella? Questo problema di collegamento mediante l' utilizzo di una chiave esterna. Esempio. Persone CF Nome Residenza x Gino MI y Mario PA Città COD Nome MI Milano PA Palermo La parte in azzurro è la chiave esterna che ci permette di creare una relazione tra la tabella Persone e la tabella Città. Vincoli, regole che servono per evitare errori nell' ingresso dei dati e quindi i dati inseriti sono sempre corretti rispetto allo schema nel senso che potremmo trovare solo errori logici, ad esempio, se nella tabella Persone volessimo inserire: x Luca Mi non c'è alcun errore nell ' uso della tabella ( che sarebbe errore logico ), ma l 'errore è nella ripetizione della x già usata per Gino. Per ovviare a questo errore si ricorre al vincolo del modello relazionale in cui non ci sono valori duplicati e quindi, se x è una chiave non devono esserci due dupli di x. Ci possono essere più attributi , ma si stabilisce una sola chiave/identificatore che è la primary key cui si fa riferimento. Aver stabilito che un attributo è vincolo di primary key implica che : • il DBMS controlla l'unicità • il DBMS controlla che il valore non sia nullo ( il valore nullo non è un valore ) , infatti la chiave non può assumere valore nullo Supponiamo di avere come chiave primaria il codice della città e questo vincolo ci permette di evidenziare altri errori che riguardano le chiavi esterne, infatti, se considerassimo queste tabelle: Persone CF Nome Residenza x Gino MI y Mario NA z Luca NULL Città COD Nome MI Milano PA Palermo Notiamo come NA non appartenga alla tabella a cui facciamo riferimento ed è quindi un valore pendente e un errore. NULL non è invece errore perchè vuol dire semplicemente che non so dove risieda Luca e inoltre non è un problema perchè non crea un riferimento e non è chiave primaria. Per evitare l'errore di NA, quando creo il vincolo della primary key, creo anche il vincolo di integrità referenziale e quindi : • il dato deve esistere • il dato deve essere pescato dalla primary key della tabella di riferimento così, quando cerco di inserire NA in Residenza, in DBMS non me lo farà inserire se non è presente nella chiave primaria della tabella a cui mi riferisco. Esempio. Ricerca anomalie nell' esempio presente nelle slide: • Non sono stati posti dei vincoli. Ragionevolmente è chiave primaria l' e­mail. Sono chiavi esterne sia l' attributo utente che l' attributo amico; per quanto riguarda amici c'è un errore poiché verdi non ha alcuna corrispondenza nella tabella, quindi, ponendo un vincolo di integrità referenziale per cui sono accettati solo gli oggetti presenti nella chiave primaria, questo errore viene risolto. LINGUAGGIO Il linguaggio usato dalle macchine funziona in modo non ambiguo, in cui, essendo artificiale, vengono stabilite a priori le espressioni possibili. Per costruire i database viene utilizzato il linguaggio SQL attraverso cui è possibile costruire le tabelle ( nome, dati dei contenuti, attributi, vincoli ). Per creare la tabella in tutte le sue componenti ho dei comandi: Comando Significato CREATE TABLE + nome tabella ( variabile ) Creare la tabella VARCHAR Caratteri variabili INTEGER Numeri interi BOOLEAN Scelta tra due valori INSERT INTO + nome tabella + attributo + VALUES + ( “ “, “ “, ) Inserire dati nella tabella SELECT*FROM + nome tabella + attributo ( Visualizzare ciò che c'è nella tabella variabile ) PRIMARY KEY Chiave primaria REFERENCE Chiave esterna Se volessimo quindi riprodurre la tabella in slide faremo in linguaggio SQL, digitiamo: CREATE TABLE utente ( email VARCHAR PRIMARY KEY, nome VARCHAR, cognome VARCHAR, eta INTEGER, maggiorenne BOOLEAN ) Per dire che email è chiave primaria posso con due diverse sintassi: 1. scrivere PRIMARY KEY dopo VARCHAR 2. scrivere in fondo alla lista PRIMARY KEY ( email ) chiaramente se la PK fosse composta da due valori devo usare per forza la seconda sintassi che mi consente di fare un elenco tra parentesi. Per inserire poi i dati digito: INTER INTO utente ( email, nome ) VALUES ( “x”,” gino”) Se inserissi Mario al posto di Gino, apparentemente non accade nulla, però il DBMS non lo inserisce nella tabella perchè avrebbe anche lui x come email. Passiamo a creare la tabella di relazione: CREATE TABLE amicizia ( amico A VARCHAR REFERENCE utente ( email ), amico B VARCHAR REFERENCE utente ( email )) entrambi i campi sono chiavi esterne e sono due campi che si riferiscono entrambi a un campo solo della tabella di riferimento, infatti sono rappresentati da una relazione ricorsiva e creano un vincolo di controllo. Esempio. CF COD nome o ( 0,1) residenza ( 0,N ) PERSONE CITTÀ o nome o età o regione P ( CF, nome, eta, citta ) città è chiave esterna e va sottolineata da puntini C ( COD, nome, regione ) CREATE TABLE citta ( COD VARCHAR PRIMARY KEY, nome VARCHAR, regione VARCHAR ) CREATE TABLE persone ( CF VARCHAR PRIMARY KEY, nome VARCHAR, eta INTEGER, citta VARCHAR REFERENCE citta ( COD )) 27 marzo 2014 Esercitazione. Vedi foglio. 2 aprile 2014 Come si interroga una base di dati? Le basi sono interrogate secondo una logica e con il linguaggio artificiale SQL; le operazioni logiche vengono espresse in algebra relazionale e poi tradotte in SQL. L' informazione di ingresso è rappresentata dalla/e tabella/e su cui vengono effettuate le domande, la risposta ci restituisce poi una tabella­risultato che contiene dati e rispetto alla/e tabella/e d'origine non è presente nello schema ER, ma è solo virtuale. Sulla stessa tabella posso fare altre domande da cui ottengo come risultato tabelle sempre più precise. OPERAZIONE DI SELEZIONE Questa operazione è l' operazione di partenza ed è indicata con б. Essa restituisce le stesse righe della tabella­origine, ma non le colonne e di conseguenza devo dire tramite dei vincoli quali righe voglio mantenere, per le quali ho quindi un interesse. In termini pratici, essendo la selezione un predicato, questo viene applicato ad ogni riga ( se il predicato è Vero, viene mantenuto; se è Falso viene scartato ) Esempio. Persone CF Nome Cognome Età Nazionalità x Gino Verdi 35 ITA y John Smith 22 USA z Marco Bianchi 18 ES Vogliamo selezionare le persone con età maggiore di 20 anni nella tabella Persone e avremo quindi: б ( persone ) età > 20 ­ condizione di selezione­ la tabella­risultato è: CF Nome Cognome Età Nazionalità x Gino Verdi 35 ITA y John Smith 22 USA Se volessi prendere in considerazione solo i 20enni americani, faccio un' altra selezione, ottenendo: CF Nome Cognome Età Nazionalità y John Smith 22 USA OPERAZIONE DELLA PROIEZIONE ORTOGONALE ALLA SELEZIONE Questa operazione consente di prendere in considerazione tutte le righe, come l 'operazione di selezione, ma anche qualche colonna. Essa è indicata con π Esempio. Applico l' operazione sulla tabella Persona e prendo in considerazione la colonna nazionalità, avendo così: π ( persone ) nazionalità ­ condizione di proiezione ­ Nazionalità ITA USA ES Nella proiezione posso prendere in considerazione anche più campi e scriverò: π ( persone ) nazionalità, nome Nome Nazionalità Gino ITA John USA Marco ES Abbiamo visto che, come l' operazione di selezione, anche quella di proiezione ci restituisce tabelle, quindi analogamente posso fare più operazioni; nella selezione devo ripetere due volte l 'operazione, invece con la proiezione posso fare una composizione, ovvero, se volessi recuperare solo i cognomi delle persone con più di 20 anni dovrei fare: б ( persone ) età > 20 e poi una proiezione : π ( persone ) cognome Ma poso comodamente scrivere: π ( persone ) (б ( persone ) cognome età > 20 ) e ottengo una tabella­risultato con una solo colonna: Cognome Verdi Smith Le due operazioni in SQL si riscrivono in modo semplice, però dobbiamo dire al software quale tabella prendere in considerazione, quindi se volessimo proiettare Cognome da persone devo scrivere: SELECT cognome FROM persone a scrittura algebrica è: π ( persone ) cognome WHERE è la clausola di selezione, quindi per dire in linguaggio SQL di selezionare i cognomi delle persone con più di 20 anni, scriverò: SELECT cognome FROM persone WHERE eta > 20 Esempio. Selezionare nome e cognome delle persone americane e italiane SELECT nome, cognome FROM persone WHERE nazionalità 'USA' OR nazionalità 'ITA' la preposizione del Where è valutata per ogni riga e poi isola la colonna del nome e cognome. 3 aprile 2014 SELECT FROM struttura base della domanda WHERE ( opzionale ) select dice quali colonne guardare e where indica la condizione di selezione; se un dato è una stringa di testo allora questo va inserito tra gli apici ( '…' ), invece se è un numero va inserito senza apici. Supponiamo di voler fare un' interrogazione, in cui abbiamo: SELECT * FROM autore ma, essendo questa una relazione molti a molti, allora abbiamo la 3° tabella, che è scrivere e dentro troviamo gli ID che sono chiavi primarie, per cui ho: INTERT INTO scrivere ( autore, opera ) VALUES ( 3,1 ) in cui 3 equivale a Manzoni e 1 a Promessi Sposi e se faccio SELECT posso visualizzare la relazione secondo cui l 'opera 1 è scritta dall' autore 3. Questo meccanismo ha lo scopo di non creare ambiguità e che i dati siano correlati in modo corretto nel momento in cui interroga la base di dati e devo fare in modo che non compaia il numero perchè l 'utente non sa cosa corrisponda al numero ( in questo caso 1 e 3 ); l 'operazione che mette insieme le due relazioni è l 'operazione insiemistica, ovvero il prodotto cartesiano tra le due tabelle in cui gli elementi sono le righe. Esempio. Ho due tabelle di cui voglio farne il prodotto cartesiano Persone COD Nome Residenza x Gino 1 y Maria 3 Città COD Nome 1 Milano 2 Palermo 3 Ancona La proiezione insiemistica lavora su due tabelle e per questo faccio il prodotto cartesiano e ottengo una tabella in cui ho le colonne dalla tabella Persone e quelle della tabella Città, mentre le righe rappresentano i dati; e ottengo: Persone x Città COD Nome Residenza COD Nome x Gino 1 1 Milano x Gino 1 2 Palermo x Gino 1 3 Ancona y Maria 3 1 Milano y Maria 3 2 Palermo y Maria 3 3 Ancona A noi interessa una corrispondenza tra chiave primaria e chiave esterna ed è necessario quindi selezionare solo ciò che ci interessa dal prodotto cartesiano che invece ci offre una molteplicità di righe, per questo si effettua l' operazione di JOIN sul prodotto cartesiano. Tornando all' esempio dei libri, supponiamo di conoscere il COD ( nome autore ) e dobbiamo far corrispondere le opere; avremo quindi due tabelle: SCRIVE ( autore, opera ) OPERA ( COD, titolo, ecc ) prodotto cartesiano : SCRIVERE x OPERA in SQL basta mettere un elenco di tabelle in FROM, ovvero: SELECT * FROM scrivere, opera ( prodotto cartesiano in SQL ) e mi aspetto di trovare 3 righe ( autore 3 combinato con l' 1 combinato con i vari ID ); senza scrivere l' autore so che la riga corretta è quella in cui autore e ID sono uguali, le altre righe sono risultati spuri e come vengono elimati? Facendo una selezione del prodotto cartesiano, ovvero: WHERE scrive, opera = opera.id Esempio1. Voglio trovare gli autori nati dopo il 1850 AUTORE ( ID, nome, sesso, nazionalità, nascita, morte ) OPERA ( ID, titolo, tipo, argomento, genere, anno ) SCRIVE ( autore, opera ) dal momento che i dati di cui ho bisogno si trovano nella stessa tabella, posso non usare l' operazione di JOIN ) Prima faccio la selezione: π ( nazionalità ) (б ( autore ) in SQL è: SELECT nazionalità nascita > 1850 ) FROM autore WHERE nascita > 1850 Esempio2. Voglio trovare i titoli di opere scritte da autori francesi. Per fare ciò, ho bisogno della nazionalità dell' autore presente nella tabella Autore e del titolo presente nella tabella Opera, devo quindi fare l' operazione di JOIN, però, non c'è un collegamento diretto tra le due tabelle, quindi prima di fare l' operazione è necessario collegare le tabelle Scrive e Opera. Dovremo avere che opera = id per quanto riguarda Scrive e Opera e dopo questa unione e aver ottenuto quindi dei risultati, nel collegamento con Autore si dovrà avere autore = id.