<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://wiki.dsy.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SingInTime</id>
	<title>WikiDsy - Contributi utente [it]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dsy.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SingInTime"/>
	<link rel="alternate" type="text/html" href="https://wiki.dsy.it/w/Speciale:Contributi/SingInTime"/>
	<updated>2026-05-03T00:36:49Z</updated>
	<subtitle>Contributi utente</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Economia_dei_Beni_Musicali/Appunti/2007-2008/Storia_dell_Economia_Musicale&amp;diff=18492</id>
		<title>Economia dei Beni Musicali/Appunti/2007-2008/Storia dell Economia Musicale</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Economia_dei_Beni_Musicali/Appunti/2007-2008/Storia_dell_Economia_Musicale&amp;diff=18492"/>
		<updated>2008-01-27T11:51:14Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Nascita dell'industria musicale =&lt;br /&gt;
&lt;br /&gt;
== Stampa della musica ==&lt;br /&gt;
&lt;br /&gt;
Tecnologicamente più arretrata rispetto al corrispettivo testuale. Esordi nel '500 quando '''Petrucci''' inventa il primo sistema efficace per la stampa a caratteri mobili della musica e delle intavolature.&lt;br /&gt;
&lt;br /&gt;
''''700-'800''': Nascita della '''litografia''', che consente la possibilità di stampare in grossa tiratura. La stampa della musica continua ad essere effettuata tramite lastre incise fino agli anni '80!&lt;br /&gt;
&lt;br /&gt;
Assieme alla litografia nasce il concetto di '''diritto d'autore'''. La somma di questi due fattori renderà possibile la definizione di ciò che diventerà l''''industria editoriale'''.&lt;br /&gt;
&lt;br /&gt;
== Il diritto d'autore ==&lt;br /&gt;
&lt;br /&gt;
'''1791-1792''': Durante la Rivoluzione Francese viene promulgata una legge sulla proprietà intellettuale. Data la continuità ideologica con la rivoluzione per l'indipendenza in America (1796) il concetto di copyright entra addirittura nella costituzione USA.&lt;br /&gt;
&lt;br /&gt;
In Italia la SIAE non ha sempre svolto il ruolo di &amp;quot;garante&amp;quot; del copyright, ne verrà investita come conseguenza della legge 633 sul diritto d'autore, promulgata il 22 Aprile del 1941.&lt;br /&gt;
&lt;br /&gt;
L'affermazione del copyright consente agli autori di opere dell'ingegno, fra cui gli autori di opere musicali, di uscire dalla logica del '''mecenatismo'''. Grazie alla propria indipendenza economica l'autore può esprimere liberamente la sua opinione, e non è più obbligato a sottostare alle commissioni di un protettore.&lt;br /&gt;
&lt;br /&gt;
== L'editoria musicale ==&lt;br /&gt;
&lt;br /&gt;
All'epoca di '''Beethoven''' la nobiltà non era ancora del tutto decaduta, la figura del musicista è in una fase di transizione, da protetto a libero professionista. Lo stesso Beethoven verso il culmine della sua carriera organizzava e interpretava lui stesso i concerti nei quali presentava le sue opere. Quando non poteva più fare incassi coi biglietti, cedeva ad un '''editore''' le partiture da stampare e incassava una percentuale sulle copie vendute.&lt;br /&gt;
&lt;br /&gt;
E' così che nascono le prime '''royalties''', inizialmente frutto di un '''rapporto diretto''' fra musicista ed editore-tipografo. Altri business editoriali che prendono il via quasi immediatamente sono il '''noleggio delle parti''' e la vendita di partiture per '''musica da camera''' (reservata).&lt;br /&gt;
&lt;br /&gt;
Quest'ultimo campo si rivela particolarmente redditizio poiché si rivolge a un pubblico piuttosto ampio: nei salotti borghesi è diffusissimo il '''pianoforte''', e fino alla fine dell'800 l'unico modo per produrre ed ascoltare musica in casa è semplicemente suonarla.&lt;br /&gt;
&lt;br /&gt;
I compositori, più che con le grandi opere, cominciano a guadagnarsi da vivere col mercato dei '''dilettanti''', di livello più o meno alto. Vengono venduti anche i '''testi''' delle canzoni in stampa (generalmente a prezzo irrisorio) soprattutto nell'ambito di fiere e sagre paesane: sono i cosiddetti '''broadsights'''.&lt;br /&gt;
&lt;br /&gt;
= Gli albori della popular music =&lt;br /&gt;
&lt;br /&gt;
== Foster e il minstrel show ==&lt;br /&gt;
&lt;br /&gt;
Uno dei primi autori noti di broadsights è '''Stephen Foster'''. Scrive canzoni per una forma di intrattenimento che si diffonde tra i '30 e i '40 dell'800: il '''minstrel show''', una sorta di mix tra varietà e Commedia dell'Arte (personaggi fortemente caratterizzati + attrazioni).&lt;br /&gt;
&lt;br /&gt;
'''Personaggi''': Mr. Interlocutor (presentatore), Mr. Bones (con le nacchere) e Mr. Tambo (col tamburello). Erano bianchi travestiti da neri che scimmiottavano determinati caratteri, sia musicali che comportamentali, attribuiti agli afroamericani. All'epoca spettacoli fortemente razzisti come il minstrel show non erano considerati socialmente riprovevoli dal momento che il razzismo diventa &amp;quot;tabù&amp;quot; solo dopo la 2° Guerra Mondiale.&lt;br /&gt;
&lt;br /&gt;
Foster introduce una novità nel minstrel show: nei testi delle sue canzoni rovescia il tipico carattere razzista, mettendo invece in risalto i buoni sentimenti e la rispettabilità dei neri americani. Le chiama '''etiopian songs'''.&lt;br /&gt;
&lt;br /&gt;
Ai tempi di Foster comincia a farsi strada la struttura-canzone di tipo '''chorus-chorus-bridge''', derivata dalla tradizione liederistica tedesca, a sua volta elaborazione dell'aria d'opera e che si rivela particolarmente adatta all'ambito dilettantistico.&lt;br /&gt;
&lt;br /&gt;
Stephen Foster è il primo a stipulare dei contratti con gli editori su canzoni che '''scriverà in futuro''' in cambio di un compenso anticipato. Morirà comunque povero: dopo la Guerra di Secessione, con la vittoria dei Nordisti e l'abolizione della schiavitù, le tematiche delle sue canzoni perdono di fascino sopraffatte dal corso della Storia.&lt;br /&gt;
&lt;br /&gt;
== La canzone napoletana ==&lt;br /&gt;
&lt;br /&gt;
In Italia l'editoria musicale è già presente quando si compie l'unità nazionale, soprattutto a Milano (dove opera Ricordi) e a Napoli. Si vendono stampe soprattutto operistiche (in linea con la produzione musicale del momento) e cameristiche. Si stampano anche '''copielle''' (l'equivalente napoletano dei broadsights) distribuite alle feste o ai concorsi della canzone, incoraggiati dai Borboni secondo una politica di governo populista &amp;quot;panem et circenses&amp;quot;. Il più importante è il concorso della canzone di '''Piedigrotta''', che funge da trampolino di lancio per la celeberrima '''Te vojo bene assaje'''.&lt;br /&gt;
&lt;br /&gt;
La forma-canzone italiana è diversa dal chorus-chorus-bridge americano, segue invece il pattern '''strofa-ritornello, strofa-ritornello'''. La melodia che caratterizza maggiormente il brano non viene dunque presentata subito, bensì viene introdotta da una strofa che ne alimenta l'attesa. La struttura canzone è un elemento molto importante poiché influisce sensibilmente sulla '''commerciabilità''' della musica.&lt;br /&gt;
&lt;br /&gt;
Come negli Stati Uniti ai tempi della Guerra di Secessione, la produzione musicale italiana subisce un arresto con l'avvento dell'unità nazionale. La canzone napoletana tuttavia si riprenderà qualche tempo dopo con '''funiculì funiculà''', primo esempio di &amp;quot;jingle promozionale&amp;quot; composto in occasione dell'apertura di una funicolare sul Vesuvio. Venderà un milione di copielle! Primo grande successo popolare che spingerà altri autori a entrare in questo mercato.&lt;br /&gt;
&lt;br /&gt;
Vale la pena ricordare che in questo periodo la popular music non ha ancora una tradizione autonoma, e gli autori sono professionisti in altri ambiti: giornalisti, poeti, compositori classici... col tempo si affermeranno invece parolieri e musicisti '''specializzati in canzoni''', che vedranno in questi primi autori i loro maestri e si distaccheranno dalla tradizione precedente.&lt;br /&gt;
&lt;br /&gt;
== Tin Pan Alley ==&lt;br /&gt;
&lt;br /&gt;
Dopo la crisi sopra citata, anche l'America si riprende poco prima del '900 (la canzone-simbolo di questa ripresa è '''After the Ball'''). Si concentra un polo editoriale a New York, per la precisione a Broadway. Non è un caso che quel quartiere sia la sede di molti teatri: questi svolgono un'attività promozionale importantissima poiché all'epoca rappresentano il principale punto di contatto tra pubblico e canzoni. Se una canzone ha successo a teatro, viene conosciuta e conseguentemente comprata.&lt;br /&gt;
&lt;br /&gt;
Il termine '''Tin Pan Alley''', &amp;quot;viale delle padelle di stagno&amp;quot;, si riferisce al suono &amp;quot;sferragliante&amp;quot; dei pianoforti (spesso scordati e di poco valore) usati dai cosiddetti '''song plugger'''. Gli editori si servivano di questi personaggi per far ascoltare ai clienti le canzoni in loro possesso, e per convincere gli impresari delle compagnie teatrali all'acquisto.&lt;br /&gt;
&lt;br /&gt;
Ancora oggi Tin Pan Alley indica per metonimia tutta l'industria editoriale americana attorno al '900, nonché un certo modo di fare canzoni.&lt;br /&gt;
&lt;br /&gt;
= La rivoluzione fonomeccanica =&lt;br /&gt;
&lt;br /&gt;
== Le origini ==&lt;br /&gt;
&lt;br /&gt;
Il primo strumento veramente diffuso per la riproduzione meccanica della musica è il '''pianoforte a rulli''' (player piano). E' a tutti gli effetti un pianoforte, suonabile anche dal vivo, ma che possiede un meccanismo a rulli perforati che lo azionano meccanicamente. Le perforazioni potevano essere effettuate a mano o tramite speciali pianoforti registratori. Il fonografo all'epoca è ancora primitivo, e il piano a rulli rappresenta un concorrente imbattibile a causa dell'alta fedeltà d'ascolto: il suono è proprio quello del pianoforte!&lt;br /&gt;
&lt;br /&gt;
Si deve a '''Edison''' l'invenzione del '''fonografo'''. L'apparecchio è costituito da un imbuto al quale è fissata una puntina, che incide la superficie di un cilindro rotante ricoperto di cera. Inizialmente è concepito per facilitare dettati e trascrizioni, poco adatto alla musica a causa del breve tempo di registrazione (max 3 minuti x supporto) e della larghezza di banda infima (ca. 1 kHz). L'invenzione viene man mano migliorata per renderne possibile l'uso in ambiti musicali.&lt;br /&gt;
&lt;br /&gt;
I pesanti limiti del mezzo influenzano il repertorio: se prima la durata della musica da ballo si basava sulla resistenza fisica dei ballerini, o le arie delle opere su quella dei cantanti, la musica da registrare si deve adattare al mezzo di registrazione (2-3 minuti di play). Anche gli strumenti da registrare vengono scelti in funzione del fonografo: il clarinetto rende bene e acquista inportanza mentre ottavini e contrabbassi spariscono negli ensemble usati per registrare. Anche le arie da tenore sono ottime per il fonografo, la durata è giusta e il range frequenziale pure.&lt;br /&gt;
&lt;br /&gt;
Nonostante alcune utilizzazioni &amp;quot;serie&amp;quot; il fonografo rimane più una sorta di divertissement tecnologico che un vero e proprio strumento per la (ri)produzione di musica. Una parte consistente del repertorio su cilindri è composto infatti da canzoni comiche, o da curiose esecuzioni di fischiatori. Il vero problema che ne impedì la diffusione era l'impossibilità di '''duplicare''' i cilindri. Per registrare un numero di cilindri sufficiente a soddisfare le esigenze di mercato, i musicisti dovevano rieseguire svariate volte i brani da registrare di fronte a una batteria di fonografi.&lt;br /&gt;
&lt;br /&gt;
== Il grammofono ==&lt;br /&gt;
&lt;br /&gt;
Ad ovviare a questo problema ci pensa il '''grammofono''' di '''Emile Berliner'''. Egli concepisce un supporto piatto e un'incisione a spirale, con oscillazione trasversale e non più verticale. La registrazione viene effettuata su una lacca, che viene successivamente sottoposta a un bagno galvanico. La lastra metallica così ottenuta viene copiata in negativo e utilizzata per stampare i dischi. I primi dischi sono fatti di '''gommalacca''', che ha qualità meccaniche inferiori rispetto al vinile ma ha i grossi pregi di essere reperibile in natura e soffrire meno il caldo. Questi due aspetti rendono possibile una produzione discreta di dischi anche nei paesi in via di sviluppo.&lt;br /&gt;
&lt;br /&gt;
Berliner pensa sin dal principio a un supporto adatto alla musica, massicciamente riproducibile, e concepisce l'idea del pagamento dei musicisti in base alle vendite dei dischi. All'inizio la concorrenza tra fonografo e grammofono è spietata, poi Edison capisce che non può vincere lo scontro tecnologico e si mette d'accordo con Berliner per sviluppare e produrre assieme il nuovo apparecchio. Nasce la '''Berliner Gramophone Company'''.&lt;br /&gt;
&lt;br /&gt;
== Altre innovazioni ==&lt;br /&gt;
&lt;br /&gt;
Con il '''Copyright Act''' statunitense del 1909 nasce il concetto di '''diritto connesso''', che consente ai discografici di poter limitare l'utilizzo non autorizzato delle proprie registrazioni. L'aggettivo &amp;quot;connesso&amp;quot; sottolinea la subalternità dell'industria discografica dell'epoca rispetto a quella dell'editoria su carta.&lt;br /&gt;
&lt;br /&gt;
Un'invenzione di stampo bellico, poi, consente un miglioramento sostanziale delle registrazioni: è la '''valvola termoionica''', primo componente atto all'amplificazione di un segnale elettrico. I vecchi trasduttori meccanici cominciano ad essere soppiantati da quelli elettrici (microfoni) per consentire l'amplificazione del segnale registrato. Il notevole salto di qualità fa impennare il mercato discografico negli anni '20, nonostante già nel decennio precedente fossero in giro milioni di copie.&lt;br /&gt;
&lt;br /&gt;
Anche gli editori guadagnano dalo sviluppo delle nuove tecnologie: i discografici registrano del materiale musicale in mano agli editori, che sono titolari del copyright e che di conseguenza incassano royalties sulle vendite dei dischi. Gli stessi editori cercano di alimentare il fenomeno delle '''cover''', ovvero le registrazioni da parte di più discografici (e interpreti) di una stessa canzone. Ogni singola registrazione produce un flusso di diritti, dunque il guadagno dell'editore risulta moltiplicato.&lt;br /&gt;
&lt;br /&gt;
= Commedia musicale e Cabaret =&lt;br /&gt;
&lt;br /&gt;
== La Musical Comedy ==&lt;br /&gt;
&lt;br /&gt;
Con l'andare avanti del varietà si capisce che per costruire spettacoli più efficaci ci vuole un po' di '''struttura''', di coerenza interna tra i vari numeri, ricalcando alla lontana il concetto che sta alla base dell'opera e dell'operetta. Gli autori cominciano a scrivere '''serie di canzoni''' collegate da un filo logico, da inserire tutte come colonna sonora di uno stesso spettacolo. Nasce la '''Musical Comedy''' (1924).&lt;br /&gt;
&lt;br /&gt;
Autori principali: '''Gershwin''' e '''Cole Porter'''&lt;br /&gt;
&lt;br /&gt;
Molte canzoni scritte per le musical comedies sono entrate a far parte dei cosiddetti '''standard'''. Gli standard rappresentano il repertorio &amp;quot;classico&amp;quot; della musica popular americana, un retroterra culturale comune che è anche diventato la &amp;quot;lingua franca&amp;quot; dei jazzisti nelle loro jam session. Struttura tipica: '''verse + chorus + chorus + bridge + chorus'''&lt;br /&gt;
&lt;br /&gt;
Il tema principale della produzione di Tin Pan Alley è la vita della buona società americana, coi suoi lati positivi e negativi. Questa tendenza viene ereditata dal '''society verse''': una forma di poesia borghese, anche piuttosto raffinata, la cui funzione potrebbe oggi corrispondere all'articolo di gossip. Erano così diffuse che finivano sui quotidiani! Canzone simbolo del periodo: '''I Get A Kick Out Of You'''.&lt;br /&gt;
&lt;br /&gt;
== Cabaret e Kabarett ==&lt;br /&gt;
&lt;br /&gt;
La formula del '''café chantant''' e del '''cabaret''' si sviluppa parallelamente in Francia, e viene emulata e riproposta in Germania ('''kabarett''').&lt;br /&gt;
&lt;br /&gt;
La caratteristica saliente di questa forma di intrattenimento è l''''impegno''' dei testi, spesso di critica sociale, scritti quasi sempre da poeti di professione. Protagonisti della vita del kabarett tedesco sono autori del calibro di '''Thomas Mann''', e l'influenza di questo tipo di spettacoli si farà sentire anche nel teatro più popolare di '''Brecht'''.&lt;br /&gt;
&lt;br /&gt;
Il cabaret avrà vita breve, continuamente osteggiato dai detentori del potere politico e infine cancellato dal '''nazismo''' pochi anni dopo la sua nascita. Si riprenderà comunque dopo la guerra e diventerà la principale fonte di ispirazione per molti poeti, cantanti e cantautori, primo fra tutti Bob Dylan.&lt;br /&gt;
&lt;br /&gt;
= La musica nel cinema =&lt;br /&gt;
&lt;br /&gt;
== Nascita del film sonoro ==&lt;br /&gt;
&lt;br /&gt;
Il primo sonoro abbinato al film serviva per coprire il rumore del proiettore: un pianista in sala suonava durante la proiezione del film. Negli anni '20 si comincia a sonorizzare con più criterio. Nasce la tecnologia '''vitaphone''', che consiste nella sincronizzazione tra la pellicola cinematografica e un supporto audio separato (per la precisione un grosso disco). Basta un piccolo taglio nella pellicola, magari dovuto all'usura, e i de media finiscono inevitabilmente fuori sincrono. Il film sonoro diventerà praticamente realizzabile solo con l'avvento della tecnologia '''phonofilm''', che impressiona l'informazione audio sulla stessa pellicola del video.&lt;br /&gt;
&lt;br /&gt;
Per le sonorizzazioni del cinema muto si era soliti improvvisare, con l'aiuto di '''song libraries''' che contenevano alcune canzoni atte a rappresentare le diverse situazioni suggerite dalla pellicola.&lt;br /&gt;
&lt;br /&gt;
== Le colonne sonore ==&lt;br /&gt;
&lt;br /&gt;
Le prime colonne sonore nei film suonano molto europee e sinfoniche anche in America, poiché i loro principali compositori provengono da quella tradizione. Inoltre il genere viene pesantemente influenzato dai '''poemi sinfonici''', dalla tradizione '''operistica''', e più in generale da tutta la musica classica '''a programma''', che già prima dell'avvento del grande schermo avevano affrontato la rappresentazione in musica di '''narrazioni''' e '''stati d'animo'''. La ragione storica della nascita delle musiche a programma è la difficoltà di riproporre in maniera originale la forma sonata e la sinfonia classica dopo l'immensa (qualitativamente e quantitativamente) produzione di Haydn, Mozart e Beethoven.&lt;br /&gt;
&lt;br /&gt;
'''Max Steiner''': Uno dei principali autori di colonne sonore degli anni '30-'40, fra cui quella di ''Via col Vento''. Lavora negli USA me è europeo ed ebreo.&lt;br /&gt;
&lt;br /&gt;
L'autore di musica da film di solito lavora a contratto, sceneggiatura per sceneggiatura, e deve essere abbastanza '''rapido''' da riuscire a completare la colonna sonora prima della fine della sceneggiatura. Si affermano dei '''cliché''' musicali, associati a determinate situazioni: arpeggi ondulatori per &amp;quot;commentare&amp;quot; una tempesta, musica &amp;quot;angolare&amp;quot; per rappresentare il cattivo... Tutte queste figure si aggiungono alle già esistenti song libraries e come queste vengono raccolte in manuali.&lt;br /&gt;
&lt;br /&gt;
I poemi sinfonici alle volte vengono usati anche '''direttamente''' nei film sonori: il caso più famoso è quello di '''2001: Odissea nello spazio''' nel quale è presente '''Also Sprach Zarathustra''' di '''Richard Strauss'''.&lt;br /&gt;
&lt;br /&gt;
== Evoluzione del linguaggio musicale nel cinema ==&lt;br /&gt;
&lt;br /&gt;
Con l'arrivo degli anni '50 viene sdoganato anche il jazz all'interno del cinema, sia nei film che raccontano storie di jazz che in altri contesti. Prima era difficile che accadesse a causa della natura stessa delle colonne sonore (qualcosa di molto calcolato e preciso al millisecondo, che mal si presta all'improvvisazione jazzistica) ma soprattutto a causa di un razzismo più o meno latente che fino ad allora aveva escluso i neri da qualsiasi step della produzione cinematografica.&lt;br /&gt;
&lt;br /&gt;
Comincia anche ad apparire '''musica diegetica''', ovvero percepita e ascoltata anche dai personaggi nel film, presente nella storia e non solo di contorno.&lt;br /&gt;
&lt;br /&gt;
Con l'ingresso della popular music nel cinema viene scardinata l'orchestra sinfonica classica, che sempre più spesso lascia il posto ad altre formazioni o (più avanti negli anni) ai sintetizzatori. L'avvento dell'elettronica è un colpo mortale per l'industria musicale hollywoodiana, poiché grazie all'ausilio delle nuove apparecchiature il compositore può portare a termine da solo un lavoro che prima richiedeva l'ausilio di molte figure professionali.&lt;br /&gt;
&lt;br /&gt;
= La musica del dopoguerra in America =&lt;br /&gt;
&lt;br /&gt;
== Il jazz ==&lt;br /&gt;
&lt;br /&gt;
Alla fine dell'800 gli americani scoprono le musiche da ballo '''sincopate'''. Alla velata sensualità del walzer (da poco approdato nel nuovo continente) si aggiungono le danze di origine afroamericana, all'epoca considerate decisamente provocatorie.&lt;br /&gt;
&lt;br /&gt;
'''Cakewalk''': &amp;quot;camminata della torta&amp;quot;, scimmiottamento della rigidità delle danze bianche da parte dei neri. E' una danza a premio, piace molto e porta musicisti neri nelle orchestre.&lt;br /&gt;
&lt;br /&gt;
'''Jazz''': Vocabolo tratto da &amp;quot;Original Dixieland Jaza Band&amp;quot;, gruppo proveniente da New Orleans, nero, autoironico. La proposta musicale del gruppo non è molto diversa dal cakewalk e dal ragtime, ma l'innovazione consiste nella maggiore importanza che viene data alla componente estemporanea rispetto alla parte scritta. La partitura passa in secondo piano rispetto al disco o all'organico che suona dal vivo, l'editoria comincia a perdere terreno a favore della discografia.&lt;br /&gt;
&lt;br /&gt;
== Il blues e i Race Records ==&lt;br /&gt;
&lt;br /&gt;
I primi blues famosi non seguono la struttura canonica a 12 battute, che verrà formalizzata in un secondo momento. I dischi aiutano pian piano a consolidare il turn-around classico (I-I-I-I-IV-IV-I-I-V-IV-I-V). Il blues è concepito per un pubblico nero e così lo sono i dischi.&lt;br /&gt;
&lt;br /&gt;
Il discografico '''Ralph Peer''' se ne accorge e crea una collana apposita, i '''race records'''. Il termine ha una sottile ambiguità: dischi &amp;quot;di razza&amp;quot; (dunque di prima scelta) ma anche &amp;quot;per una razza&amp;quot; (i neri). Ricordiamo ancora una volta che all'epoca il concetto di razza è ancora legittimato da dimostrazioni pseudoscientifiche e non si è ancora manifestato nella sua forma più virulenta con l'Olocausto, quindi non è ancora tabù.&lt;br /&gt;
&lt;br /&gt;
La produzione dei race records ha successo, inaspettatamente anche tra il pubblico bianco. Con la diffusione discografica questo repertorio prevalentemente rurale entra anche nelle città, nasce il '''city blues'''. Il blues delle origini era suonato per lo più da musicisti improvvisati, poveracci, che spesso venivano imbrogliati da discografici locali senza scrupoli. Venivano pagati pochi dollari per la registrazione e non vedevano l'ombra di una royalty. Molti bluesmen non avevano neppure una chitarra e usavano strumenti autocostruiti, intonati con le fiale del tabacco da fiuto (nasce così la tecnica dello slide!).&lt;br /&gt;
&lt;br /&gt;
'''Billie Holiday''' --&amp;gt; massima esponente del city blues&lt;br /&gt;
&lt;br /&gt;
'''Robert Johnson''' --&amp;gt; massimo esponente del country blues&lt;br /&gt;
&lt;br /&gt;
Con la nascita della '''Library Of Congress''' di Washington, i bluesmen di campagna prima sfruttati fino al midollo cominciano ad essere registrati a condizioni più eque da parte di alcuni '''etnomusicologi''' (uno su tutti Alan Lomax), che vedono in questo repertorio un'enorme fonte di informazioni sulla cultura rurale americana.&lt;br /&gt;
&lt;br /&gt;
Caratteristica tipica del country blues è una dialettica molto drammatizzata tra voce e strumento (Muddy Waters è un maestro nel &amp;quot;chiacchierare&amp;quot; con la sua chitarra). Spesso il cantante e il musicista coincidono, e ciò favorisce una struttura molto libera dei brani in quanto non c'è bisogno di sincronizzazione fra più elementi. Dopo la Seconda Guerra Mondiale invece arriverà la contaminazione tra country blues e musica da ballo bianca: cominceranno ad apparire delle formazioni di più musicisti e l'uso della chitarra elettrica.&lt;br /&gt;
&lt;br /&gt;
== L'hillbilly ==&lt;br /&gt;
&lt;br /&gt;
Lo stesso Ralph Peer che inventa i race records decide di investire su un'altra realtà folk presente negli Stati Uniti, questa volta appartenente al mondo bianco. Scopre infatti un gruppo di boscaioli dei monti Appalachi che suonano strumenti sia della tradizione occidentale (chitarra, fiddle, contrabbasso), sia di quella afroamericana (come il banjo).&lt;br /&gt;
&lt;br /&gt;
Quando il discografico chiede il nome del gruppo i musicisti rispondono: &amp;quot;We're just a bunch of hillbillies!&amp;quot; (siamo solo un branco di campagnoli!). Il gruppo da allora si chiamerà '''The Hillbillies''' e darà il nome anche al relativo genere musicale, successivamente ribattezzato da '''Jimmy Rodgers''' in '''country &amp;amp; western'''. Rodgers eliminerà anche l'etichetta &amp;quot;race records&amp;quot;, divenuta ormai scomoda, rimpiazzandola con il termine &amp;quot;rhythm &amp;amp; blues&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Woody Guthrie ==&lt;br /&gt;
&lt;br /&gt;
Sempre attorno agli anni '30-'40 esordisce '''Woody Guthrie''', moderno cantastorie che racconta gli anni della crisi appena trascorsi con occhio molto critico. E' un personaggio molto interessante perché lavora soprattutto nelle neonate '''trasmissioni radiofoniche''', poi viene scoperto da Alan Lomax ed entra anche lui nel mercato discografico. Una tematica ricorrente nelle canzoni di Guthrie è l'inno alle gesta di fuorilegge alla &amp;quot;Robin Hood&amp;quot;, che delinquono in nome della giustizia sociale. Sulla sua chitarra campeggiava fiera la scritta: &amp;quot;this machine kills fascists&amp;quot; (questa macchina ammazza i fascisti).&lt;br /&gt;
&lt;br /&gt;
== La fine di Tin Pan Alley ==&lt;br /&gt;
&lt;br /&gt;
Riepilogando, blues e hillbilly sono generi inizialmente di nicchia, che negli anni '30 vengono portati alla ribalta da alcuni discografici lungimiranti, più o meno onesti. Sarà però la diffusione della '''radio''' a portare davvero alla ribalta questa nuova musica e a segnare la fine dell'industria di Tin Pan Alley.&lt;br /&gt;
&lt;br /&gt;
Quando l'invenzione di '''Guglielmo Marconi''' comincia a diffondersi negli USA il Copyright Act del 1909 è già efficace riguardo allo sfruttamento della nuova tecnologia. L'atto prevede però l'esenzione dal pagamento di diritti nel caso di trasmissione senza profitto. All'inizio le radio trasmettono gratis, ma quasi subito aggiungono anche la pubblicità. Nasce il business delle royalties anche in ambito radiofonico.&lt;br /&gt;
&lt;br /&gt;
La società di collettazione americana (ASCAP) impone licenze sempre più alte fino a diventare insostenibili per le radio. Conseguenza: nascita di un'altra società di collettazione, la '''BMI''', sotto la spinta delle emittenti radiofoniche. A questa associazione aderiscono editori e discografici minori, indipendenti dal mondo di Tin Pan Alley, la cui produzione è principalmente blues e hillbilly.&lt;br /&gt;
&lt;br /&gt;
Questi generi saranno gli unici trasmessi alla radio per più di un anno, grazie alle licenze più eque concesse dalla BMI. Quando l'ASCAP decide di ridurre le tariffe ormai il nuovo gusto del pubblico è forgiato e l'industria di Tin Pan Alley completamente scavalcata.&lt;br /&gt;
&lt;br /&gt;
= L'evoluzione tecnologica del dopoguerra =&lt;br /&gt;
&lt;br /&gt;
== Il registratore a nastro ==&lt;br /&gt;
&lt;br /&gt;
Introdotto negli anni '30 in Germania ('''Magnetophon'''), frutto dei &amp;quot;progressi della chimica tedesca&amp;quot; durante il 3° Reich. Innovativo rispetto ad altre tecnologie dell'epoca come ad esempio il registratore a '''filo metallico''', che non consentiva tagli e montaggi e che era estremamente pericoloso (anche letale!) in caso di rottura del velocissimo e tesissimo filo usato come supporto per la registrazione.&lt;br /&gt;
&lt;br /&gt;
Il registratore a nastro fu inizialmente usato in ambito radiofonico, e durante la 2° Guerra Mondiale fu patrimonio esclusivo tedesco a uso propagandistico. Le possibilità di taglio e montaggio del Magnetophon venivano messe al servizio dei discorsi del Fuhrer, che in questo modo acquisivano maggiore incisività. Con la fine della guerra gli Alleati se ne appropriano e tramite tecniche di '''reverse engineering''' riescono a costruirne delle copie.&lt;br /&gt;
&lt;br /&gt;
Negli anni '50 il registratore a nastro entra negli studi di produzione musicale, segnando un significativo '''cambio d'approccio''' alla registrazione stessa. Prima si utilizzavano degli ingombranti e scomodi '''grammofoni incisori''', il cui peggior difetto era quello di essere assolutamente '''intolleranti agli errori'''. La matrice doveva essere obbligatoriamente registrata tutta in un take, e in caso di errori non poteva essere riutilizzata. Il nastro magnetico, invece, può essere '''cancellato''' o addiritura '''sovrainciso'''.&lt;br /&gt;
&lt;br /&gt;
== Bounce, bounce! ==&lt;br /&gt;
&lt;br /&gt;
Anche il cinema va incontro alla stessa rivoluzione magnetica, mentre in ambito musicale si diffonde sempre di più la pratica del '''bouncing''', ovvero il riversamento ripetuto da un nastro a un altro utilizzando due registratori collegati fra loro. Mixando nuovo materiale ad ogni &amp;quot;rimbalzo&amp;quot; si possono ottenere sovraincisioni multiple. Pionieri del bouncing: '''Les Paul''' e '''Mary Fox'''.&lt;br /&gt;
&lt;br /&gt;
Più in generale si apre una possibilità enorme di '''manipolazione''' del suono. Col passare del tempo i registratori diventano '''multipista''' (max 4 fino a tutti gli anni '60). Le registrazioni manipolate in questo modo assumono connotazioni alle volte innaturali (eccessiva perfezione, cantanti che doppiano le loro stesse voci ecc.) e l'estetica dell'ascolto su disco si differenzia definitivamente da quella dell'ascolto dal vivo, diventando alle volte il termine di paragone per valutare quest'ultima.&lt;br /&gt;
&lt;br /&gt;
La maggiore economicità della tecnologia porta alla nascita di svariati studi ed etichette indipendenti. Nasce inoltre il concetto di '''album''', la cui realizzazione viene resa possibile dalla tecnica del montaggio su nastro unita alla diffusione del '''microsolco''' su vinilite, che sostituisce i vecchi supporti in gommalacca a 78 giri.&lt;br /&gt;
&lt;br /&gt;
== LP e singoli ==&lt;br /&gt;
&lt;br /&gt;
L'introduzione del microsolco risale al 1948, e viene adottato in due formati diversi: la '''Columbia''' produce un disco di grosse dimensioni e che gira lento (33 giri e 1/3), pensato per il mercato della classica; al contrario la '''RCA''' produce un disco di piccolo formato e che gira più veloce (45 giri) adatto a contenere singole canzoni di ambito &amp;quot;popular&amp;quot;. La RCA scarta l'opzione album e sviluppa un sistema cambiadischi. Il foro più largo del 45 giri rispetto a quello del 33 giri serve appunto a facilitare lo scorrere dei dischi sul perno del cambiadischi.&lt;br /&gt;
&lt;br /&gt;
I due supporti sono entrambi sotto brevetto dei rispettivi ideatori, e inizia una '''guerra dei formati''' (non sarà la prima né l'ultima) tra i due colossi discografici. Non ci saranno né vincitori né vinti, e alla fine Columbia ed RCA si scambieranno i brevetti per poter raggiungere tutti i possibili mercati.&lt;br /&gt;
&lt;br /&gt;
Il 45 giri, leggero, maneggevole e resistente, è indispensabile almeno quanto la radio al successo del '''rock 'n roll'''. Un discografico indipendente ne poteva portare molti in una comune automobile e rifornire da solo i suoi rivenditori. L'utilizzo del 33 giri in ambito popular come '''album''' di canzoni inizia invece in Francia, per raccogliere in un unico supporto interi recital di autori di cabaret. Sulle copertine si trovavano note giornalistiche e di commento al posto dei testi delle canzoni.&lt;br /&gt;
&lt;br /&gt;
= Il rock 'n roll =&lt;br /&gt;
&lt;br /&gt;
== Motivazioni ==&lt;br /&gt;
&lt;br /&gt;
* Ci sono più giovani&lt;br /&gt;
* Questi giovani hanno poche spese oltre la musica&lt;br /&gt;
* Il reddito medio delle famiglie aumenta&lt;br /&gt;
* Sempre più studenti proseguono i loro studi, con conseguente aggregazione sociale e formazione di un '''gruppo sociale''' &amp;quot;dei giovani&amp;quot;&lt;br /&gt;
* Contaminazione degli ascolti e delle idee a causa di migrazioni e della fine della segregazione razziale&lt;br /&gt;
* Fine del predominio di Tin Pan Alley&lt;br /&gt;
* ecc...&lt;br /&gt;
&lt;br /&gt;
== Precursori del rock 'n roll ==&lt;br /&gt;
&lt;br /&gt;
* Hillbilly&lt;br /&gt;
* Jump bands e boogie&lt;br /&gt;
* Gospel e doo-wop&lt;br /&gt;
* R 'n b soprattutto di New Orleans&lt;br /&gt;
* Repertorio di Tin Pan Alley&lt;br /&gt;
&lt;br /&gt;
Il primo rock 'n roll è in realtà un altro modo di chiamare il rhythm 'n blues. Il termine viene diffuso da '''Alan Freed''', disc jockey radiofonico, per sdoganare la musica nera agli occhi del pubblico bianco. Una delle critiche che venivano mosse all'ex &amp;quot;race&amp;quot; music era quella di essere troppo provocatoria ed esplicita... Sembra quasi un paradosso che un termine come &amp;quot;rock 'n roll&amp;quot;, dall'evidente allusione sessuale, abbia avuto successo proprio tra quel pubblico che considerava troppo libertino il rhythm 'n blues!&lt;br /&gt;
&lt;br /&gt;
== Gli anni d'oro ==&lt;br /&gt;
&lt;br /&gt;
Il primo successo &amp;quot;bianco&amp;quot; del rock è '''Rock Around the Clock''' di '''Bill Haley''', parte della colonna sonora del film '''Il seme della violenza'''. Quando arriva '''Elvis Presley''', però, spetta a lui lo scettro di &amp;quot;re del rock&amp;quot;. Bianco, dall'aspetto rassicurante e con un buon curriculum scolastico da &amp;quot;bravo ragazzo&amp;quot;, si fa subito notare per la sua eccezionale presenza scenica ed '''interazione''' col microfono.&lt;br /&gt;
&lt;br /&gt;
L'amplificazione della voce permette infatti ai cantanti di abbandonare l'ipostazione classica (necessaria per bucare il &amp;quot;muro sonoro&amp;quot; di un'orchestra) ed utilizzare il proprio strumento in maniera più naturale. Si sviluppa in America il fenomeno dei '''crooners''' (il più noto è '''Frank Sinatra'''), cantanti che riescono ad esprimere la loro qualità vocale con il loro timbro &amp;quot;di tutti i giorni&amp;quot;, rendendo possibile l'uso di strumenti espressivi come il sussurro, il rumore del respiro ecc. Elvis impara molto dai crooners e la sua voce piace proprio per il suo suono familiare ed &amp;quot;autentico&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Alternative al rock 'n roll ==&lt;br /&gt;
&lt;br /&gt;
Elvis Presley è l'unico rocker ad essere scritturato da una major, e solo a carriera ormai avanzata. Il rock 'n roll rimarrà a lungo patrimonio delle etichette indipendenti e assume un ruolo &amp;quot;anticommerciale&amp;quot; (ma non per questo estraneo alla commerciabilità) e di contrapposizione alla censura e ai benpensanti. Il rock delle major viene percepito come &amp;quot;falso&amp;quot; e inquadrato.&lt;br /&gt;
&lt;br /&gt;
Per combattere il fenomeno del rock le grandi case discografiche cercano nuovi prodotti che facciano concorrenza nella nuova fascia di mercato &amp;quot;giovane&amp;quot;. Si tratta di artisti prevalentemente di origini italiane, dal viso acqua e sapone e dalla proposta musicale estremamente spensierata come '''Connie Francis''' o '''Paul Anka'''. Con questa sorta di pop leggero si è soliti dire che l'industria discografica americana ha &amp;quot;pestato la coda di una tigre&amp;quot;, poiché proprio questo repertorio getterà le basi per la nascita dei cantautori più impegnati e scomodi al potere, fra cui '''Bob Dylan'''.&lt;br /&gt;
&lt;br /&gt;
= La diffusione dell'alta fedeltà =&lt;br /&gt;
&lt;br /&gt;
== La stereofonia ==&lt;br /&gt;
&lt;br /&gt;
Inizialmente brevetto '''DECCA'''. La tecnologia si basava su un solco a V dove ciascuna &amp;quot;parete&amp;quot; del solco portava un segnale diverso. Per leggerlo era necessaria una puntina stereo, costituita da due sensori teoricamente indipendenti fra loro. In realtà questa tecnologia era bel lontana dalla perfezione e rimaneva una certa '''diafonia''' (cross-correlazione fra i due canali). I nastri miglioreranno un po' la situazione ma il problema sparirà definitivamente solo col digitale.&lt;br /&gt;
&lt;br /&gt;
Essendo all'epoca una tecnologia costosa, il target di mercato era orientato al ceto medio-alto e ai suoi consumi: classica, jazz (passato da un ambito prettamente &amp;quot;popular&amp;quot; a quello &amp;quot;colto&amp;quot;), pop leggero, crooners. Il rock 'n roll, assieme alle altre produzioni &amp;quot;indipendenti&amp;quot;, rimane inizialmente fuori da questo mercato almeno per una decina d'anni.&lt;br /&gt;
&lt;br /&gt;
Bisogna ricordare che nei primi anni della diffusione della stereofonia, il nuovo formato stereo non era compatibile col mono e viceversa. I dischi prodotti in questo periodo di transizione escono in due versioni, una per le puntine stereo e l'altra per le puntine mono.&lt;br /&gt;
&lt;br /&gt;
== La musicassetta ==&lt;br /&gt;
&lt;br /&gt;
Giunti agli anni '70, lo stereo ha ormai subito una diffusione di massa, e la sua definitiva affermazione coincide con lo sviluppo di un nuovo supporto: la '''musicassetta''', targata '''Philips'''. Col passare degli anni diventa il supporto preferito per il consumo di musica, superando le vendite del vinile, prima ancora della diffusione del CD.&lt;br /&gt;
&lt;br /&gt;
Assieme ai lettori si diffondono quasi contemporaneamente i registratori a cassetta stereo casalinghi, spesso di buona qualità e magari dotati di tecnologia '''dolby''' per la riduzione del rumore di fondo. Nasce in questo modo il fenomeno della '''copia privata''', che diventerà lo spauracchio dell'industria discografica negli anni a venire fino ai giorni nostri.&lt;br /&gt;
&lt;br /&gt;
Anche la musicassetta è l'unica superstite di una delle tante &amp;quot;guerre dei formati&amp;quot; che costellano la storia dell'industria musicale: la concorrente principale si chiamava '''stereo8''', aveva una resa sonora di qualità superiore ma due grossi difetti, non era registrabile in casa ed essendo più grossa... era più difficile da rubare! ;)&lt;br /&gt;
&lt;br /&gt;
== L'ascolto &amp;quot;nomade&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
La musicassetta si presta benissimo all'ascolto '''portabile''' e '''mobile''' (walkman, autoradio), e questo è forse il fattore che più di tutti ha sancito il successo del supporto. A questo si aggiunge la sua estrema versatilità, riciclabilità, economicità e il play time più lungo atto a contenere grosse '''compilation'''. L'ascolto in situazioni diverse da quella domestica (soprattutto in auto) seleziona la fruizione poiché determinati generi sono più adatti all'ascolto mobile rispetto ad altri.&lt;br /&gt;
&lt;br /&gt;
Arrivando ai giorni nostri, il CD e i file digitali migliorano sempre di più la qualità che si può ottenere nelle copie, consentono una fruizione di alta qualità anche con mezzi relativamente poveri, generano nuove situazioni d'ascolto e fanno nascere fenomeni di '''concorrenza''' rispetto al mercato discografico e persino rispetto alla fruizione radiofonica (ascolto '''mood-based''', '''shuffle''').&lt;br /&gt;
&lt;br /&gt;
= Pubblicità e musica =&lt;br /&gt;
&lt;br /&gt;
== Il jingle ==&lt;br /&gt;
&lt;br /&gt;
Pubblicità e musica cominciano ad andare a braccetto già agli albori delle trasmissioni radiofoniche, come abbiamo visto parlando della nascita della BMI. Verso gli anni '70 però il legame si fa più stretto, la stessa musica entra '''dentro''' la pubblicità con i '''jingle''', musica creata appositamente per i messaggi promozionali da autori specializzati. I jingle pubblicitari devono essere '''brevissimi''' (max 30 secondi) ed &amp;quot;agganciare&amp;quot; subito lo spettatore.&lt;br /&gt;
&lt;br /&gt;
Da qualche anno è prassi usare anche un altro sistema: si inseriscono nel messaggio pubblicitario, al posto del jingle, brani studiati per il mercato discografico non ancora molto famosi. In questo modo il pubblicitario risparmia nell'acquisizione dei diritti di sfruttamento dell'opera, poiché l'autore &amp;quot;guadagna&amp;quot; anche il vantaggio collaterale di avere un'ottima vetrina per la sua composizione.&lt;br /&gt;
&lt;br /&gt;
Anche i brani già molto famosi funzionano, a scopo rievocativo: le sonorità già note sono le più rassicuranti. In questo caso però nasce il problema della cessione dei diritti, divenuta particolarmente onerosa a causa della crisi del mercato dei supporti. Una soluzione è '''coverizzare''' il brano, in modo tale da dover pagare solo i diritti d'autore ed evitare quelli connessi. Spesso i pubblicitari non vogliono pagare nemmeno quelli, e allora cercano di produrre jingle che '''ricordino''' il brano originale al quale si ispirano... se l'operazione non è sufficientemente accorta nascono problemi di plagio.&lt;br /&gt;
&lt;br /&gt;
== Promozione discografica alla radio ==&lt;br /&gt;
&lt;br /&gt;
L'esecuzione di musica registrata alla radio inizia solo negli anni '40, prima si trasmetteva solo musica dal vivo. I discografici pensavano che, se si fossero suonati i dischi alla radio (quindi gratis), tutti li avrebbero ascoltati solo via etere e nessuno li avrebbe più comprati. Col tempo si registra invece un cambio di mentalità, i discografici cominciano ad usare la radio come mezzo di '''promozione''' per i loro prodotti.&lt;br /&gt;
&lt;br /&gt;
Sono anni difficili per le varie categorie chiamate in causa: i musicisti che vivevano di esecuzioni alla radio si trovano senza lavoro, gli interpreti scioperano e non registrano più dischi, gli editori all'inizio si spaventano ma poi si accorgono di poter sopravvivere grazie ai diritti derivati dall'esecuzione del vecchio materiale. Lo sciopero rientrerà e i musicisti dovranno accettare la costituzione dei nuovi equilibri che domineranno l'industria musicale.&lt;br /&gt;
&lt;br /&gt;
Un fenomeno di questo periodo sono i '''disc jockey''', &amp;quot;fantini&amp;quot; (jockey, appunto) che &amp;quot;cavalcano&amp;quot; i dischi fino a portarli al successo. In quegli anni nasce anche la '''Capitol Records''', una delle prime case discografiche a permettere il passaggio dei dischi in radio.&lt;br /&gt;
&lt;br /&gt;
Quasi contemporanea alla nascita dei dj è la nascita della '''corruzione''' dei dj da parte dei discografici, in modo da ottenere più passaggi dei propri dischi. Ciò porterà ad una conseguente regolamentazione per arginare il fenomeno, soprattutto nel settore pubblico, e proteggere il palinsesto da interventi esterni.&lt;br /&gt;
&lt;br /&gt;
Negli ultimi 30 anni i discografici acquisiscono potere contrattuale rispetto alle radio: una pratica diffusa, ad esempio, è la concessione di interviste in esclusiva con un determinato artista, previa garanzia di un certo numero di passaggi in radio dei propri dischi.&lt;br /&gt;
&lt;br /&gt;
== Promozione discografica televisiva ==&lt;br /&gt;
&lt;br /&gt;
La televisione è un altro potente motore promozionale, soprattutto nel determinare i grandi successi. Quando i discografici cominciano ad usare il mezzo ne soffrono la costosità: le trasmissioni erano prevalentemente in diretta ed era necessario mandare gli artisti (spesso affetti da divismo) in costose trasferte per raggiungere gli studi.&lt;br /&gt;
&lt;br /&gt;
Verso la metà degli anni '70 viene inventato il '''video musicale'''. I videoclip risolvevano i problemi della trasferta ma erano comunque troppo costosi da realizzare per l'utilizzo che ne veniva fatto (venivano mandati in onda per un breve periodo e poi giacevano in magazzino). A '''Robert Pittman''' viene un'idea geniale, quella di mandarli in rotazione come se si trattasse di un programma radiofonico: nasce '''MTV'''.&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Economia_dei_Beni_Musicali/Appunti/2007-2008/Elementi_di_Economia&amp;diff=18490</id>
		<title>Economia dei Beni Musicali/Appunti/2007-2008/Elementi di Economia</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Economia_dei_Beni_Musicali/Appunti/2007-2008/Elementi_di_Economia&amp;diff=18490"/>
		<updated>2008-01-27T11:47:33Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= L'industria musicale in Italia =&lt;br /&gt;
&lt;br /&gt;
'''ASK''': '''A'''rt, '''S'''cience and '''K'''nowledge, gruppo della Bocconi che redige ogni anno un rapporto sull'economia della musica italiana. Sponsorizzato da '''DISMAMUSICA''' e '''FEM''' che avevano per primi avviato questo tipo di ricerche.&lt;br /&gt;
&lt;br /&gt;
L'industria musicale è difficilmente valutabile e quantificabile perché composta da diversi fattori e operatori, non tutti visibili allo stesso modo.&lt;br /&gt;
&lt;br /&gt;
Il valore dell'industria musicale italiana si attesta attorno ai '''3 miliardi di euro''', valore modesto rispetto ai settori trainanti della nostra economia, ma comunque capace di dare lavoro a migliaia di persone.&lt;br /&gt;
&lt;br /&gt;
= IVA e suo funzionamento =&lt;br /&gt;
&lt;br /&gt;
'''IVA''': '''I'''mposta sul '''V'''alore '''A'''ggiunto, ovvero sul guadagno di un'attività (ricavi meno costi). L'imposta viene applicata come un'aggiunta percentuale sul prezzo della merce, sia acquistata che venduta. La differenza tra l'IVA sulle vendite e quella sugli acquisti è ciò che l'attività deve al fisco.&lt;br /&gt;
&lt;br /&gt;
Dal punto di vista del commerciante, l'IVA dev'essere '''pagata''' sulle fatture emesse (merce venduta), e gli viene '''rimborsata''' sulle fatture ricevute (merce in entrata). Ciò significa che l'attività paga in maniera '''proporzionale al suo guadagno''', e in caso di perdita può addirittura '''andare a credito''' nei confronti dello Stato.&lt;br /&gt;
&lt;br /&gt;
'''FATTURATO''': somma di tutte le fatture emesse, al netto dell'IVA&lt;br /&gt;
&lt;br /&gt;
'''ALIQUOTA IVA''': percentuale aggiunta al prezzo della merce. In Italia l'aliquota ordinaria è del 20%, mentre ai beni di prima necessità viene applicata un'aliquota del 4%. I libri e i giornali sono considerati beni culturali, esenti da IVA.&lt;br /&gt;
&lt;br /&gt;
Recentemente si è discusso di una riduzione di aliquota IVA a favore dei dischi, per alleviare la crisi dell'industria discografica. Sarebbe coerente con la definizione di disco come bene culturale, purtroppo per approvare questo provvedimento serve l''''unanimità''' degli stati membri dell'Unione Europea. Siccome il mercato discografico britannico è ancora fiorente, l'IVA da esso generata è una buona fonte di guadagno alla quale il Regno Unito non è disposto a rinunciare.&lt;br /&gt;
&lt;br /&gt;
= Rilevamento degli ascolti radiotelevisivi =&lt;br /&gt;
&lt;br /&gt;
Servono a rilevare il gradimento delle trasmissioni. In Italia l'ente preposto a questi rilevamenti è l''''AUDITEL'''. Lo share generato dalle varie trasmissioni viene utilizzato per selezionare la programmazione: le più gradite avranno uno spazio maggiore e migliore all'interno del palinsesto. Lo share generato dagli eventi musicali in TV è piuttosto basso, e la loro presenza è di conseguenza ridotta.&lt;br /&gt;
&lt;br /&gt;
'''SHARE''': Percentuale di spettatori calcolati sul bacino di utenza '''in un dato momento'''. A parità di share, quindi, il numero assoluto di spettatori sarà più alto nel prime time e più basso nelle fasce orarie meno frequentate (in particolare la notte).&lt;br /&gt;
&lt;br /&gt;
Il dato sull'utenza assoluta è invece molto interessante per i sostenitori della spesa televisiva: chi fa la '''pubblicità'''. L'utenza assoluta viene usata per stimare la visibilità (e quindi il valore) degli spazi pubblicitari associati alle trasmissioni.&lt;br /&gt;
&lt;br /&gt;
Questi meccanismi di valutazione delle &amp;quot;performance&amp;quot; economiche dei media sono nati con la diffusione dei quotidiani, quindi ben prima di radio e TV.&lt;br /&gt;
&lt;br /&gt;
Le aziende che investono in pubblicità si basano sia su questi rilevamenti, sia su un concetto fondamentale del marketing: la '''definizione del target'''. L'investimento è ottimizzato se la pubblicità ottiene il massimo impatto su una fascia di pubblico che corrisponde al proprio &amp;quot;cliente ideale&amp;quot; (es. pubblicità di giocattoli nell'orario dei cartoni animati).&lt;br /&gt;
&lt;br /&gt;
= Rilevazioni radiofoniche =&lt;br /&gt;
&lt;br /&gt;
Se per la televisione c'era AUDITEL, le rilevazioni radiofoniche vengono effettuate da '''AUDIRADIO'''.&lt;br /&gt;
&lt;br /&gt;
Come per la televisione, ci si basa su un'indagine '''statistica''' basata su un '''campione''' rappresentativo della popolazione italiana. Per rappresentativo si intende un'immagine &amp;quot;in miniatura&amp;quot; della popolazione totale per quanto riguarda alcuni parametri significativi come età, genere, reddito ecc.&lt;br /&gt;
&lt;br /&gt;
A differenza di AUDITEL, che utilizza un sistema di rilevazione elettronico pilotato da uno speciale telecomando, AUDIRADIO effettua le sue rilevazioni tramite '''intervista'''. Ciò può portare a delle distorsioni significative in quanto il sistema dell'intervista:&lt;br /&gt;
* si basa sulla '''memoria''' dell'intervistato, che può essere ingannevole&lt;br /&gt;
* '''sovrastima''' l'ascolto delle trasmissioni poiché molto spesso la radio, anche se accesa, non viene ascoltata davvero ma semplicemente tenuta come sottofondo&lt;br /&gt;
* il modo e il luogo in cui sono poste le domande a volte '''influenza''' le risposte e/o distorge la rappresentatività del campione&lt;br /&gt;
&lt;br /&gt;
I dati dimostrano che il consumo radiofonico è superiore al consumo di musica da internet o da canale discografico. Addirittura il pubblico radiofonico è superiore a quello televisivo! Alcuni sostengono che il punto di forza della radio sia la '''gratuità''' del servizio e che la diffusione di musica a rotazione sia talmente intensiva da non invogliare all'acquisto discografico la maggior parte del pubblico.&lt;br /&gt;
&lt;br /&gt;
Ultimamente si sta pensando ad un'automatizzazione delle rilevazioni radiofoniche (come già avviene per la TV) mediante l'utilizzo di uno speciale orologio con microfono. L'orologio registra periodicamente pochi millisecondi di segnale (non critici dal punto di vista della privacy) e lo invia ad un server che esegue un confronto fra il campione e i canali radio. Se il campione corrisponde, si ha la certezza che l'ascoltatore sta effettivamente ascoltando (è in prossimità della radio) un determinato canale. Anche AUDITEL adotterà questo sistema per la TV, poiché non richiede l'uso di telecomandi speciali da parte dell'utente ed è indipendente dalla tecnologia di trasmissione (satellite, via cavo...).&lt;br /&gt;
&lt;br /&gt;
= La ripartizione SIAE =&lt;br /&gt;
&lt;br /&gt;
'''SIAE''': '''S'''ocietà '''I'''taliana '''A'''utori ed '''E'''ditori, gestisce appunto i diritti degli autori e degli editori. Non si occupa invece dei diritti connessi. In Italia la SIAE è anche l'ente preposto alla gestione e al controllo fiscale di tutto ciò che concerne l'ambito dello spettacolo.&lt;br /&gt;
&lt;br /&gt;
Il flusso di denaro associato ai diritti d'autore è una delle parti più rilevanti dell'industria musicale. Vengono pagati da case discografiche, produttori cinematografici, gestori di sale da ballo, emittenti radiotelevisive, organizzatori di concerti ecc. agli autori (di musiche e testi) e agli editori delle opere che utilizzano nella loro attività.&lt;br /&gt;
&lt;br /&gt;
'''Ordinanza di ripartizione''': Documento stilato periodicamente dalla SIAE (di solito su base triennale) che definisce le regole e le modalità di ripartizione del denaro raccolto ai vari associati. Il documento è diviso in '''classi di ripartizione''' (balli e concertini, musica da film, diffusione, esecuzioni pubbliche) che a causa della loro diversa natura adottano differenti criteri di suddivisione degli introiti. Dall'ordinanza del 2004 sono state aggiunte due classi che riguardano alcuni diritti connessi, ma sempre a vantaggio di autori ed editori: si tratta dei diritti sulla '''vendita dei dischi''' e sulla vendita di '''musica su internet'''.&lt;br /&gt;
&lt;br /&gt;
La divisione dei proventi di ogni singolo brano fra i suoi autori avviene tramite '''quote''' di ripartizione, che vengono definite in '''ventiquattresimi''' per la ripartizione ordinaria, in '''percentuale''' per le due nuove categorie. La differenza nel calcolo delle quote è dovuta al fatto che la gestione dei diritti fonomeccanici è stata ereditata da un altro ente di collettazione (la SCF) ed è comunque posteriore al copyright editoriale. I diritti fonomeccanici vengono generalmente pagati con l'acquisto del bollino SIAE.&lt;br /&gt;
&lt;br /&gt;
'''Ripartizione supplementare''': Il crescente fenomeno della '''copia privata''' e la natura stessa di alcuni utilizzi legali (es. rotazione in discoteca) impediscono un monitoraggio perfettamente analitico dell'utilizzo di ogni singolo brano. Tutti gli utilizzi la cui provenienza non può essere accertata ricadono in questa ripartizione, che viene effettuata su base proporzionale a seconda degli incassi ordinari percepiti dagli autori.&lt;br /&gt;
&lt;br /&gt;
= I contratti di licenza =&lt;br /&gt;
&lt;br /&gt;
Se si vogliono produrre e vendere dischi, ci si deve rivolgere alla SIAE (che amministra per conto degli autori i diritti sulle loro opere) per ottenere un '''contratto di licenza'''. Tramite il contratto di licenza l'autore delega al discografico l'esercizio dei diritti necessari alla produzione e alla distribuzione del disco, previo pagamento di un '''equo compenso'''.&lt;br /&gt;
&lt;br /&gt;
Ecco i contratti di licenza principali:&lt;br /&gt;
&lt;br /&gt;
* '''Licenza singola'''&lt;br /&gt;
: Accessibile anche a privati cittadini. A ogni produzione si paga subito tutto il dovuto, in maniera proporzionale al numero di copie prodotte. Chiunque può ottenere un contratto di licenza singola, ma con questo tipo di accordo il rischio finanziario è tutto a carico del produttore.&lt;br /&gt;
* '''Contratto generale'''&lt;br /&gt;
: E' il contratto &amp;quot;delle major&amp;quot;: si paga in maniera proporzionale al venduto, indipendentemente dal numero di produzioni e di copie. Le rimanenze di magazzino sono esentate e il pagamento si effettua su base trimestrale, non tutto e subito.&lt;br /&gt;
* '''Contratto edicole'''&lt;br /&gt;
: I prodotti fonomeccanici venduti nelle edicole hanno alcuni vantaggi. Si paga di meno per una serie di fattori, primi fra tutti la necessità di una tiratura elevata, l'IVA ridotta e un prezzo medio degli articoli da edicola più basso rispetto ai normali prodotti discografici.&lt;br /&gt;
* '''Contratto premium'''&lt;br /&gt;
: I prodotti distribuiti in omaggio assieme all'acquisto di altri prodotti godono di tariffe eccezionalmente basse.&lt;br /&gt;
&lt;br /&gt;
'''FIMI''' e '''AFI''': Associazioni di discografici in Italia.&lt;br /&gt;
&lt;br /&gt;
= I contratti discografici =&lt;br /&gt;
&lt;br /&gt;
Si basano su una '''royalty''' calcolata su una stima del prezzo del prodotto. Negli USA si usa il '''SRLP''' ('''S'''uggested '''R'''etail '''L'''ist '''P'''rice, prezzo al dettaglio consigliato), in UK si usa il '''PPD''' ('''P'''ublished '''P'''rice for '''Dealers''', prezzo all'ingrosso). Il primo è generalmente più alto del secondo, quindi a parità di percentuale produce royalties più alte. In realtà i metodi si equivalgono.&lt;br /&gt;
&lt;br /&gt;
Royalties tipiche negli Stati Uniti:&lt;br /&gt;
* '''9-13%''' con etichetta indipendente&lt;br /&gt;
* '''13-16%''' con major o mini major&lt;br /&gt;
* '''16-18%''' per un artista affermato&lt;br /&gt;
* '''19-20%''' per una superstar&lt;br /&gt;
&lt;br /&gt;
Superata la soglia delle 500.000 copie vendute di solito si ha un aumento dello 0,5-1%.&lt;br /&gt;
&lt;br /&gt;
Gli artisti percepiscono anche un '''anticipo''' (da 5.000 a 750.000 $, a seconda del discografico e della notorietà dell'artista) per concedere l'opera in esclusiva e per pagare la registrazione. Negli USA l'anticipo viene gestito interamente dall'artista, in UK a volte una somma viene amministrata dal discografico onde evitare sprechi in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
Le prime royalties servono all'artista per '''saldare''' l'anticipo. In caso di flop è il discografico a rimetterci ma l'artista non guadagna nulla. Di solito i contratti sono per più album, e le royalties di tutti gli album non vengono incassate dall'artista prima di aver saldato tutti gli anticipi.&lt;br /&gt;
&lt;br /&gt;
'''Cross-collateralization''': uso dei proventi del copyright per pagare l'anticipo. Si può fare solo se l'artista esecutore è anche autore dei brani dell'album. '''sconveniente per l'artista''' poiché il copyright è l'unica fonte di guadagno immediato.&lt;br /&gt;
&lt;br /&gt;
'''Compulsory licence''': Negli Stati Uniti, a differenza che in Europa, spetta all'autore dell'opera decidere chi debba effettuare la '''prima registrazione''' e può concedere la licenza al prezzo che vuole. Dopo la prima registrazione scatta il meccanismo della ''compulsory licence'': chiunque può richiedere la licenza, come avviene in Europa, ma il compenso viene stabilito '''per legge''' a livello federale e non dalla società di collettazione.&lt;br /&gt;
&lt;br /&gt;
'''Controlled composition''': Sempre negli Stati Uniti, se un interprete è anche autore del brano si è di fronte a una ''controlled composition'', che è soggetta a una riduzione delle tariffe di licenza rispetto a quelle stabilite dalla ''compulsory licence''.&lt;br /&gt;
&lt;br /&gt;
La regolamentazione USA differisce da quella europea in alcuni altri punti:&lt;br /&gt;
* I diritti morali sono cedibili&lt;br /&gt;
* Nei casi di plagio, è assolutorio il poter dimostrare di non essere mai venuti a contatto col brano plagiato&lt;br /&gt;
&lt;br /&gt;
Quest'ultimo punto ha come conseguenza il fatto che in America i demo non sollecitati vengono generalmente respinti, per evitare contatti con canzoni indesiderate e difendersi da eventuali plagi involontari. Piccola parentesi: il plagio &amp;quot;non ha confini&amp;quot;, nel senso che non esistono criteri oggettivi per definirlo. Ciò che conta è la copia dei '''tratti caratteristici''' di un'opera, non un determinato numero di battute.&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Utente:SingInTime&amp;diff=18451</id>
		<title>Utente:SingInTime</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Utente:SingInTime&amp;diff=18451"/>
		<updated>2008-01-22T15:05:07Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Ciao a tutti! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ciao a tutti!==&lt;br /&gt;
Mi chiamo Stefano, classe '86, veneziano d'origine e milanese adottivo :) Sono un comunicatore musicale e in quanto tale amo la musica (da ascoltare e suonare). Inoltre ho una band ([http://www.extempore.tk ExTempore]) nella quale canto e suono le tastiere.&lt;br /&gt;
&lt;br /&gt;
Un'altra mia passione è la giocoleria, i miei attrezzi preferiti sono le catene da infuocare perché sentire le fiamme che danzano assieme a te a pochi centimetri dalla tua pelle è sempre un'emozione unica!&lt;br /&gt;
&lt;br /&gt;
==Mi trovate online==&lt;br /&gt;
* su msn al contatto singintime_AT_hotmail_DOT_it&lt;br /&gt;
* su myspace all'indirizzo www.myspace.com/singintime&lt;br /&gt;
* su ICQ (104817415) che però non uso quasi mai.&lt;br /&gt;
* via mail all'indirizzo singintime_AT_gmail_DOT_com&lt;br /&gt;
&lt;br /&gt;
Ogni tanto bazzico anche qualche canale IRC (#metal, #extempore, server irc.azzurra.org) e scrivo in alcuni forum, primi fra tutti quello della mia band (disponibile [http://extempore.altervista.org/phpBB2 qui]), quello di [http://www.giocoleria.org giocoleria.org] e quello di [http://www.italianpoi.eu italianpoi.eu] dove collaboro anche alla stesura della [http://inertia.altervista.org/doku.php WikiPOIdia].&lt;br /&gt;
&lt;br /&gt;
==Webmaster di==&lt;br /&gt;
* http://www.extempore.tk - Il sito ufficiale della mia band&lt;br /&gt;
* http://www.servizicontabiliefiscali.com - Studio contabile in Mestre (VE)&lt;br /&gt;
&lt;br /&gt;
Ora come ora non mi viene in mente altro, casomai aggiungerò altre info in seguito, ammesso che a qualcuno importi qualcosa! :)&lt;br /&gt;
&lt;br /&gt;
Ciao a tutti, ci becchiamo in aula!&lt;br /&gt;
&lt;br /&gt;
Stefano - SingInTime&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_musicali&amp;diff=17671</id>
		<title>Database musicali</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_musicali&amp;diff=17671"/>
		<updated>2007-07-19T14:30:49Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{introduzione}}&lt;br /&gt;
== Turni ==&lt;br /&gt;
{{Turno}}&lt;br /&gt;
&lt;br /&gt;
== A.A. passati ==&lt;br /&gt;
== Informazioni ==&lt;br /&gt;
&lt;br /&gt;
Home page ufficiale del corso: http://homes.dico.unimi.it/dbandsec/DBMusicali&lt;br /&gt;
&lt;br /&gt;
Appunti per l'anno 2006-2007 disponibili qui: [[Database Musicali/Appunti/2006-2007]]&lt;br /&gt;
&lt;br /&gt;
=== Giudizio sul corso ===&lt;br /&gt;
{{Giudizio}}&lt;br /&gt;
{{Giudizio/Interesse}}&lt;br /&gt;
{{Giudizio/Difficoltà}}&lt;br /&gt;
{{Giudizio/Nonfrequentanti}}&lt;br /&gt;
{{Giudizio/Ore}}&lt;br /&gt;
&lt;br /&gt;
[[Categoria:Corsi STCM]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17670</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17670"/>
		<updated>2007-07-19T14:27:07Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Criteri di similarità */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. Due contorni melodici con pitch assoluto diverso ma con la medesima distribuzione di intervalli sono considerati percettivamente equivalenti (melodie trasposte).&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non sono sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti, ma non lo completano dal momento che tecniche esecutive diverse possono far generare al medesimo strumento timbri totalmente diversi (es. corda sfregata/martellata/pizzicata).&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione (diteggiatura, ornamenti, istruzioni dinamiche, etc). Tutta la partitura potrebbe essere inclusa in questo aspetto (le note stesse rappresentano istruzioni esecutive). Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale. Per realizzare questo approccio vengono solitamente usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore sia presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_musicali&amp;diff=17669</id>
		<title>Database musicali</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_musicali&amp;diff=17669"/>
		<updated>2007-07-19T14:20:44Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Informazioni */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{introduzione}}&lt;br /&gt;
== Turni ==&lt;br /&gt;
{{Turno}}&lt;br /&gt;
&lt;br /&gt;
== A.A. passati ==&lt;br /&gt;
== Informazioni ==&lt;br /&gt;
&lt;br /&gt;
Appunti per l'anno 2006-2007 disponibili qui: [[Database Musicali/Appunti/2006-2007]]&lt;br /&gt;
&lt;br /&gt;
=== Giudizio sul corso ===&lt;br /&gt;
{{Giudizio}}&lt;br /&gt;
{{Giudizio/Interesse}}&lt;br /&gt;
{{Giudizio/Difficoltà}}&lt;br /&gt;
{{Giudizio/Nonfrequentanti}}&lt;br /&gt;
{{Giudizio/Ore}}&lt;br /&gt;
&lt;br /&gt;
[[Categoria:Corsi STCM]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Categoria:Corsi_STCM&amp;diff=17668</id>
		<title>Categoria:Corsi STCM</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Categoria:Corsi_STCM&amp;diff=17668"/>
		<updated>2007-07-19T14:13:08Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Nuovo ordinamento - Complementari */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Corso di Laurea in Scienze e Tecnologie della Comunicazione Musicale''' =&lt;br /&gt;
Abbreviazione: '''STCM'''&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
vedi http://www.lim.dico.unimi.it/didatt/avvisiSTCM.htm&lt;br /&gt;
&lt;br /&gt;
== Sito ufficiale ==&lt;br /&gt;
Attenzione alla strambata del 2006:&lt;br /&gt;
* per matricole dal 2005-06: http://www.ccdi.unimi.it/it/corsiDiStudio/F61/index.html&lt;br /&gt;
** ''attivato nella classe delle lauree triennali di Scienze della Comunicazione.''&lt;br /&gt;
* per matricole fino al 2004-05: http://www.ccdi.unimi.it/it/corsiDiStudio/F57/index.html&lt;br /&gt;
** ''attivato nella classe delle lauree triennali di Scienze e Tecnologie Informatiche.''&lt;br /&gt;
&lt;br /&gt;
Sito del [http://www.lim.dico.unimi.it LIM]&lt;br /&gt;
* http://www.lim.dico.unimi.it/didatt/STCM.htm&lt;br /&gt;
:che spiega anche il passaggio verso il nuovo ordinamento&lt;br /&gt;
&lt;br /&gt;
InfoStudenti (Informatica)&lt;br /&gt;
* infostudenti@dsi.unimi.it&lt;br /&gt;
* +39 02503.16250 , +39 2503.16326 / 16252&lt;br /&gt;
&lt;br /&gt;
== Appelli ==&lt;br /&gt;
[http://studenti.unimi.it/Appelli/ReSEGRSF57.pdf Appelli d'esame definiti nei prossimi 60 giorni]&lt;br /&gt;
&lt;br /&gt;
== Forums ==&lt;br /&gt;
*http://www.dsy.it/forum/forumdisplay.php?s=&amp;amp;forumid=142 (hosted)&lt;br /&gt;
*http://www.musicomio.org/fora/&lt;br /&gt;
&lt;br /&gt;
=== Fonti di appunti e testi ===&lt;br /&gt;
* [http://www.midosoundesigner.net/html/university.html Appunti di Mido]&lt;br /&gt;
* [http://www14.brinkster.com/maggyonline/ingresso.html MaggyOnline]&lt;br /&gt;
* http://cdlezioni.dico.unimi.it - accesso tramite login del Silab&lt;br /&gt;
** al 2/2006 lezioni di: Apolloni, Bellettini, Bonzini, Cesa-Bianchi, Mereghetti, Monga, Palano, Pighizzini, Torelli&lt;br /&gt;
* http://vc.dsi.unimi.it/ - Archivio delle registrazioni delle lezioni&lt;br /&gt;
** al 2/2006 solo Informatica, e solo nelle classi 26, 23S e 14&lt;br /&gt;
&lt;br /&gt;
Biblioteca per unimi: http://lopac.cilea.it/opac/sebina/ausm&lt;br /&gt;
&lt;br /&gt;
Altre biblioteche: http://mai.cilea.it/repertorio/universita/lombardia.htm#PMILANO&lt;br /&gt;
* in particolare: &amp;quot;Università di Milano. Biblioteca di informatica&amp;quot;&lt;br /&gt;
** http://fantomas.usr.dsi.unimi.it/BASIS/tlpunmi/web/cat_generale/SF&lt;br /&gt;
&lt;br /&gt;
== Requisiti pre laurea ==&lt;br /&gt;
* vedi in http://www.lim.dico.unimi.it/didatt/STCM.htm&lt;br /&gt;
&lt;br /&gt;
== Tesi ==&lt;br /&gt;
&lt;br /&gt;
=== Tesi disponibili ===&lt;br /&gt;
* http://www.lim.dico.unimi.it/didatt/dispo.html&lt;br /&gt;
&lt;br /&gt;
=== Tesi realizzate ===&lt;br /&gt;
* http://www.lim.dico.unimi.it/didatt/tesi.htm (non solo per STCM, ma affini)&lt;br /&gt;
&lt;br /&gt;
== Corsi ==&lt;br /&gt;
=== Vecchio ordinamento ===&lt;br /&gt;
==== Vecchio ordinamento - Fondamentali del primo anno ====&lt;br /&gt;
* [[Fenomenologia del linguaggio musicale]]&lt;br /&gt;
* [[Informatica generale]]&lt;br /&gt;
* [[Laboratorio Informatica Generale]]       &lt;br /&gt;
* [[Lingua italiana e comunicazione]]       &lt;br /&gt;
* [[Semiotica]]       &lt;br /&gt;
* [[Stilistica e semiotica del testo]]&lt;br /&gt;
==== Vecchio ordinamento - Fondamentali del secondo anno ====&lt;br /&gt;
* [[Descrizione formale dell'informazione musicale]]	     	&lt;br /&gt;
* [[Informatica applicata alla musica]]            	&lt;br /&gt;
* [[Informatica distribuita]]            	&lt;br /&gt;
* [[Laboratorio di Informatica distribuita]]            	&lt;br /&gt;
* [[Laboratorio professionalizzante]]            	&lt;br /&gt;
* [[Lingua Inglese]]            	&lt;br /&gt;
* [[Lingua spagnola]]            	&lt;br /&gt;
* [[Metodologie per l'editoria musicale]]           	&lt;br /&gt;
* [[Pedagogia della musica]]       &lt;br /&gt;
* [[Psicofisiologia della percezione musicale]]       &lt;br /&gt;
* [[Tecniche per l'editoria musicale]]&lt;br /&gt;
&lt;br /&gt;
==== Vecchio ordinamento - Fondamentali del terzo anno ====&lt;br /&gt;
* [[Comunicazione Multimediale]]       &lt;br /&gt;
* [[Diritto dell'informazione]]&lt;br /&gt;
* [[Economia dei beni musicali]]&lt;br /&gt;
* [[Estetica Musicale]]&lt;br /&gt;
* [[Produzione Artistica e Società Industriale]]&lt;br /&gt;
&lt;br /&gt;
==== Vecchio ordinamento - Complementari ====&lt;br /&gt;
* [[Acustica architettonica]]&lt;br /&gt;
* [[Archivistica musicale]]&lt;br /&gt;
* [[Codifica dell'informazione multimediale]]&lt;br /&gt;
* [[Comunità virtuali]]&lt;br /&gt;
* [[Crittografia]]&lt;br /&gt;
* [[Database musicali]]&lt;br /&gt;
* [[Editoria multimediale]]&lt;br /&gt;
* [[Elaborazione numerica dei segnali]]&lt;br /&gt;
* [[Elementi di fisica acustica]]&lt;br /&gt;
* [[Informatica applicata al suono]]&lt;br /&gt;
* [[Interazione uomo/macchina]]&lt;br /&gt;
* [[Mobile computing]]&lt;br /&gt;
* [[Modelli fisici e numerici in acustica]]&lt;br /&gt;
* [[Programmazione e Architetture DSP]]&lt;br /&gt;
* [[Programmazione per la musica]]&lt;br /&gt;
* [[Semantica delle Lingue Naturali]]&lt;br /&gt;
* [[Sociologia della Musica]]&lt;br /&gt;
* [[Tecnologie per il restauro dell'informazione musicale]]&lt;br /&gt;
* [[Tecnologie web per terminali fissi e mobili]]&lt;br /&gt;
&lt;br /&gt;
=== Nuovo ordinamento ===&lt;br /&gt;
==== Nuovo ordinamento - Fondamentali del primo anno ====&lt;br /&gt;
* [[Acustica musicale]]&lt;br /&gt;
* [[Elaborazione numerica dei segnali]]&lt;br /&gt;
* [[Informatica generale]]&lt;br /&gt;
* [[Laboratorio di Informatica Generale]]&lt;br /&gt;
* [[Lingua Inglese]]&lt;br /&gt;
* [[Lingua Italiana e Comunicazione]]&lt;br /&gt;
* [[Matematica per la musica]]&lt;br /&gt;
* [[Semiotica musicale]]&lt;br /&gt;
==== Nuovo ordinamento - Fondamentali del secondo anno ====&lt;br /&gt;
* [[Database musicali]]&lt;br /&gt;
* [[Informatica applicata alla musica]]&lt;br /&gt;
* [[Informatica applicata al suono]]&lt;br /&gt;
* [[Informatica distribuita]]&lt;br /&gt;
* [[Laboratorio di informatica musicale]]&lt;br /&gt;
* [[Psicofisiologia della percezione musicale]]&lt;br /&gt;
* [[Pedagogia della musica]]&lt;br /&gt;
* [[Programmazione per la musica]]&lt;br /&gt;
&lt;br /&gt;
==== Nuovo ordinamento - Complementari ====&lt;br /&gt;
* [[Codifica dell'Informazione multimediale]]&lt;br /&gt;
* [[Comunità virtuali]]&lt;br /&gt;
* [[Crittografia]]&lt;br /&gt;
* [[Fondamenti di Comunicazione Digitale]]&lt;br /&gt;
* [[Mobile Computing]]&lt;br /&gt;
&lt;br /&gt;
==== ?? ====&lt;br /&gt;
* [[Ontologie e web semantico]]&lt;br /&gt;
&lt;br /&gt;
[[Categoria:Corsi]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Utente:SingInTime&amp;diff=17667</id>
		<title>Utente:SingInTime</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Utente:SingInTime&amp;diff=17667"/>
		<updated>2007-07-19T14:03:46Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ciao a tutti!==&lt;br /&gt;
Mi chiamo Stefano, ho 20 anni, veneziano d'origine e milanese adottivo :) Sono al 3° anno di STCM e ovviamente amo la musica, da ascoltare e suonare, ho una band ([http://www.extempore.tk ExTempore]) nella quale canto e suono le tastiere.&lt;br /&gt;
&lt;br /&gt;
Un'altra mia passione è la giocoleria, i miei attrezzi preferiti sono le catene da infuocare perché sentire le fiamme che danzano assieme a te a pochi centimetri dalla tua pelle è sempre un'emozione unica! &lt;br /&gt;
&lt;br /&gt;
==Mi trovate online==&lt;br /&gt;
* su msn al contatto singintime_AT_hotmail_DOT_it&lt;br /&gt;
* su myspace all'indirizzo www.myspace.com/singintime&lt;br /&gt;
* su ICQ (104817415) che però non uso quasi mai.&lt;br /&gt;
* via mail all'indirizzo singintime_AT_gmail_DOT_com&lt;br /&gt;
&lt;br /&gt;
Ogni tanto bazzico anche qualche canale IRC (#metal, #extempore, server irc.azzurra.org) e scrivo in alcuni forum, primi fra tutti quello della mia band (disponibile [http://extempore.altervista.org/phpBB2 qui]), quello di [http://www.giocoleria.org giocoleria.org] e quello di [http://www.italianpoi.eu italianpoi.eu] dove collaboro anche alla stesura della [http://inertia.altervista.org/doku.php WikiPOIdia].&lt;br /&gt;
&lt;br /&gt;
==Webmaster di==&lt;br /&gt;
* http://www.extempore.tk - Il sito ufficiale della mia band&lt;br /&gt;
* http://www.servizicontabiliefiscali.com - Studio contabile in Mestre (VE)&lt;br /&gt;
&lt;br /&gt;
Ora come ora non mi viene in mente altro, casomai aggiungerò altre info in seguito, ammesso che a qualcuno importi qualcosa! :)&lt;br /&gt;
&lt;br /&gt;
Ciao a tutti, ci becchiamo in aula!&lt;br /&gt;
&lt;br /&gt;
Stefano - SingInTime&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17666</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17666"/>
		<updated>2007-07-19T13:52:31Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Query by content */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. Due contorni melodici con pitch assoluto diverso ma con la medesima distribuzione di intervalli sono considerati percettivamente equivalenti (melodie trasposte).&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non sono sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti, ma non lo completano dal momento che tecniche esecutive diverse possono far generare al medesimo strumento timbri totalmente diversi (es. corda sfregata/martellata/pizzicata).&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione (diteggiatura, ornamenti, istruzioni dinamiche, etc). Tutta la partitura potrebbe essere inclusa in questo aspetto (le note stesse rappresentano istruzioni esecutive). Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale. Per realizzare questo approccio vengono solitamente usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17665</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17665"/>
		<updated>2007-07-19T13:43:29Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Editorial Facet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. Due contorni melodici con pitch assoluto diverso ma con la medesima distribuzione di intervalli sono considerati percettivamente equivalenti (melodie trasposte).&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non sono sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti, ma non lo completano dal momento che tecniche esecutive diverse possono far generare al medesimo strumento timbri totalmente diversi (es. corda sfregata/martellata/pizzicata).&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione (diteggiatura, ornamenti, istruzioni dinamiche, etc). Tutta la partitura potrebbe essere inclusa in questo aspetto (le note stesse rappresentano istruzioni esecutive). Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17664</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17664"/>
		<updated>2007-07-19T13:41:42Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Editorial Facet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. Due contorni melodici con pitch assoluto diverso ma con la medesima distribuzione di intervalli sono considerati percettivamente equivalenti (melodie trasposte).&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non sono sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti, ma non lo completano dal momento che tecniche esecutive diverse possono far generare al medesimo strumento timbri totalmente diversi (es. corda sfregata/martellata/pizzicata).&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione (diteggiatura, ornamenti, istruzioni dinamiche, etc). Tutta la partitura potrebe essere inclusa in questo aspetto (le note stesse rappresentano istruzioni esecutive). Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17663</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17663"/>
		<updated>2007-07-19T13:39:18Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Timbral Facet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. Due contorni melodici con pitch assoluto diverso ma con la medesima distribuzione di intervalli sono considerati percettivamente equivalenti (melodie trasposte).&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non sono sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti, ma non lo completano dal momento che tecniche esecutive diverse possono far generare al medesimo strumento timbri totalmente diversi (es. corda sfregata/martellata/pizzicata).&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione(diteggiatura, ornamenti, istruzioni dinamiche, etc). Anche la musica stessa può essere inclusa. Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17662</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17662"/>
		<updated>2007-07-19T13:35:23Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Harmonic Facet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. Due contorni melodici con pitch assoluto diverso ma con la medesima distribuzione di intervalli sono considerati percettivamente equivalenti (melodie trasposte).&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non sono sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione(diteggiatura, ornamenti, istruzioni dinamiche, etc). Anche la musica stessa può essere inclusa. Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17661</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17661"/>
		<updated>2007-07-19T13:33:56Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Pitch Facet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. Due contorni melodici con pitch assoluto diverso ma con la medesima distribuzione di intervalli sono considerati percettivamente equivalenti (melodie trasposte).&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione(diteggiatura, ornamenti, istruzioni dinamiche, etc). Anche la musica stessa può essere inclusa. Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17660</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17660"/>
		<updated>2007-07-19T13:31:30Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Pitch Facet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale (quinta giusta, terza minore...).&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale nel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione(diteggiatura, ornamenti, istruzioni dinamiche, etc). Anche la musica stessa può essere inclusa. Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17659</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17659"/>
		<updated>2007-07-19T13:28:47Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Sistemi informativi, basi di dati e DBMS==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
===Basi di dati e DBMS===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche dei DBMS===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione(diteggiatura, ornamenti, istruzioni dinamiche, etc). Anche la musica stessa può essere inclusa. Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17658</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17658"/>
		<updated>2007-07-18T18:06:41Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* =Editorial Facet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Basi di dati e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet====&lt;br /&gt;
Istruzioni sull’esecuzione(diteggiatura, ornamenti, istruzioni dinamiche, etc). Anche la musica stessa può essere inclusa. Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17657</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17657"/>
		<updated>2007-07-18T18:05:58Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Basi di dati e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter fornire al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
&lt;br /&gt;
===Descrizione dell'informazione musicale===&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti (Downie):&lt;br /&gt;
&lt;br /&gt;
====Pitch Facet====&lt;br /&gt;
Descrive la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
* note sul pentagramma&lt;br /&gt;
* nome (A, B, C...)&lt;br /&gt;
* pitch class number (0, 1, 2...)&lt;br /&gt;
* solfeggio (do, re, mi...)&lt;br /&gt;
&lt;br /&gt;
'''Intervallo:''' è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
&lt;br /&gt;
'''Melodia:''' insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
&lt;br /&gt;
'''Chiave:''' viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' il pattern degli intervalli.&lt;br /&gt;
&lt;br /&gt;
====Temporal Facet====&lt;br /&gt;
Descrive l'informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
# Metrica&lt;br /&gt;
# Indicatori di tempo&lt;br /&gt;
# Durata del pitch&lt;br /&gt;
# Accenti&lt;br /&gt;
# Durata armonica&lt;br /&gt;
&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano (questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato).&lt;br /&gt;
&lt;br /&gt;
'''Pause:''' possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
&lt;br /&gt;
L'informazione temporale può essere:&lt;br /&gt;
* Assoluta (metronomo ),&lt;br /&gt;
* Generale (adagio, forte ),&lt;br /&gt;
* Relativa (schneller, langsamer),&lt;br /&gt;
* Temporal distorsion (rubato, rallentando).&lt;br /&gt;
&lt;br /&gt;
====Harmonic Facet====&lt;br /&gt;
Quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia (caratteristica fondamentale della musica occidentale).&lt;br /&gt;
&lt;br /&gt;
Gli eventi armonici, sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
&lt;br /&gt;
====Timbral Facet====&lt;br /&gt;
Comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
&lt;br /&gt;
====Editorial Facet===&lt;br /&gt;
Istruzioni sull’esecuzione(diteggiatura, ornamenti, istruzioni dinamiche, etc). Anche la musica stessa può essere inclusa. Quasi sempre l'editorial facet non è codificato in maniera completa nella partitura, poiché viene completato dall'interpretazione personale dell'esecutore.&lt;br /&gt;
&lt;br /&gt;
====Textual Facet====&lt;br /&gt;
E' l'aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa, dal momento che potrebbero esserci più brani (o riarrangiamenti, o cover) che potrebbero far uso dello stesso testo.&lt;br /&gt;
&lt;br /&gt;
====Bibliographic Facet====&lt;br /&gt;
A questo campo appartengono tutti i '''metadati''', informazioni aggiuntive relative al brano ma non contenute intrinsecamente in esso. Sono informazioni relative a:&lt;br /&gt;
* titolo&lt;br /&gt;
* compositore&lt;br /&gt;
* arrangiatore&lt;br /&gt;
* editore&lt;br /&gt;
* numero di catalogo&lt;br /&gt;
* data pubblicazione&lt;br /&gt;
* esecutori&lt;br /&gt;
&lt;br /&gt;
===Progettazione di un MIR system===&lt;br /&gt;
Uno degli obiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
&lt;br /&gt;
Per la costruzione di un DB musicale vi sono tre passi:&lt;br /&gt;
# '''Individuare lo scopo dei dati'''. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
# '''Elencare i dati necessari''', considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copyright.&lt;br /&gt;
# '''Definire la miglior struttura''' per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni. Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi sono tre tipi di ricerca:&lt;br /&gt;
* '''Browsing:''' può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti.&lt;br /&gt;
* '''Textual search:''' indicizzazione di tutte le informazioni testuali accademiche (autore, titolo...) e non accademiche (genere, frammenti delle liriche...).&lt;br /&gt;
* '''Search by content:''' confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca. queste interrogazioni sono generalmente basate sulla melodia o altri aspetti del contenuto audio. servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia (informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
&lt;br /&gt;
'''Catalog information:''' sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
&lt;br /&gt;
'''Multimedia characteristics:''' sono metadadati che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
&lt;br /&gt;
===Valutazione della qualità===&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette (da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
&lt;br /&gt;
===Query by content=== &lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
* '''a frammenti tematici:''' contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale.&lt;br /&gt;
* '''database di intere partiture:''' sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
&lt;br /&gt;
'''Sequenze di note:''' ogni elemento della sequenza è descritto da qualche parametro (solitamente nome e durata della nota).&lt;br /&gt;
&lt;br /&gt;
'''Query-by-humming:''' il frammento musicale viene introdotto canticchiando o fischiettando la melodia da cercare. può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
&lt;br /&gt;
Gli approcci per questo metodo sono di due tipi: &lt;br /&gt;
* '''DSP:''' elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
* '''Simbolico:''' trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenze melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio (si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo discreto il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio (non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
&lt;br /&gt;
Vi sono dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
* '''Note segmentation:''' dove sono posizionate esattamente le note? Quanto durano?&lt;br /&gt;
* '''Pitch variation''' della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
* '''Note quantization:''' come posizionare le altezze sulle scale musicali?&lt;br /&gt;
&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze (di differenti ottave).&lt;br /&gt;
&lt;br /&gt;
A volte per ovviare a questi problemi, tutte le rappresentazioni della stessa nota vengono collassate in una sola. L’alfabeto di 12 elementi viene usato per rappresentare e dividere le altezze in semitoni, questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Si applicano poi degli algoritmi di trasposizione per calcolare la similarità, 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit.&lt;br /&gt;
&lt;br /&gt;
===Tecniche di conversione simbolica===&lt;br /&gt;
'''Sequenza d’intervalli:''' distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava. È dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
&lt;br /&gt;
'''Contorno melodico:''' si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to. Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibile individuare univocamente il brano cercato.&lt;br /&gt;
&lt;br /&gt;
'''Rappresentazione Frame-based:'''&lt;br /&gt;
Non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia. Il tempo viene diviso in frame di ugual misura, e viene stimato il valore di un pitch per ogni frame. Le note non sono esplicitamente descritte, in un unico valore sono rappresentabili le informazioni relative ad altezza e durata. Lo svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note. Ciò significa ottenere centinaia di brani simili, impossibili da ascoltare tutti per trovare quello corretto. Questo sistema è però utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
&lt;br /&gt;
===Criteri di similarità===&lt;br /&gt;
'''Classi di equivalenza:''' ogni simbolo rappresenta n intervalli. &lt;br /&gt;
* '''C1:''' ogni simbolo rappresenta un intervallo,&lt;br /&gt;
* '''C3:''' ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
* '''CU:''' tutti gli intervalli crescenti e decrescenti collassato in due differenti classi (contorno melodico ).&lt;br /&gt;
&lt;br /&gt;
'''Music psychology:''' c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, difatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando. Inoltre, non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando, in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.el caso di brani polifonici poi, bisogna definire come una sequenza di note sia riconosciuta dall’uomo come una melodia in mezzo alle altre voci.&lt;br /&gt;
&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
* '''memoria''', che può essere a breve o lungo termine,&lt;br /&gt;
* '''tipologia di utente''', che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
&lt;br /&gt;
'''String matching and melodic similarity:''' approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia ''f'' la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e ''s'' la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
* ''f'' è fattore di ''x''?&lt;br /&gt;
* se ''f'' non appare in ''x'', quale sottoparte di ''f'' è presente in ''s''?&lt;br /&gt;
* quante volte un’approssimazione di ''f'' è presente in ''s''?&lt;br /&gt;
&lt;br /&gt;
'''Blast algorithm:''' Basic Local Alignment Search Tool, uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze zone uguali o simili e allineamenti globali.&lt;br /&gt;
&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
* '''Identità percentuale:''' numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi.&lt;br /&gt;
* '''Conservazione:''' quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17656</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17656"/>
		<updated>2007-07-16T08:08:44Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Basi di dati e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello entità-associazione (ER)==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello entità-relazione''' è il modello concettuale più usato nella progettazione concettuale di una base di dati di tipo relazionale. E' dotato di un proprio diagramma, noto come '''diagramma ER''', che consente di rappresentare graficamente la struttura ad alto livello della base di dati. E' anche noto come '''modello entità-relazione''' (entity-relationship), ma useremo l'altra traduzione per non generare ambiguità con le caratteristiche del modello relazionale.&lt;br /&gt;
&lt;br /&gt;
Il modello entità-associazione si basa su tre concetti fondamentali: quello di '''entità''', di '''attributo''' e di '''associazione''' (o relazione).&lt;br /&gt;
&lt;br /&gt;
===Entità===&lt;br /&gt;
Un'entità è un oggetto nel mondo reale (concreto o astratto) che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un''''astrazione della realtà''' la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
&lt;br /&gt;
===Attributi===&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. Viene chiamata attributo la coppia ''&amp;lt;nome_di_attributo, dominio&amp;gt;'' e ogni entità è caratterizzata da uno o più attributi.&lt;br /&gt;
&lt;br /&gt;
Gli attributi possono essere monovalore (un solo valore memorizzato alla volta, es. l'età di una persona), multivalore (più valori possibili, es. gli esami sostenuti da uno studente) e compositi (es. un indirizzo, che è scomponibile iv via, n. civico, CAP e città).&lt;br /&gt;
&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
* '''Semplice''': sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
* '''Composti''': l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini di un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica.&lt;br /&gt;
 &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una '''chiave'''. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come '''chiave primaria'''. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli '''ovali''', e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei '''rettangoli'''.&lt;br /&gt;
&lt;br /&gt;
===Associazioni===&lt;br /&gt;
Un''''associazione''' mette in relazione fra loro due o più entità. Come per le entità si può raccogliere un gruppo di associazioni simili in un insieme di associazioni.&lt;br /&gt;
&lt;br /&gt;
Anche un'associazione può avere attributi che la descrivono, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante. Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
&lt;br /&gt;
Il '''ruolo''' è la funzione che un’istanza di entità esercita nell’ambito di un’associazione. Nel caso di un’associazione unaria il ruolo è sempre necessario (es. in un'associazione unaria che coinvolge due istanze dell'entità FILM, una avrà il ruolo di sequel e l'altra di &amp;quot;prequel&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17655</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17655"/>
		<updated>2007-07-16T07:29:57Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Basi di dati e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17654</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17654"/>
		<updated>2007-07-11T17:30:28Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Progettazione concettuale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Basi di dati e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
Le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare.&lt;br /&gt;
&lt;br /&gt;
Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
&lt;br /&gt;
===Progettazione logica===&lt;br /&gt;
Bisogna poi scegliere un DBMS per implementare il progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
&lt;br /&gt;
===Raffinamento dello schema===&lt;br /&gt;
Si analizza l’insieme di relazioni dello schema relazionale per identificare potenziali problemi e per rifinirlo.&lt;br /&gt;
&lt;br /&gt;
===Progettazione fisica della base di dati===&lt;br /&gt;
Si considerano i carichi di lavoro attesi che la nostra base di dati dovrà sopportare, e si raffina il progetto per garantire che esso soddisfi i criteri di prestazioni richieste.&lt;br /&gt;
&lt;br /&gt;
Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
&lt;br /&gt;
===Progettazione delle applicazioni e della sicurezza===&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17653</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17653"/>
		<updated>2007-07-11T17:24:57Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Basi di dati e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17652</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17652"/>
		<updated>2007-07-11T17:23:57Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Database e DBMS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Basi di dati e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17651</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17651"/>
		<updated>2007-07-11T17:21:15Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Database e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base di dati==&lt;br /&gt;
===Analisi dei requisiti===&lt;br /&gt;
Il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
&lt;br /&gt;
Per fare ciò vengono definite le caratteristiche della base di dati in maniera informale, mediante interviste con gli utenti,&lt;br /&gt;
analisi di altre basi di dati esistenti, normative, ambiente operativo ecc.&lt;br /&gt;
&lt;br /&gt;
L’output è un documento in linguaggio naturale di specifica dei requisiti, che si possono suddividere in alcune categorie principali:&lt;br /&gt;
* '''Requisiti informativi:''' caratteristiche e tipologie dei dati&lt;br /&gt;
* '''Requisiti sulle operazioni:''' esplicitati nel carico di lavoro&lt;br /&gt;
* '''Requisiti sui vincoli di integrità ed autorizzazione:''' proprietà da assicurare ai dati, in termini di correttezza e protezione&lt;br /&gt;
* '''Requisiti sulla popolosità della base di dati:''' volume dei dati&lt;br /&gt;
&lt;br /&gt;
===Progettazione concettuale===&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17650</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17650"/>
		<updated>2007-07-11T17:00:31Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Algebra relazionale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Database e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione &amp;lt;math&amp;gt;\sigma &amp;lt;/math&amp;gt;:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma ''attributo op costante'' oppure ''attributo1 op attributo2'', dove ''op'' è uno degli operatori di confronto ''&amp;lt;'',''&amp;lt;='',''='',''=&amp;gt;'',''&amp;gt;'',''!=''.&lt;br /&gt;
* '''Proiezione &amp;lt;math&amp;gt;\pi&amp;lt;/math&amp;gt;:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' ''R &amp;lt;math&amp;gt;\cup&amp;lt;/math&amp;gt; S'' restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione ''R'' oppure ''S''. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' ''R &amp;lt;math&amp;gt;\cap&amp;lt;/math&amp;gt; S'' restituisce un’istanza contenente tutte le tuple presenti sia in ''R'' che in ''S''&lt;br /&gt;
* '''Differenza:''' ''R - S'' restituisce un’istanza contenente tutte le tuple presenti in ''R'' ma non in ''S''. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a ''R''&lt;br /&gt;
* '''Prodotto cartesiano:''' ''R x S'' restituisce un’istanza di relazione il cui schema contiene tutti i campi di ''R'' seguiti da tutti i campi di ''S''. Il risultato di ''R x S'' contiene una tupla ''|r,s|''.&lt;br /&gt;
* '''Rinomina &amp;lt;math&amp;gt;\rho&amp;lt;/math&amp;gt;:''' usato per rinominare le tabelle.&lt;br /&gt;
* '''Join:''' usato per combinare informazioni da due o più relazioni. Un predicato di join esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
** '''Join condizionale:''' la versione più generale dell’operatore di join accetta una condizione di join ''c'' e un paio di istanze di relazione come argomenti, restituendo un’istanza di relazione.&lt;br /&gt;
** '''Equijoin:''' lo si ha quando la condizione di join consiste solamente di uguaglianze della forma ''R.nome1 = S.nome2''. In questo caso mantenere entrambi gli attributi sarebbe ridondante. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui ''S.nome2'' viene scartato. Lo schema del risultato di un equijoin contiene i campi di ''R'', seguiti dai campi di ''S'' che non appaiono condizioni di join.&lt;br /&gt;
** '''Join naturale:''' è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in ''R'' e ''S''. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome.&lt;br /&gt;
** '''Join esterni (pg99):''' questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL. La forma è ''R OUTER JOIN S''. Esistono diverse varianti dell’OUTER JOIN:&lt;br /&gt;
**# FULL: sia le tuple di ''R'' che quelle di ''S'' che non partecipano  al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# LEFT: le tuple di ''R'' che non partecipano al join vengono completate ed inserite nel risultato,&lt;br /&gt;
**# RIGHT: le tuple ''S'' che non partecipano al join vengono completate ed inserite nel risultato.&lt;br /&gt;
** '''Cross join:''' Corrisponde al prodotto cartesiano. La sua forma è ''R CROSS JOIN S''&lt;br /&gt;
* '''Divisione:''' l’operazione di divisione ''R / S'' è l’insieme di tutti valori di ''x'' (in forma di tuple unarie) tali che per ogni valore ''y'' in ''S'' ci sia una tupla ''|x,y|'' in ''R''. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti. Un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A. Le tuple interdette possono essere calcolate così: ''&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;((&amp;lt;math&amp;gt;\pi_x&amp;lt;/math&amp;gt;(A) x B) – A)''.&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Lo standard dei linguaggi SQL usa la parola table per indicare relazione.&lt;br /&gt;
CREATE TABLE, usato per definire una nuova tabella (CREATE TABLE Studenti )&lt;br /&gt;
CREATE TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	(&amp;lt; specifica colonna &amp;gt; [, &amp;lt; specifica colonna &amp;gt; ]);&lt;br /&gt;
&amp;lt; specifica colonna &amp;gt;, ha il seguente formato&lt;br /&gt;
&amp;lt; nome colonna &amp;gt; &amp;lt; dominio &amp;gt; [DEFAULT &amp;lt; valore default &amp;gt;]&lt;br /&gt;
dove &amp;lt; dominio &amp;gt; è il dominio della colonna, ed è uno dei tipi di dato SQL;&lt;br /&gt;
&amp;lt; valore default &amp;gt; è un valore del dominio, assunto dalle tuple se nessun valore è specificato per la colonna.&lt;br /&gt;
INSERT, usato per inserire le tuple&lt;br /&gt;
INSERT&lt;br /&gt;
INTO R [(C…C°)]&lt;br /&gt;
{VALUES (e…e°)| sq};&lt;br /&gt;
(e…e°) è una lista di valori da assegnare alla nuova tupla, questi sono assegnati in base ad una corrispondenza posizionale&lt;br /&gt;
sq, è una sub-query&lt;br /&gt;
le tuple generate come risposta alla sq vengono inserite nella relazione R&lt;br /&gt;
la clausola di proiezioni di sq deve contenere colonne compatibili con le colonne di R a cui si assegnano valori&lt;br /&gt;
il dominio della colonna C(i=1,…., n) deve essere compatibile con il dominio della colonna i-esima contenuta nella clausola di proiezione di SQL.&lt;br /&gt;
Tutte le colonne non esplicitamente elencate ricevono il valore nullo o il valore di default.&lt;br /&gt;
DELETE, usato per cancellare le tuple&lt;br /&gt;
DELETE&lt;br /&gt;
FROM  R[alias]&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può essere associato ad un alias se è necessario riferire a tuple di tale relazione una qualche sotto-interrogazione presente in F&lt;br /&gt;
se non viene specificata alcuna clausola di qualificazione vengono cancellate tutte le tuple.&lt;br /&gt;
UPDATE, usato per modificare i valori in una riga esistente&lt;br /&gt;
UPDATE R[alias]&lt;br /&gt;
SET C={e |NULL},…, C°={e° | NULL}&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può avere associato un alias se è necessario riferire tuple di tale relazione in una qualche sotto-interrogazione presente in F&lt;br /&gt;
C={e |NULL},…, C°={i=1 | NULL}, è un’espressione di assegnamento che specifica che alla colonna C, deve essere assegnato il valore dell’espressione e.&lt;br /&gt;
Questa può essere una costante, spesso funzione dei valori correnti delle tuple da modificare, o una sub-query&lt;br /&gt;
si può specificare che alla colonna sia assegnato il valore nullo.&lt;br /&gt;
&lt;br /&gt;
Per definire una chiave primaria in SQL viene usato il comando PRIMARY KEY, mentre per dichiarare un sottoinsieme delle colonne di una tabella si usa UNIQUE.&lt;br /&gt;
 La presenza di NULL in una chiave esterna non viola il vincolo di chiave. Il comando in SQL è FOREIGN KEY che ha delle opzioni aggiuntive, sul come comportarsi una volta implementata la chiave esterna. &lt;br /&gt;
	FOREIGN KEY(&amp;lt; lista nomi colonne &amp;gt;)&lt;br /&gt;
	REFERENCES &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	 [ON DELETE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
	[ ON UPDATE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
l’opzione predefinita è NO ACTION(l’azione deve essere ignorata).&lt;br /&gt;
CASCADE dice che se una riga viene cancellata, tutte le sue righe che la referenziano devono essere eliminate. Lo stesso vale per il caso di un UPDATE, dove l’aggiornamento viene propagato a ciascuna riga,&lt;br /&gt;
ON DELETE permette di specificare le azioni da eseguire nel caso di cancellazione di una tupla riferita tramite chiave esterna,&lt;br /&gt;
ON UPDATE permette di specificare le azioni da eseguire nel caso di modifica del valore di chiave di una tupla riferita tramite chiave esterna&lt;br /&gt;
Per default un vincolo viene verificato al termine di ogni istruzione SQL che potrebbe portare ad una violazione, e se questa ci fosse il comando viene rifiutato.&lt;br /&gt;
L’SQL permette di specificare che un vincolo sia in modalità DEFERRED o IMMEDIATE: SET CONSTRAINT vincolo DEFERRED.&lt;br /&gt;
Un’interrogazione di una base di dati relazionale è una domanda sui dati, e la risposta consiste in una nuova relazione contenente il risultato. Un esempio di query è:&lt;br /&gt;
	SELECT*&lt;br /&gt;
	FROM&lt;br /&gt;
	WHERE&lt;br /&gt;
*significa che vogliamo tutti i campi delle tuple che compongono il risultato.&lt;br /&gt;
Una vista è una tabella le cui righe non sono esplicitamente memorizzate nella base dati, ma sono calcolate quando necessario in base a una definizione di vista.&lt;br /&gt;
Questa può essere usata come in una tabella di base per definire nuove interrogazioni o viste.&lt;br /&gt;
DROP TABLE, per eliminare una tabella e la sua forma è:&lt;br /&gt;
		DROP TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
			{ RESTRICT | CASCADE };&lt;br /&gt;
se viene specificata l’opzione RESTRICT, la relazione viene cancellata solo se non è riferita da altri elementi dello schema della base di dati;&lt;br /&gt;
se viene specificata l’opzione CASCADE, la relazione e tutti gli elementi dello schema della base di dati che eventualmente la riferiscono vengono cancellati.&lt;br /&gt;
ALTER TABLE, modifica la struttura di una tabella esistente e la sua forma è:&lt;br /&gt;
		ALTER TABLE &amp;lt; nome relazione &amp;gt; &amp;lt; modifica &amp;gt;;&lt;br /&gt;
&amp;lt; modifica &amp;gt; è la modifica da effettuare, tra l’aggiunta di una nuova colonna, modifica di una colonna e l’eliminazione.&lt;br /&gt;
&lt;br /&gt;
SQL:I linguaggi di basi dati come SQL permettono all’utente di specificare per quali relazioni e quali attributi è necessario mantenere l’integrità referenziale( e le azioni da eseguire in caso di violazione). La forma base di un’interrogazione SQL è: &lt;br /&gt;
SELECT [DISTINCT] lista-select&lt;br /&gt;
FROM lista-from&lt;br /&gt;
WHERE qualificazione&lt;br /&gt;
Lista-select, è una lista di nomi di colonne delle tabelle nominate nella lista-from. I nomi di colonne possono avere come prefisso una variabile di range.&lt;br /&gt;
Lista-from, è una lista di nomi di tabelle. Un nome di tabella può essere seguito da una variabile di range(questa è utile quando lo stesso nome di tabella appare più volte nella lista-from).&lt;br /&gt;
Qualificazione, è una combinazione booleana di condizioni nella forma espressione op espressione, dove op è uno degli operatori di confronto.&lt;br /&gt;
Ogni interrogazione deve avere una clausola SELECT, che specifica le colonne da includere nel risultato, e una clausola FROM, che specifica un prodotto cartesiano di tabelle. La clausola opzionale WHERE specifica condizioni di selezione sulle tabelle menzionate nella clausola FROM.&lt;br /&gt;
Se omettiamo la parola chiave DISTINCT, otterremo una copia della riga (v,e), e la risposta sarebbe un multi-insieme di righe. &lt;br /&gt;
Il processo d’interrogazione di un DB consta in:&lt;br /&gt;
caricamento della lista di attributi;&lt;br /&gt;
scarto delle tuple che non soddisfano la qualificazione;&lt;br /&gt;
eliminazione degli attributi che non sono nella lista-from.&lt;br /&gt;
Un multi-insieme è un simile ad un insieme, nel senso che è una collezione non ordinata di elementi, ma possono esserci diverse copie, e il numero di copie è significativo: due multi-insiemi possono avere gli stessi elementi e tuttavia essere diversi, poiché il numero di copie dello stesso elemento è diverso.&lt;br /&gt;
Tipi numerici esatti:&lt;br /&gt;
INTEGER; la precisione di questo tipo di dato è espressa in numero di bit, a seconda della specifica implementazione di SQL,&lt;br /&gt;
SMALLINT; l’unico requisito è che la precisione di questo tipo di dato sia non maggiore della precisione del tipo di dato INTEGER. Questo viene usato per eventuali ottimizzazioni in quanto i valori richiedono minore spazio di memorizzazione,&lt;br /&gt;
BIGINT; l’unico requisito è che la precisione di questo tipo di dato sia non minore della precisione del tipo di dato INTEGER,&lt;br /&gt;
NUMERIC; caratterizzato da una precisione(numero totale di cifre) e una scala(numero di cifre dopo la virgola), il valore default per la precisione è 1 e per la scala è 0,&lt;br /&gt;
DECIMAL; simile a NUMERIC, ma la specifica di questo tipo di dato ha la forma: DECIMAL[(precisione[,scala])].&lt;br /&gt;
Tipi numerici approssimati:&lt;br /&gt;
REAL; rappresenta valori reali a singola precisione in virgola mobile, e la precisione dipende dalla specifica implementazione si SQL,&lt;br /&gt;
DOUBLE PRECISION; rappresenta valori reali a doppia precisione in virgola mobile, e questa dipende sempre dall’implementazione di SQL(però deve essere maggiore della precisione di tipo REAL),&lt;br /&gt;
FLOAT; rappresenta valori reali alla precisione desiderata, ed ha la forma FLOAT[(precisione)]. La precisione minima specificabile è 1.&lt;br /&gt;
Tipi di dato carattere:&lt;br /&gt;
CHARACTER; rappresenta stringhe di caratteri di lunghezza predefinita, spesso abbreviato in CHAR. La specifica ha il formato CHAR[(n)], con n lunghezza delle stringhe. E’ possibile usare come valore una stringa di lunghezza inferiore a n, che viene completata con spazi fino a raggiungere tale lunghezza,&lt;br /&gt;
CHARACTER VARYING; rappresenta stringhe di caratteri di lunghezza massima predefinita. Spesso abbreviato in VARCHART, e la sua forma è VARCHART(n), dove n è la lunghezza massima delle stringhe.&lt;br /&gt;
Tipi di dato temporali:&lt;br /&gt;
DATE; rappresenta le date espresse come anno(4cifre), mese(2cifre) e giorno(2cifre),&lt;br /&gt;
TIME; rappresenta i tempi espressi come ora(2cifre), minuto(2cifre) e secondo(2cifre),&lt;br /&gt;
TIMESTAMP; rappresenta una “concatenazione” fra DATE e TIME. Permette di rappresentare timestamp che consistono in: anno, mese, giorno, ora, minuto, secondo e microsecondo,&lt;br /&gt;
INTERVAL; rappresenta una durata temporale in riferimento ad uno o più qualificatori. I valori di questo tipo son rappresentati dalla parola chiave INTERVAL seguita da una stringa che esprime la durata in termini di uno o più qualificatori. Se sono presenti due qualificatori, il primo è più ampio del secondo e sono separati dalla parola chiave TO.&lt;br /&gt;
Tipo di dato:&lt;br /&gt;
BOOLEAN; i valori di tali tipo sono TRUE, FALSE, UNKNOWN(questo viene introdotto per la gestione dei confronti con valori nulli,&lt;br /&gt;
CHARACTER LARGE OBJECT(CLOB); permette di rappresentare sequenze di caratteri di elevate dimensioni,&lt;br /&gt;
BINARY LARGE OBJECT(BLOB); permette di rappresentare sequenze di bit di elevate dimensioni. &lt;br /&gt;
E’ possibile convertire un valore ad un altro tipo mediante l’operatore di CAST&lt;br /&gt;
		CAST (e) AS &amp;lt; tipo target &amp;gt;&lt;br /&gt;
AS: per introdurre una variabile di range.&lt;br /&gt;
I nomi delle tabelle possono essere implicitamente usati come variabili in linea. Si ha la necessità di introdurre esplicitamente le variabili di range solo quando la clausola FROM contiene più di una occorrenza di una relazione. Se una variabile di range è stata introdotta nella relazione, un nome di tabella non può essere usato come variabile di range esplicita.&lt;br /&gt;
Ogni elemento in una lista-select può essere della forma espressione AS nome_colonna ( questo è il nuovo nome che la colonna avrà nel risultato dell’interrogazione. Inoltre, ogni termine in una qualificazione può anche essere rappresentato nella forma generale espressione1 = espressione2.&lt;br /&gt;
L’SQL permette il pattern matching, su valori di tipo stringa, attraverso l’uso dell’operatore LIKE, insieme all’uso dei caratteri jolly %( zero o più caratteri qualunque) e ( esattamente un carattere qualunque). Quindi “AB%” denota una qualunque stringa che contiene almeno tre caratteri, con il secondo ed il terzo uguali a A e B.&lt;br /&gt;
SQL fornisce tre comandi per la manipolazione degli insiemi che estendono la forma d’interrogazione basilare, e sono:&lt;br /&gt;
UNION, restituisce tutte le tuple distinte restituite da almeno una delle sotto-interrogazioni a cui è applicato. Se si usa la clausola ORDER BY, questa deve essere usata una sola volta alla fine dell’interrogazione e non alla fine di ogni SELECT,&lt;br /&gt;
INTERSECT, corrisponde all’intersezione, restituisce le tuple restituite da entrambe le sotto interrogazioni a cui è applicato.&lt;br /&gt;
EXCEPT, corrisponde alla differenza, e restituisce le tuple della seconda sotto-interrogazione a cui è applicato.&lt;br /&gt;
Questo linguaggio fornisce anche altre operazioni sugli insiemi:&lt;br /&gt;
IN, per controllare se un elemento è in un dato insieme. C IN(v,….v°), nella forma negata C NOT IN(v,….v°).&lt;br /&gt;
ANY&lt;br /&gt;
ALL, per confrontare un valore con gli elementi di un dato insieme, usando l’operatore di confronto op&lt;br /&gt;
EXISTS, per controllare se un insieme è vuoto.&lt;br /&gt;
BETWEEN, permette di determinare le tuple che contengono in un dato attributo valori in un intervallo dato. C BETWEEN v AND v° , nella forma negata invece C NOT BETWEEN v AND v°,&lt;br /&gt;
ABS(N); calcola il valore assoluto del valore numerico N,&lt;br /&gt;
MOD(n,b); calcola il resto intero della divisione n per b.&lt;br /&gt;
UNION, INTERSECT ed EXCEPT possono essere usati su qualsiasi coppia di tabelle che siano compatibili rispetto all’unione, cioè che abbiamo lo stesso numero e tipo di colonne.&lt;br /&gt;
Nel caso si UNION i duplicati vengono eliminati automaticamente. Per mantenerli è necessario aggiungere ALL (UNION ALL). Lo stesso discorso vale per INTERSECT ed EXCEPT.&lt;br /&gt;
Espressioni e funzioni: un’espressione usata nella clausola di proiezione di un’interrogazione, dà luogo ad una colonna, detta virtuale, non presente nella relazione su cui si effettua l’interrogazione.&lt;br /&gt;
Le colonne virtuali non sono fisicamente memorizzate, ma sono calcolate dinamicamente come risultato dell’esecuzione dell’interrogazione. &lt;br /&gt;
Espressioni e funzioni per stringhe:&lt;br /&gt;
Operatore di concatenazione denotato da ||,&lt;br /&gt;
LENGHT(str), restituisce la lunghezza della stringa str, in numero di caratteri,&lt;br /&gt;
UPPER(str) e LOWER(str), trasformano la stringa str in caratteri tutti maiuscoli o tutti minuscoli, rispettivamente,&lt;br /&gt;
SUBSTR(str, m,[n]), estrae dalla stringa str la sottostringa dal carattere di posizione m per una lunghezza n,&lt;br /&gt;
TRIM[str°] FROM str, elimina dalla stringa str° i caratteri in str.&lt;br /&gt;
Un’interrogazione annidata è un’interrogazione che al suo interno ha un’altra interrogazione. Questa solitamente appare nella clausola WHERE, o anche in FROM o HAVING. Se una sub-query scalare restituisce più di una tupla si genera un errore di run-time, e se nessuna tupla verifica la sotto-interrogazione, viene restituito il valore NULL.&lt;br /&gt;
E’ anche possibile selezionare più di una colonna tramite sotto-interrogazioni, in tal caso è necessario apporre delle parentesi alla lista delle colonne a sinistra dell’operatore di confronto. Ad esempio, voglio elencare gli impiegati con la stessa mansione di Martini;&lt;br /&gt;
		SELECT Nome FROM Impiegati&lt;br /&gt;
		WHERE(Mansione, Stipendio) = (SELECT&lt;br /&gt;
			Mansione, Stipendio FROM Impiegati&lt;br /&gt;
				WHERE Nome = “Martini”);&lt;br /&gt;
Una sub-query può contenere a sua volta un’altra sub-query. E’ possibile definire sotto-interrogazioni che sono eseguite ripetutamente per ogni tupla candidata considerata nella valutazione dell’interrogazione esterna, e ogni volta che questa considera una tupla candidata, deve invocare la sotto-interrogazione. Questo tipo viene chiamato correlato, dato che ogni esecuzione è correlata al valore di uno o più attributi delle tuple candidate nell’interrogazione principale. Per poter fare riferimento alle colonne delle tuple candidate nell’interrogazione esterna si fa uso degli alias di relazione(questo è definito nell’interrogazione esterna e riferito nella sotto-interrogazione correlata. Sono utili quando si vuole fare riferimento a due diverse tuple della stessa relazione.).&lt;br /&gt;
UNIQUE, quando applichiamo questo comando ad una sotto-interrogazione, la condizione che ne risulta ritorna vero se  nessuna riga appare due volte nella risposta all’interrogazione, se non ci sono duplicati. Ritorna vero se la risposta è vuota.&lt;br /&gt;
Operatori di aggregazione:&lt;br /&gt;
COUNT ([DISTINCT] A) , è numero di valori unici della colonna A,&lt;br /&gt;
SUM ([DISTINCT] A) , la somma di tutti i valori unici nella colonna A,&lt;br /&gt;
AVG ([DISTINCT] A) , la media di tutti i valori unici nella colonna A,&lt;br /&gt;
MAX (A) , il valore massimo della colonna A,&lt;br /&gt;
MIN (A) , il valore minimo della colonna A.&lt;br /&gt;
Non ha senso specificare DISTINCT insieme a MIN e MAX.&lt;br /&gt;
Le clausole GROUP BY e HAVING;&lt;br /&gt;
		SELECT [DISTINCT]  lista-select&lt;br /&gt;
		FROM lista-from&lt;br /&gt;
		WHERE qualificazione&lt;br /&gt;
		GROUP BY lista gruppo&lt;br /&gt;
		HAVING  qualificazione gruppo.&lt;br /&gt;
La lista-select consiste di una lista di nomi di colonne e una lista di termini della forma aggop(nome-colonna) AS nuovo-nome. Ogni colonna che appare nella lista dei nomi deve apparire nella lista-gruppo.&lt;br /&gt;
Le espressioni che compaiono nella qualificazione gruppo della clausola HAVING devono avere un singolo valore per gruppo. L’idea di base è che la clausola HAVING         ( può essere una combinazione Booleana di predicati, i quali tuttavia possono solo coinvolger funzioni di gruppo) determina se per ogni gruppo dato debba essere generata una riga della risposta.&lt;br /&gt;
Un’importante restrizione ci dice che una clausola di protezione di una query contenente GROUP BY può includere solamente:&lt;br /&gt;
una o più colonne tra le colonne che compaiono nella suddetta clausola,&lt;br /&gt;
funzioni di gruppo(che possono apparire in funzioni aritmetiche).&lt;br /&gt;
Le funzioni di gruppo permettono di estrarre informazioni da gruppi di tuple invece di una relazione, queste si basano su due concetti:&lt;br /&gt;
il partizionamento delle tuple di un relazione in base al valore di uno o più colonne della relazione,&lt;br /&gt;
il calcolo della funzione di gruppo per ogni gruppo ottenuto col partizionamento. &lt;br /&gt;
Una funzione di gruppo ha come argomento una colonna e si applica all’insieme dei valori di questa colonna, estratti dalle tuple che appartengono allo stesso gruppo.&lt;br /&gt;
E’ possibile applicare queste funzioni senza partizionamento e in tal caso saranno applicate ad un unico gruppo contente tutte le tuple della relazione.&lt;br /&gt;
Se GROUP BY viene omesso l’intera tabella viene vista come un singolo gruppo&lt;br /&gt;
COUNT, se questo non include DISTINCT, allora COUNT(*) dà la stessa risposta di COUNT(x), dove x è un qualunque insieme di attributi.&lt;br /&gt;
L’SQL fornisce un valore di colonna speciale chiamato null da usare quando il valore della colonna è sconosciuto oppure inapplicabile.&lt;br /&gt;
Possiamo impedire l’uso dei valori null specificando NOT NULL come parte della definizione dei campi. Inoltre i campi in una chiave primaria non posso assumere valori null, quindi vi è un vincolo di NOT NULL, implicito per ogni campo elencato in un vincolo di PRIMARY KEY.&lt;br /&gt;
Si può specificare vincoli sulla tabella usando vincoli di tabella, che hanno la forma CHECK espressione-condizionale.&lt;br /&gt;
In un comando CREATE TABLE, la clausola CHECK può comparire;&lt;br /&gt;
di seguito alla definizione di una colonna ( vincoli di CHECK su colonna )&lt;br /&gt;
come clausola separata dall’interno della definizione della relazione ( vincoli CHECK su relazione ).&lt;br /&gt;
Specificando un vincolo CHECK vogliamo che ogni tupla nella relazione soddisfi la condizione. E’ consigliabile esprimere tramite CHECK solo le condizioni che devono essere verificate da ogni singola tupla della relazione cui associamo il vincolo.&lt;br /&gt;
E’ possibile assegnare nome ai vincoli associati alle definizioni di relazione facendo seguire la specifica del vincolo nella parola chiave CONSTRAINT e dal nome. Difetti specificare un nome per tutti i vincoli è utile per potersi poi riferire ad essi.&lt;br /&gt;
Le asserzioni servono per esprimere vincoli di integrità che coinvolgono più tuple o relazioni, e vengono così formulate:&lt;br /&gt;
		CREATE ASSERTION &amp;lt; nome asserzione &amp;gt;&lt;br /&gt;
		CHECK(&amp;lt; condizione &amp;gt;).&lt;br /&gt;
I vincoli di una tabella sono associati ad una tabella singola. Il soddisfacimento di questi vincoli è richiesto solo se la tabella associata è vuota, quando un vincolo coinvolge due o più tabelle, il meccanismo di vincoli sulle tabelle è in qualche modo anomalo, e non ciò che si desidera.&lt;br /&gt;
Un trigger è una procedura che viene eseguita dal DBMS in risposta a specifici cambiamenti nella base di dati ed è definita dal DBA. Questi son divisi in tre parti:&lt;br /&gt;
evento: un cambiamento nella base di dati che attiva il trigger;&lt;br /&gt;
condizione: un’interrogazione o un test che viene eseguito quando il trigger è attivato;&lt;br /&gt;
azione; procedura che viene eseguita quando il trigger è attivato e la sua condizione è verificata.&lt;br /&gt;
Una condizione di trigger può essere un comando vero/falso oppure un’interrogazione. Questa viene interpretata come vero se l’insieme di risposta non è vuoto, falso se l’opposto. L’azione di un trigger può esaminare la risposta all’interrogazione nella parte condizionale dei trigger , fare riferimento a valori vecchi e nuovi delle tuple modificate dal comando che ha attivato il trigger, eseguire nuove interrogazioni e apportare cambiamenti alla base di dati.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base dati==&lt;br /&gt;
1)Analisi dei requisiti: il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni  devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
2)Progettazione concettuale della base di dati: le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare. Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
3)Progettazione logica della base dati:  dobbiamo scegliere un DBMS per implementare in nostro progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
4)Raffinamento dello schema: analizzare l’insieme di relazioni del nostro schema relazionale per identificare potenziali problemi, e a rifinirlo.&lt;br /&gt;
5)Progettazione fisica della base di dati: consideriamo i carichi di lavoro attesi che la nostra base di dati dovrò sopportare, e raffiniamo il progetto per garantire che esso soddisfi i criteri di prestazioni richieste. Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
6)Progettazione delle applicazioni e della sicurezza.&lt;br /&gt;
Una entità è un oggetto nel mondo reale che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un’astrazione della realtà la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. La coppia (nome_di_attributo, dominio) viene chiamata attributo e ogni entità è caratterizzata da uno o più attributi(i quali possono essere monovalore, multivalore e compositi).&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
semplice, sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
composti, l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini i un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica. &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una chiave. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come chiave primaria. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli ovali, e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei rettangoli.&lt;br /&gt;
Una relazione è un’associazione tra due o più entità.&lt;br /&gt;
Come per le entità potremmo voler raccogliere un gruppo di relazioni simili in un insieme di relazioni. Questo può essere visto come un insieme di n-tuple:&lt;br /&gt;
{( e1,… en)  E1,…,en   En}&lt;br /&gt;
Ciascuna n-tupla denota una relazione che coinvolge n entità, da e1 a en, dove l’entità ei appartiene all’insieme di entità Ei.&lt;br /&gt;
Una relazione può anche avere attributi descrittivi, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante.&lt;br /&gt;
Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
Ruolo, è la funzione che un’istanza di entità esercita nell’ambito di un’associazione, e nel caso di un’associazione unaria il ruolo è sempre necessario.&lt;br /&gt;
Il modello ER offre costrutti per definire: &lt;br /&gt;
vincoli di cardinalità, sia per associazioni che per attributi. Questi si dividono in cardinalità minima( numero minimo d’istanze di un’associazione a cui le istanze delle entità coinvolte nell’associazione possono partecipare) e cardinalità massima( numero massimo di un’associazione a cui le istanze dell’entità coinvolte nell’associazione posso partecipare).&lt;br /&gt;
Data un’entità E ed un’associazione A: &lt;br /&gt;
i.c_max=1, ogni istanza di E può partecipare a non più di un’istanza di A,&lt;br /&gt;
ii.c_max=c_min=1, ogni istanza i E partecipa ad una ed una sola istanza di A,&lt;br /&gt;
iii.c_min=0, c_max=n, ogni istanza di E può partecipare ad un numero qualsiasi di istanze di A, anche nessuna.&lt;br /&gt;
vincoli d’identificazione, per entità. Identificatori per un’entità: insieme di attributi e/o entità che identificano le istanze dell’entità. Un identificatore è minimale se qualsiasi sottoinsieme proprio non è un identificatore. Le entità deboli ha  sempre cardinalità(1,1) rispetto all’associazione attraverso cui avviene l’dentificazione.&lt;br /&gt;
Uno a uno: se c_max di E e di E°, rispetto ad A è 1;&lt;br /&gt;
Uno a molti: se c_max di E rispetto ad A è n e c_max di E° rispetto ad A è 1, o viceversa. Un impiegato può essere associato a molti altri reparti.&lt;br /&gt;
Molti a molti: l’insieme di relazioni Lavora_in, in cui un impiegato può lavorare in diversi reparti e ogni reparto può avere diversi impiegati.&lt;br /&gt;
Insieme di entità deboli: se c_max di E e di E°, rispetto ad A è n. Questa viene identificata univocamente solo considerando alcuni attributi in congiunzione con la chiave primaria di un’altra entità, che è chiamata  proprietario identificante. Devono valere queste condizioni:&lt;br /&gt;
l’insieme di entità proprietarie e l’insieme di entità deboli devono partecipare in un insieme di relazioni uno-a-molti. Questo insieme di relazioni è chiamato insieme di relazioni identificanti dell’insieme di relazioni deboli&lt;br /&gt;
l’insieme di entità deboli deve aver partecipazione totale nell’insieme di relazioni identificanti.&lt;br /&gt;
Per identificare che si ha un’entità debole si usa un tratto più spesso.                  &lt;br /&gt;
Mentre per indicare che si ha una chiave parziale si userà una sottolineatura a tratti. &lt;br /&gt;
La specializzazione è il processo con cui s’individuano sottoinsiemi di un insieme di entità(la superclasse) che condividono alcune caratteristiche distintive. Tipicamente, la superclasse viene definita per prima,poi le sottoclassi, ed infine si aggiungono gli attributi specifici e gli insiemi di relazioni.&lt;br /&gt;
La generalizzazione consiste nell’identificare alcune caratteristiche comuni a una collezione di insiemi di entità e creare un nuovo insieme di entità che contiene quelle entità che possiedono caratteristiche comuni. Le sottoclassi si definiscono per prime, poi le superclassi, e poi si aggiungono tutti gli insiemi di relazioni che coinvolgono la superclasse.&lt;br /&gt;
I vincoli di disgiunzione determinano se a due sottoclassi è premesso contenere la stessa identità.&lt;br /&gt;
I vincoli di copertura determinano se le entità di una sottoclasse includono, nel loro complesso tutte le entità della superclasse.&lt;br /&gt;
L’aggregazione ci permette di indicare che un insieme di relazioni partecipa in un altro insieme di relazioni. Ciò viene illustrato con un riquadro tratteggiato intorno all’insieme di relazioni.&lt;br /&gt;
L’uso di un modello di dati semantico di alto livello offre nella progettazione concettuale il vantaggio addizionale che il progetto ad alto livello può essere rappresentato con diagrammi e facilmente compreso dalle molte persone che devono fornire informazioni utili al processo progettuale.&lt;br /&gt;
L’approccio normale consta nel considerare le necessità dei vari gruppo di utenti, risolvere i conflitti e generare un singolo insieme di requisiti. Un altro tipo di approccio consiste nello sviluppare schemi concettuali separati per i diversi gruppi di utenza, per poi integrarli. Per fare ciò si deve stabilire le corrispondenze tra le entità, le relazioni e gli attributi, e risolvere diversi tipi di conflitti.&lt;br /&gt;
&lt;br /&gt;
Un insieme di entità è tradotto in una relazione in maniera molto semplice: ogni attributo di un insieme di entità diventa un attributo della tabella.&lt;br /&gt;
Per rappresentare una relazione, dobbiamo potere identificare ciascuna entità partecipante, e dare valori agli attributi descrittivi della relazione, quindi:&lt;br /&gt;
gli attributi della chiave primaria di ciascun insieme di entità partecipante, come campi di chiavi esterne&lt;br /&gt;
gli attributi descrittivi dell’insieme di relazioni.&lt;br /&gt;
Se un insieme di relazioni coinvolge n insiemi di entità, e m di essi sono collegati con frecce ne diagramma ER, la chiave per ciascuno di questi m insiemi costituisce una chiave per la relazione in cui l’insieme è tradotto. Quindi abbiamo m  chiavi candidate, e una di queste dovrebbe essere scelta come chiave primaria.&lt;br /&gt;
Un secondo approccio per tradurre un insieme di relazioni con vincoli di chiave si rivela spesso migliore, perché evita di creare una tabella distinta per l’insieme di relazioni.&lt;br /&gt;
L’idea è di includere le informazioni sull’insieme di relazioni nella tabella corrispondente all’insieme di entità con la chiave, sfruttando il vincolo di chiave.&lt;br /&gt;
Lo svantaggio in questo è che potrebbe esserci uno spreco di spazio. In tal caso i campi aggiunti dovrebbero essere riempiti con valori null. La prima traduzione evita questa inefficienza, ma alcune interrogazioni importanti richiedono di combinare informazioni da due relazioni, il che può essere un operazione lenta.&lt;br /&gt;
Un insieme di entità deboli partecipa sempre in una relazione binaria uno-a-molti e ha vincoli di chiave e di partecipazione totale. Questa ha solo una chiave parziale, e quando un’entità proprietaria viene cancellata, vogliamo che vengano eliminate anche le entità deboli collegate.&lt;br /&gt;
&lt;br /&gt;
==PROGETTAZIONE CONCETTUALE==&lt;br /&gt;
&lt;br /&gt;
La progettazione concettuale di una base di dati ci fornisce un insieme di schemi di relazione e VI che possono essere considerati un buon punto di partenza per il progetto finale. Permette di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale.&lt;br /&gt;
Presentiamo ora una panoramica sui problemi che il raffinamento degli schemi intendo risolvere:&lt;br /&gt;
problemi causati dalla ridondanza: memorizzare la stessa informazione in maniera ridondante, cioè in diversi posti all’interno della stessa base di dati può portare a diversi problemi: &lt;br /&gt;
memorizzazione ridondante;&lt;br /&gt;
anomalie da aggiornamento, se una coppia di questi dati ripetuti viene aggiornata si crea un’inconsistenza, a meno di aggiornare anche tutte le altre copie;&lt;br /&gt;
anomalie da inserimento, potrebbe non essere possibile registrare certe informazioni, a meno di inserire anche qualche altra informazione non correlata;&lt;br /&gt;
anomalie di cancellazione.&lt;br /&gt;
Idealmente vorremmo degli schemi che non permettano ridondanza, ma quanto meno vogliamo poter identificare gli schemi che lo permettono:&lt;br /&gt;
valori null: questi non possono fornire una soluzione completa, ma possono aiutare. Questi valori possono essere utili per le anomalie da inserimento e cancellazione.&lt;br /&gt;
decomposizione, la ridondanza nasce quando uno schema relazionale forza una associazione tra attributi che non è naturale. Le dipendenze funzionali possono essere usate per identificare tali situazioni e per suggerire raffinamenti dello schema. Molti problemi che nascono dalla ridondanza possono essere risolti sostituendo una relazione con una collezione di relazioni “più piccolo”. Una decomposizione di uno schema di relazione r consiste nella sostituzione della schema di relazione con due(o più) schemi di relazione ciascuno dei quali contiene un sottoinsieme di attributi di R, e la cui unione include tutti tali attributi. Noi vogliamo memorizzare le informazioni in ogni data istanza di r memorizzandone le proiezioni. Se non si sta attenti con la decomposizione si possono creare più problemi di quanti se ne vogliano.&lt;br /&gt;
 la proprietà senza perdita(lossless join) ci permette di recuperare qualunque istanza di una relazione decomposta a partire dalle corrispondenti istanze delle relazioni componenti tramite operazioni di join;&lt;br /&gt;
la proprietà di  conservazione delle dipendenze ci consente di mantenere qualunque vincolo della relazione originaria semplicemente imponendo alcuni vincoli su ciascuna delle relazioni componenti. Ossia non abbiamo bisogno di effettuare join delle relazioni più piccolo per controllare se viene violato un vincolo della relazione originale.&lt;br /&gt;
La decomposizione  potrebbe migliorare le prestazioni, nel caso in cui la maggior parte delle interrogazioni degli aggiornamenti  esaminano solo una delle relazioni componenti, che è più piccola della relazione originale.&lt;br /&gt;
Dipendenze funzionali: DF è un tipo di VI che generalizza il concetto di chiave. Sia R uno schema di relazione e siano X e Y insiemi non vuoti di attributi di R, diciamo che un’istanza r di R soddisfa la DF X  Y (si  legge X determina funzionalmente Y, o X determina Y) se per ogni coppia di tuple t1 e t2 in r vale al seguente:&lt;br /&gt;
se t1.X  =  t2.X , allora  t1.Y = t2.Y&lt;br /&gt;
Una DF  X  Y essenzialmente dice che se due tuple coincidono sui valori dell’attributo X, devono anche avere lo stesso valore per l’attributo Y.&lt;br /&gt;
Un’istanza legale di una relazione soddisfare tutti i VI specificati. Quindi guardando l’istanza di una relazione, potremmo essere in grado di dire che una certa DF non è valida, però non possiamo mai dedurre che una DF è valida solo guardando una o più istanza di una relazione, perché una DF, diversamente da un VI, è un’affermazione su tutte le possibili istanze legali di una relazione.&lt;br /&gt;
La definizione di una DF non richiede che l’insieme X sia minimale: l’ulteriore condizione di minimalità deve essere soddisfatta perché X sia una chiave. Se vale X  Y, dove Y  è l’insieme di tutti gli attributi, ed esiste qualche sottoinsieme X di  tale che V  Y, allora X è una superchiave.&lt;br /&gt;
Diciamo che una DF f è implicata da un dato insieme F di DF se f vale su ogni istanza di relazione che soddisfa tutte le dipendenze in F, f vale ogni volta che tutte le DF valgono in F.  &lt;br /&gt;
Chiusura di un insieme di DF, l’insieme di tutte le DF implicate in un dato insieme F di DF è detto chiusura di F, denotato come F+. Come possiamo inferire(calcolare la chiusura di un dato insieme)?&lt;br /&gt;
Con gli Assiomi si Armstrong, i quali possono essere applicati per inferire tute le DF implicate da un insieme F di DF.&lt;br /&gt;
riflessività, se X  Y, allora X  Y;&lt;br /&gt;
aumento, se X  Y allora XZ  YZ per ogni Z;&lt;br /&gt;
transitività, se X  Y e Y  X, allora X  Z.&lt;br /&gt;
Teorema 1  gli assiomi di Armstrong sono corretti, nel senso che generano solo DF in F+ quando sono applicati a un insieme F di DF. Sono anche completi, nel senso che ripetute applicazioni di queste regole generano tutte le DF nella chiusura F+.&lt;br /&gt;
Quando si parla di F+ conviene usare alcune regole addizionali:&lt;br /&gt;
unione: se X  Y e X  Z, allora X  YZ;&lt;br /&gt;
decomposizione: se X  YZ, allora X  Y e X  Z.&lt;br /&gt;
in una DF banale, la parte destra contiene solo attributi che appaiono anche nella parte sinistra; tali dipendenze valgono sempre per via della riflessività. Usando questa possiamo generare tutte le dipendenze banali, che hanno la forma:&lt;br /&gt;
X  Y, dove Y  X, X  ABC e Y  ABC.&lt;br /&gt;
Dalla transitività otteniamo A  C. &lt;br /&gt;
Dall’aumento otteniamo le dipendenze non banali:&lt;br /&gt;
AC  BC, AB  AC, AB  CB.&lt;br /&gt;
Chiusura degli attributi, se volgiamo controllare se una data dipendenza, diciamo X  Y, è nella chiusura di un insieme F di DF, possiamo farlo in maniera efficiente senza calcolare la chiusura stessa.&lt;br /&gt;
Prima troviamo la chiusura degli attributi X+ rispetto a F, che è l’insieme degli attributi A tali che X  A può essere derivata usando gli Assiomi di Armstrong. Questo è l’algoritmo di calcolo:&lt;br /&gt;
		chiusura = X;&lt;br /&gt;
		ripeti fin quando non ci sono più cambiamenti: {&lt;br /&gt;
			se c’è una DF U  V in F tale che U  chiusura,&lt;br /&gt;
				allora chiusura = chiusura  V&lt;br /&gt;
			}&lt;br /&gt;
Teorema 2 l’algoritmo mostrato calcola la chiusura dell’insieme X di attributi rispetto all’insieme F delle DF.&lt;br /&gt;
Forme normali,  dato uno schema di relazione, abbiamo bisogno di decidere se esso sia un buon progetto o se c’è necessità di decomporlo in relazioni più piccole. Una tale decisione deve essere guidata dalla comprensione di quali problemi sono presenti nello schema corrente.&lt;br /&gt;
Le forme normali basate su DF sono la prima forma normale (1NF), la seconda(2NF), la terza(3NF) e la forma normale di Boyce-Codd(BCNF).&lt;br /&gt;
Una relazione è nella 1NF se ogni campo contiene solo valori atomici, cioè niente liste o insiemi. La 2NF ha un interesse storico. La 3NF e la BCNF sono importanti dal punto di vista della progettazione di una base di dati.&lt;br /&gt;
forma normale di Boyce-Codd, sia R uno schema di relazione, F sia l’insieme delle DF date su R, X sia un sottoinsieme degli attributi di R, e A un attributo di R. R è nella BCNF se per ogni DF X  A in F vale una delle seguenti asserzioni: &lt;br /&gt;
A  X, cioè è una DF banale,&lt;br /&gt;
X è una superchiave.&lt;br /&gt;
In una relazione in BCNF le sole dipendenze non banali sono   quelle in cui una chiave determina alcuni attributi. Perciò ogni tupla può essere vista come un’entità o relazione, identificata da una chiave e descritta dai restanti attributi. &lt;br /&gt;
La BCNF assicura che nessuna ridondanza può essere rilevata usando solo le informazioni delle DF. Quindi è la più desiderabile delle forme normali, se prendiamo in considerazione solo le informazioni delle DF.&lt;br /&gt;
Se X è una chiave, allora y1=y2, il che significa ce le due tuple sono identiche. Poiché una relazione è definita come un insieme di tuple, non possiamo avere due copie della stessa tupla.&lt;br /&gt;
Se una relazione è in BCNF, ogni campo di ciascuna tupla registra una parte d’informazione che non può essere dedotta dall’istanza della relazione.&lt;br /&gt;
terza forma normale, sia R uno schema di relazione, F l’insieme delle DF date su R, X un sottoinsieme degli attributi di R, e A un attributo di R. R è in 3NF se per ogni DF X  A in F vale:&lt;br /&gt;
A  X, cioè è una DF banale&lt;br /&gt;
X è una superchiave&lt;br /&gt;
A fa parte di una chiave di R.&lt;br /&gt;
Supponiamo che una dipendenza X  A provochi una violazione della 3NF, sono possibili due casi:&lt;br /&gt;
1)X è un  sottoinsieme proprio di qualche chiave K. Questa viene chiamata dipendenza parziale e viene memorizzato la coppia (X,A) in maniera ridondante.&lt;br /&gt;
2)X non è un sottoinsieme proprio di una chiave. Una tale dipendenza è a volte chiamata dipendenza transitiva, perché significa che abbiamo una catena di dipendenze K   X  A. Il problema è che non possiamo associare un valore X con un valore K a meno di associare anche un valore A con un valore X.&lt;br /&gt;
Nella 3NF è possibile qualche ridondanza. I problemi associati alle dipendenze parziali e transitive persistono se c’è una dipendenza non banale X  A e X non è una superchiave, anche se la relazione è nella forma 3NF perché A è parte di una chiave.&lt;br /&gt;
Proprietà delle decomposizioni;&lt;br /&gt;
- decomposizioni senza perdita, sia R uno schema di relazione e sia F un insieme di DF su R: una decomposizione di R in due schemi con insiemi di attributi X e Y si dice decomposizione senza perdita rispetto a F se per ogni istanza r di R che soddisfa le dipendenze in F, x(r) &amp;gt;&amp;lt; y ( r ) = r. Possiamo tornare alla relazione originale a partire dalle relazioni della decomposizione.&lt;br /&gt;
Tutte le decomposizioni usate per eliminare la ridondanza devono essere senza perdita d’informazione.&lt;br /&gt;
Teorema 3 sia R una relazione e F un insieme di DF che valgono su R. la decomposizione di R in due relazioni con insiemi di attributi R1 e R2 è senza perdita d’informazione se e solo se F+ contiene la DF R1R2 R1 oppure la DF R1R2 R2.   &lt;br /&gt;
- decomposizione con conservazione delle dipendenze, permette di applicare tutte le DF esaminando una singola istanza di relazione su ciascun inserimento o modifica di una tupla.&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&lt;br /&gt;
L’uso di comandi SQL in un programma scritto in un linguaggio ospite è chiamato SQL incapsulato, o embedded SQL. &lt;br /&gt;
I comandi SQL possono essere usati nel linguaggio ospite ovunque sia permesso. Ogni variabile del compilatore di quel linguaggio, usata per passare argomenti ad un comando SQL, deve essere dichiarata in SQL.&lt;br /&gt;
Devono essere dichiarate alcune variabili speciali del linguaggio ospite. Vi sono due complicazione di cui tener conto:&lt;br /&gt;
i tipi di dati riconosciuti da SQL potrebbero non essere riconosciuti dal linguaggio ospite, e viceversa,&lt;br /&gt;
SQL è orientato agli insiemi, quindi si passa all’uso dei cursori. I comandi operano su tabelle e producono tabelle, cioè insiemi.&lt;br /&gt;
I comandi possono far riferimento a variabili definite nel programma ospite, queste però devono essere precedute da due punti (:) nei comandi SQL, e devono essere dichiarate tra i comandi EXEC SQL BEGIN DECLARE SECTION ed EXEC SQL END DECLARE SECTION.&lt;br /&gt;
Si può pensare ad un cursore come se “puntasse” ad una riga nella collezione di risposte dell’interrogazione cui è associato. Quando un cursore viene aperto si posiziona appena prima della prima riga. Possiamo usare il comando FETCH per leggere la prima riga del cursore nelle variabili del linguaggio ospite. &lt;br /&gt;
Quando questo viene eseguito, il cursore viene posizionato per puntare alla riga successiva( che è la prima riga della tabella quando FETCH è eseguito per la prima volta dopo l’apertura del cursore) e i valori delle colonne nella riga sono copiarti nelle corrispondenti variabili ospiti. Eseguendo ripetutamente questo comando FETCH possiamo leggere tutte le righe calcolate dall’interrogazione, una alla volta.&lt;br /&gt;
Quando abbiamo finito col cursore usiamo il comando CLOSE.&lt;br /&gt;
Proprietà dei cursori, la forma generale della dichiarazione di un cursore è:&lt;br /&gt;
		DECLARE nome_cursore [INSENSITIVE] [SCROLL] CURSOR&lt;br /&gt;
		[WITH HOLD]&lt;br /&gt;
		FOR qualche interrogazione&lt;br /&gt;
		[ORDER BY lista-ordinamento]&lt;br /&gt;
		[FOR READ ONLY | FOR UPDATE]&lt;br /&gt;
Un cursore può essere dichiarato di sola lettura (FOR READ ONLY) oppure, se è definito su una relazione di base o una vista aggiornabile(FOR UPDATE).&lt;br /&gt;
Se è aggiornabile, semplici varianti dei comandi UPDATE e DELETE ci permettono di aggiornare o cancellare la riga su cui il cursore è posizionato&lt;br /&gt;
Un cursore è aggiornabile per default a meno che nella sua definizione sia stato specificato SCROLL e INSENSITIVE, nel qual caso è di sola lettura.&lt;br /&gt;
SCROLL;il cursore è scorrevole, quindi le varianti del comando FETCH possono essere usate per posizionarlo in maniera molto flessibile; altrimenti è consentito il solo comando FETCH di base, che sposta il cursore alla riga successiva.&lt;br /&gt;
INSENSITIVE;il cursore si comporta come se si muovesse su una copia privata della collezione di righe della risposta. Altrimenti per impostazione predefinita, le azioni di qualche altra transazione potrebbero modificare tali righe, creando comportamenti non prevedibili.&lt;br /&gt;
Un cursore mantenibile viene specificato con la clausola WITH HOLD, e non è chiuso quando la transazione termina. Se una qualunque transazione viene interrotta il sistema, potenzialmente, deve rifare parecchio lavoro. Quindi l’alternativa è spezzare la transazione in diverse transazioni, più piccole, ma ricordare la posizione nella tabella è complicato e soggetto a errori.&lt;br /&gt;
ORDER BY; può essere usata per specificare un ordinamento. La lista-ordinamento è una lista di voci di ordinamento(nome di colonna), eventualmente seguito da una delle parole chiave ASC e DESC. Ogni colonna menzionata nella clausola ORDER BY deve apparire anche nella lista-selezione dell’interrogazione associata al cursore; altrimenti non è chiaro su quali colonne effettuare l’ordinamento.&lt;br /&gt;
SQL dinamico; i due comandi principali sono PREPARE e EXECUTE:&lt;br /&gt;
	char c_stringaSQL[] =  {“DELETE FROM Velisti WHERE esperienza &amp;gt; 5”};&lt;br /&gt;
	EXEC SQL PREPARE pronto FROM: c_stringaSQL;&lt;br /&gt;
	EXE SQL EXECUTE pronto;&lt;br /&gt;
1)il primo comando dichiara la variabile C c_stringaSQL e ne imposta il valore ad una rappresentazione stringa di un comando di SQL.&lt;br /&gt;
2)la seconda istruzione fa sì che tale stringa venga esaminata e compilata come comando SQL, con l’eseguibile risultante legato alla variabile pronto&lt;br /&gt;
3)la terza istruzione esegue il comando.&lt;br /&gt;
La preparazione di un comando SQL dinamico avviene durante l’esecuzione, che ne risulta appesantita. I comandi dell’SQL interattivo e dell’SQL incapsulato possono essere preparati una volta per tutte al momento della compilazione, e poi ri-eseguiti quanto si vuole. Di fatti si deve limitare l’uso dell’SQL dinamico a quelle situazioni in cui è essenziale.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter sottomettere al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti(Downie);&lt;br /&gt;
1.Pitch Facet; la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
note sul pentagramma,&lt;br /&gt;
nome A, B,C#,&lt;br /&gt;
pitch class number 0, 1, 2,&lt;br /&gt;
solfeggio do, re mi.&lt;br /&gt;
Intervallo: è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
Melodia: insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
Chiave: viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
Contorno melodico: il pattern degli intervalli.&lt;br /&gt;
2.Temporal Facet: informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
i.Metrica&lt;br /&gt;
ii.Indicatori di tempo&lt;br /&gt;
iii.Durata del pitch&lt;br /&gt;
iv.Accenti&lt;br /&gt;
v.Durata armonica&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano(questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato)&lt;br /&gt;
Pause: possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
Informazione temporale: può essere:&lt;br /&gt;
Assoluta ( metronomo ),&lt;br /&gt;
Generale ( adagio, forte ),&lt;br /&gt;
Relativo ( schneller, langsamer ),&lt;br /&gt;
Temporal distorsion ( rubato, rallentando ).&lt;br /&gt;
3.Harmonic Facet: quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia ( caratteristica fondamentale della musica occidentale).&lt;br /&gt;
Gli eventi armonici , sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
4.Timbral Facet: comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
5.Editorial Facet: istruzioni sull’esecuzione( diteggiatura, ornamenti, istruzioni dinamiche, etc…). Anche la musica stessa può essere inclusa.&lt;br /&gt;
6.Textual Facet: è l’aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa.&lt;br /&gt;
7.Bibliographic Facet: sono informazioni relative a:&lt;br /&gt;
titolo&lt;br /&gt;
compositore&lt;br /&gt;
arrangiatore&lt;br /&gt;
editore&lt;br /&gt;
numero di catalogo&lt;br /&gt;
data pubblicazione&lt;br /&gt;
esecutori.&lt;br /&gt;
Uno degli obbiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
Interrogazioni per contenuto: confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca.&lt;br /&gt;
Per la costruzione di un DB musicale vi son tre passi:&lt;br /&gt;
1.individuare lo scopo dei dati. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
2.elencare i dati necessari, considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copy-right.&lt;br /&gt;
3.definire la miglior struttura per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni.&lt;br /&gt;
Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi son tre tipi di ricerca:&lt;br /&gt;
Browsing: può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti,&lt;br /&gt;
Textual search: indicizzazione di tutte le informazioni testuali accademiche( autore, titolo, …) e non accademiche( genere, frammenti delle liriche, …).&lt;br /&gt;
Search by content: interrogazioni basate sulla melodia o altri aspetti del contenuto audio.&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia( informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
Catalog information: sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
Multimedia characteristics: son metadadata che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette( da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
Query by content: servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
Verifica se un brano appena composto da un autore si frutto della creatività dell’artista e non influenzato da uno ascoltato in passato e poi dimenticato.&lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
a frammenti tematici: contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale,&lt;br /&gt;
database di intere partiture: sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
Query-by-humming, può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
L’approccio per questo metodo sono di due tipi: &lt;br /&gt;
DSP: elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
Simbolico: trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenza melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio( si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo(discreto) il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio(non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
Vi son dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
Note segmentation: dove sono posizionate esattamente le note?Quanto durano?&lt;br /&gt;
Pitch variation della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
Note quantization: come posizionare le altezze sulle scale musicali?&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze(di differenti ottave).&lt;br /&gt;
Sequenze di note: ogni elemento della sequenza è descritto da qualche parametro ( solitamente nome e durata della nota ).&lt;br /&gt;
Rappresentazione: &lt;br /&gt;
tutte le rappresentazioni della stessa nota vengono collassate in una sola,&lt;br /&gt;
l’alfabeto di 12 elementi, viene usato per rappresentare e dividere le altezze in semitoni,&lt;br /&gt;
questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Trasposizione: gli algoritmi per calcolare la similarità vengono applicati 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit&lt;br /&gt;
Sequenza d’intervalli: distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava.&lt;br /&gt;
È anche dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
Contorno melodico: si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to.&lt;br /&gt;
Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibili individuare univocamente il brano cercato.&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note, significa ottenere centinaia di brani simili, impossibili ascoltarli tutti per trovare quello corretto.&lt;br /&gt;
Però questo sistema è utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
Classi di equivalenza: ogni simbolo rappresenta n intervalli. &lt;br /&gt;
C1:ogni simbolo rappresenta un intervallo,&lt;br /&gt;
C3: ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
CU: tutti gli intervalli crescenti e decrescenti collassato in due differenti classi( contorno melodico ).&lt;br /&gt;
Rappresentazione Frame-based:&lt;br /&gt;
non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia,&lt;br /&gt;
il tempo viene diviso in frame di ugual misura,&lt;br /&gt;
viene stimato il valore di un pitch per ogni frame,&lt;br /&gt;
le note non sono esplicitamente descritte,&lt;br /&gt;
in un unico valore sono rappresentabili le informazioni relative ad altezza e durata.&lt;br /&gt;
Svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
Music psychology: c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, di fatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando.&lt;br /&gt;
L’interrogazione è distribuita su più voci:&lt;br /&gt;
non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando,&lt;br /&gt;
in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
memoria, che può essere a breve o lungo termine,&lt;br /&gt;
tipologia di utente, che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
Melodia: definire come una sequenza di note sia riconosciuta dall’uomo come una melodia di un brano polifonico.&lt;br /&gt;
String matching and melodic similarità: approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia f  la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e s la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
 f è fattore di x?&lt;br /&gt;
se f non appare in x, quale sottoparte di f è presente in s?&lt;br /&gt;
quante volte un’approssimazione di f è presente in s?&lt;br /&gt;
Blast algorithm: Basic Local Alignment Search Tool: uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze:&lt;br /&gt;
zone uguali o simili,&lt;br /&gt;
allineamenti globali.&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
Identità percentuale: numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi,&lt;br /&gt;
Conservazione: quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17649</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17649"/>
		<updated>2007-07-11T15:59:09Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Database e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo (o attributo), ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise nei campi contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
===Vincoli di integrità===&lt;br /&gt;
Affinché uno schema relazionale sia valido è necessario che le tuple nelle sue istanze siano univocamente identificabili. In altre parole, non possono esistere in un'istanza tuple con valori identici in tutti i loro campi.&lt;br /&gt;
&lt;br /&gt;
Il '''vincolo di chiave''' è l’imposizione che un certo sottoinsieme dei campi di una relazione sia un '''identificatore unico''' per una tupla. Tale insieme deve inoltre essere '''minimale''', Ovvero non possono esistere sottoinsiemi propri dell'insieme selezionato che siano a loro volta identificatori unici di una tupla. Un insieme di campi di questo tipo si chiama '''chiave candidata''' per la relazione, o più semplicemente '''chiave'''.&lt;br /&gt;
&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Possono esserci più chiavi candidate per una relazione, in tal caso se il DBMS non supporta chiavi multiple si indica come '''chiave primaria''' la chiave scelta per l'identificazione univoca delle tuple. Nella scelta di una chiave primaria è meglio usarne una che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
&lt;br /&gt;
Si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave primaria. In particolare, se una relazione R ha un insieme di attributi che costituisce la chiave di una relazione R', allora tale insieme è una '''chiave esterna''' di R su R'. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni.&lt;br /&gt;
&lt;br /&gt;
Una chiave esterna deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi.&lt;br /&gt;
&lt;br /&gt;
L''''integrità referenziale''' rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,...,Vn, allora deve esistere nella relazione riferita una tupla t' con valori di chiave V1,...,Vn. In altre parole, affinché vi sia un corretto riferimento tra due tuple, i valori della chiave primaria e della chiave esterna devono essere identici e coerenti tra loro.&lt;br /&gt;
&lt;br /&gt;
===Algebra relazionale===&lt;br /&gt;
L''''algebra relazionale''' è il linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori. Ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione come risultato.&lt;br /&gt;
&lt;br /&gt;
Un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
&lt;br /&gt;
* '''Selezione:''' l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione booleana di termini che hanno la forma attributo op costante oppure attributo1 op attributo2, dove op è uno degli operatori di confronto &amp;lt;,&amp;lt;=,=,=&amp;gt;,&amp;gt;,!=.&lt;br /&gt;
* '''Proiezione:''' l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
* '''Unione:''' R u S restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione R oppure S. Due istanze sono dette compatibili rispetto all’unione quando hanno lo stesso numero di campi e quando campi corrispondenti hanno lo stesso dominio.&lt;br /&gt;
* '''Intersezione:''' R ^ S restituisce un’istanza contenente tutte le tuple presenti sia in R che in S&lt;br /&gt;
* '''Differenza:''' R - S restituisce un’istanza contenente tutte le tuple presenti in R ma non in S. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a R&lt;br /&gt;
* '''Prodotto cartesiano:''' R x S restituisce un’istanza di relazione il cui schema contiene tutti i campi di R seguiti da tutti i campi di S. Il risultato di R x S contiene una tupla |r,s|.&lt;br /&gt;
Rinomina , usato per rinominare le tabelle.&lt;br /&gt;
JOIN: usato per combinare informazioni da due o più relazioni. Un predicato di JOIN esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
JOIN CONDIZIONALE; la versione più generale dell’operatore di join accetta una condizione di join c e un paio di istanze di relazione come argomenti e restituisce un’istanza di relazione.&lt;br /&gt;
      c (RxS)&lt;br /&gt;
EQUIJOIN; lo si ha quando la condizione di join consiste solamente di uguaglianze della forma R.nome1=S.nome2. In questo caso mantenere entrambi gli attributi sarebbe ridondante come cosa. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui S.nome2 viene scartato. Lo schema del risultato di un equijoin contiene i campi di R, seguiti dai campi di  che non appaiono condizioni di join.&lt;br /&gt;
JOIN NATURALE; è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in R e S. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome. C’è anche da dire che non corrisponde ad un operatore di NATURAL JOIN,dato che non si esegue alcuna proiezione, e lo scema risultante è quello del prodotto cartesiano. La sua forma è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; NATURAL JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
JOIN ESTERNI(pg99); questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL,&lt;br /&gt;
R OUTER JOIN S&lt;br /&gt;
Esistono diverse varianti dell’OUTER JOIN;&lt;br /&gt;
1.FULL: sia le tuple di R che quelle di S che non partecipano  al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
2.LEFT: le tuple di R che non partecipano al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
3.RIGHT: le tuple S che non partecipano al JOIN vengono completate ed inserite nel risultato.&lt;br /&gt;
CROSS JOIN; questi operatori poiché producono relazioni possono essere usati nella clausola FROM. È la forma di operatore JOIN più semplice che corrisponde al prodotto cartesiano. La sua sintassi è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; CROSS JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
DIVISIONE, l’operazione di divisione A/B è l’insieme di tutti valori di x(in forma di tuple unarie) tali che per ogni valore y in B, ci sia una tupla |x,y| in A. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti(un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A).Le tuple interdette possono esser calcolate così: x(( x (A) x B) – A).&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Lo standard dei linguaggi SQL usa la parola table per indicare relazione.&lt;br /&gt;
CREATE TABLE, usato per definire una nuova tabella (CREATE TABLE Studenti )&lt;br /&gt;
CREATE TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	(&amp;lt; specifica colonna &amp;gt; [, &amp;lt; specifica colonna &amp;gt; ]);&lt;br /&gt;
&amp;lt; specifica colonna &amp;gt;, ha il seguente formato&lt;br /&gt;
&amp;lt; nome colonna &amp;gt; &amp;lt; dominio &amp;gt; [DEFAULT &amp;lt; valore default &amp;gt;]&lt;br /&gt;
dove &amp;lt; dominio &amp;gt; è il dominio della colonna, ed è uno dei tipi di dato SQL;&lt;br /&gt;
&amp;lt; valore default &amp;gt; è un valore del dominio, assunto dalle tuple se nessun valore è specificato per la colonna.&lt;br /&gt;
INSERT, usato per inserire le tuple&lt;br /&gt;
INSERT&lt;br /&gt;
INTO R [(C…C°)]&lt;br /&gt;
{VALUES (e…e°)| sq};&lt;br /&gt;
(e…e°) è una lista di valori da assegnare alla nuova tupla, questi sono assegnati in base ad una corrispondenza posizionale&lt;br /&gt;
sq, è una sub-query&lt;br /&gt;
le tuple generate come risposta alla sq vengono inserite nella relazione R&lt;br /&gt;
la clausola di proiezioni di sq deve contenere colonne compatibili con le colonne di R a cui si assegnano valori&lt;br /&gt;
il dominio della colonna C(i=1,…., n) deve essere compatibile con il dominio della colonna i-esima contenuta nella clausola di proiezione di SQL.&lt;br /&gt;
Tutte le colonne non esplicitamente elencate ricevono il valore nullo o il valore di default.&lt;br /&gt;
DELETE, usato per cancellare le tuple&lt;br /&gt;
DELETE&lt;br /&gt;
FROM  R[alias]&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può essere associato ad un alias se è necessario riferire a tuple di tale relazione una qualche sotto-interrogazione presente in F&lt;br /&gt;
se non viene specificata alcuna clausola di qualificazione vengono cancellate tutte le tuple.&lt;br /&gt;
UPDATE, usato per modificare i valori in una riga esistente&lt;br /&gt;
UPDATE R[alias]&lt;br /&gt;
SET C={e |NULL},…, C°={e° | NULL}&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può avere associato un alias se è necessario riferire tuple di tale relazione in una qualche sotto-interrogazione presente in F&lt;br /&gt;
C={e |NULL},…, C°={i=1 | NULL}, è un’espressione di assegnamento che specifica che alla colonna C, deve essere assegnato il valore dell’espressione e.&lt;br /&gt;
Questa può essere una costante, spesso funzione dei valori correnti delle tuple da modificare, o una sub-query&lt;br /&gt;
si può specificare che alla colonna sia assegnato il valore nullo.&lt;br /&gt;
&lt;br /&gt;
Per definire una chiave primaria in SQL viene usato il comando PRIMARY KEY, mentre per dichiarare un sottoinsieme delle colonne di una tabella si usa UNIQUE.&lt;br /&gt;
 La presenza di NULL in una chiave esterna non viola il vincolo di chiave. Il comando in SQL è FOREIGN KEY che ha delle opzioni aggiuntive, sul come comportarsi una volta implementata la chiave esterna. &lt;br /&gt;
	FOREIGN KEY(&amp;lt; lista nomi colonne &amp;gt;)&lt;br /&gt;
	REFERENCES &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	 [ON DELETE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
	[ ON UPDATE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
l’opzione predefinita è NO ACTION(l’azione deve essere ignorata).&lt;br /&gt;
CASCADE dice che se una riga viene cancellata, tutte le sue righe che la referenziano devono essere eliminate. Lo stesso vale per il caso di un UPDATE, dove l’aggiornamento viene propagato a ciascuna riga,&lt;br /&gt;
ON DELETE permette di specificare le azioni da eseguire nel caso di cancellazione di una tupla riferita tramite chiave esterna,&lt;br /&gt;
ON UPDATE permette di specificare le azioni da eseguire nel caso di modifica del valore di chiave di una tupla riferita tramite chiave esterna&lt;br /&gt;
Per default un vincolo viene verificato al termine di ogni istruzione SQL che potrebbe portare ad una violazione, e se questa ci fosse il comando viene rifiutato.&lt;br /&gt;
L’SQL permette di specificare che un vincolo sia in modalità DEFERRED o IMMEDIATE: SET CONSTRAINT vincolo DEFERRED.&lt;br /&gt;
Un’interrogazione di una base di dati relazionale è una domanda sui dati, e la risposta consiste in una nuova relazione contenente il risultato. Un esempio di query è:&lt;br /&gt;
	SELECT*&lt;br /&gt;
	FROM&lt;br /&gt;
	WHERE&lt;br /&gt;
*significa che vogliamo tutti i campi delle tuple che compongono il risultato.&lt;br /&gt;
Una vista è una tabella le cui righe non sono esplicitamente memorizzate nella base dati, ma sono calcolate quando necessario in base a una definizione di vista.&lt;br /&gt;
Questa può essere usata come in una tabella di base per definire nuove interrogazioni o viste.&lt;br /&gt;
DROP TABLE, per eliminare una tabella e la sua forma è:&lt;br /&gt;
		DROP TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
			{ RESTRICT | CASCADE };&lt;br /&gt;
se viene specificata l’opzione RESTRICT, la relazione viene cancellata solo se non è riferita da altri elementi dello schema della base di dati;&lt;br /&gt;
se viene specificata l’opzione CASCADE, la relazione e tutti gli elementi dello schema della base di dati che eventualmente la riferiscono vengono cancellati.&lt;br /&gt;
ALTER TABLE, modifica la struttura di una tabella esistente e la sua forma è:&lt;br /&gt;
		ALTER TABLE &amp;lt; nome relazione &amp;gt; &amp;lt; modifica &amp;gt;;&lt;br /&gt;
&amp;lt; modifica &amp;gt; è la modifica da effettuare, tra l’aggiunta di una nuova colonna, modifica di una colonna e l’eliminazione.&lt;br /&gt;
&lt;br /&gt;
SQL:I linguaggi di basi dati come SQL permettono all’utente di specificare per quali relazioni e quali attributi è necessario mantenere l’integrità referenziale( e le azioni da eseguire in caso di violazione). La forma base di un’interrogazione SQL è: &lt;br /&gt;
SELECT [DISTINCT] lista-select&lt;br /&gt;
FROM lista-from&lt;br /&gt;
WHERE qualificazione&lt;br /&gt;
Lista-select, è una lista di nomi di colonne delle tabelle nominate nella lista-from. I nomi di colonne possono avere come prefisso una variabile di range.&lt;br /&gt;
Lista-from, è una lista di nomi di tabelle. Un nome di tabella può essere seguito da una variabile di range(questa è utile quando lo stesso nome di tabella appare più volte nella lista-from).&lt;br /&gt;
Qualificazione, è una combinazione booleana di condizioni nella forma espressione op espressione, dove op è uno degli operatori di confronto.&lt;br /&gt;
Ogni interrogazione deve avere una clausola SELECT, che specifica le colonne da includere nel risultato, e una clausola FROM, che specifica un prodotto cartesiano di tabelle. La clausola opzionale WHERE specifica condizioni di selezione sulle tabelle menzionate nella clausola FROM.&lt;br /&gt;
Se omettiamo la parola chiave DISTINCT, otterremo una copia della riga (v,e), e la risposta sarebbe un multi-insieme di righe. &lt;br /&gt;
Il processo d’interrogazione di un DB consta in:&lt;br /&gt;
caricamento della lista di attributi;&lt;br /&gt;
scarto delle tuple che non soddisfano la qualificazione;&lt;br /&gt;
eliminazione degli attributi che non sono nella lista-from.&lt;br /&gt;
Un multi-insieme è un simile ad un insieme, nel senso che è una collezione non ordinata di elementi, ma possono esserci diverse copie, e il numero di copie è significativo: due multi-insiemi possono avere gli stessi elementi e tuttavia essere diversi, poiché il numero di copie dello stesso elemento è diverso.&lt;br /&gt;
Tipi numerici esatti:&lt;br /&gt;
INTEGER; la precisione di questo tipo di dato è espressa in numero di bit, a seconda della specifica implementazione di SQL,&lt;br /&gt;
SMALLINT; l’unico requisito è che la precisione di questo tipo di dato sia non maggiore della precisione del tipo di dato INTEGER. Questo viene usato per eventuali ottimizzazioni in quanto i valori richiedono minore spazio di memorizzazione,&lt;br /&gt;
BIGINT; l’unico requisito è che la precisione di questo tipo di dato sia non minore della precisione del tipo di dato INTEGER,&lt;br /&gt;
NUMERIC; caratterizzato da una precisione(numero totale di cifre) e una scala(numero di cifre dopo la virgola), il valore default per la precisione è 1 e per la scala è 0,&lt;br /&gt;
DECIMAL; simile a NUMERIC, ma la specifica di questo tipo di dato ha la forma: DECIMAL[(precisione[,scala])].&lt;br /&gt;
Tipi numerici approssimati:&lt;br /&gt;
REAL; rappresenta valori reali a singola precisione in virgola mobile, e la precisione dipende dalla specifica implementazione si SQL,&lt;br /&gt;
DOUBLE PRECISION; rappresenta valori reali a doppia precisione in virgola mobile, e questa dipende sempre dall’implementazione di SQL(però deve essere maggiore della precisione di tipo REAL),&lt;br /&gt;
FLOAT; rappresenta valori reali alla precisione desiderata, ed ha la forma FLOAT[(precisione)]. La precisione minima specificabile è 1.&lt;br /&gt;
Tipi di dato carattere:&lt;br /&gt;
CHARACTER; rappresenta stringhe di caratteri di lunghezza predefinita, spesso abbreviato in CHAR. La specifica ha il formato CHAR[(n)], con n lunghezza delle stringhe. E’ possibile usare come valore una stringa di lunghezza inferiore a n, che viene completata con spazi fino a raggiungere tale lunghezza,&lt;br /&gt;
CHARACTER VARYING; rappresenta stringhe di caratteri di lunghezza massima predefinita. Spesso abbreviato in VARCHART, e la sua forma è VARCHART(n), dove n è la lunghezza massima delle stringhe.&lt;br /&gt;
Tipi di dato temporali:&lt;br /&gt;
DATE; rappresenta le date espresse come anno(4cifre), mese(2cifre) e giorno(2cifre),&lt;br /&gt;
TIME; rappresenta i tempi espressi come ora(2cifre), minuto(2cifre) e secondo(2cifre),&lt;br /&gt;
TIMESTAMP; rappresenta una “concatenazione” fra DATE e TIME. Permette di rappresentare timestamp che consistono in: anno, mese, giorno, ora, minuto, secondo e microsecondo,&lt;br /&gt;
INTERVAL; rappresenta una durata temporale in riferimento ad uno o più qualificatori. I valori di questo tipo son rappresentati dalla parola chiave INTERVAL seguita da una stringa che esprime la durata in termini di uno o più qualificatori. Se sono presenti due qualificatori, il primo è più ampio del secondo e sono separati dalla parola chiave TO.&lt;br /&gt;
Tipo di dato:&lt;br /&gt;
BOOLEAN; i valori di tali tipo sono TRUE, FALSE, UNKNOWN(questo viene introdotto per la gestione dei confronti con valori nulli,&lt;br /&gt;
CHARACTER LARGE OBJECT(CLOB); permette di rappresentare sequenze di caratteri di elevate dimensioni,&lt;br /&gt;
BINARY LARGE OBJECT(BLOB); permette di rappresentare sequenze di bit di elevate dimensioni. &lt;br /&gt;
E’ possibile convertire un valore ad un altro tipo mediante l’operatore di CAST&lt;br /&gt;
		CAST (e) AS &amp;lt; tipo target &amp;gt;&lt;br /&gt;
AS: per introdurre una variabile di range.&lt;br /&gt;
I nomi delle tabelle possono essere implicitamente usati come variabili in linea. Si ha la necessità di introdurre esplicitamente le variabili di range solo quando la clausola FROM contiene più di una occorrenza di una relazione. Se una variabile di range è stata introdotta nella relazione, un nome di tabella non può essere usato come variabile di range esplicita.&lt;br /&gt;
Ogni elemento in una lista-select può essere della forma espressione AS nome_colonna ( questo è il nuovo nome che la colonna avrà nel risultato dell’interrogazione. Inoltre, ogni termine in una qualificazione può anche essere rappresentato nella forma generale espressione1 = espressione2.&lt;br /&gt;
L’SQL permette il pattern matching, su valori di tipo stringa, attraverso l’uso dell’operatore LIKE, insieme all’uso dei caratteri jolly %( zero o più caratteri qualunque) e ( esattamente un carattere qualunque). Quindi “AB%” denota una qualunque stringa che contiene almeno tre caratteri, con il secondo ed il terzo uguali a A e B.&lt;br /&gt;
SQL fornisce tre comandi per la manipolazione degli insiemi che estendono la forma d’interrogazione basilare, e sono:&lt;br /&gt;
UNION, restituisce tutte le tuple distinte restituite da almeno una delle sotto-interrogazioni a cui è applicato. Se si usa la clausola ORDER BY, questa deve essere usata una sola volta alla fine dell’interrogazione e non alla fine di ogni SELECT,&lt;br /&gt;
INTERSECT, corrisponde all’intersezione, restituisce le tuple restituite da entrambe le sotto interrogazioni a cui è applicato.&lt;br /&gt;
EXCEPT, corrisponde alla differenza, e restituisce le tuple della seconda sotto-interrogazione a cui è applicato.&lt;br /&gt;
Questo linguaggio fornisce anche altre operazioni sugli insiemi:&lt;br /&gt;
IN, per controllare se un elemento è in un dato insieme. C IN(v,….v°), nella forma negata C NOT IN(v,….v°).&lt;br /&gt;
ANY&lt;br /&gt;
ALL, per confrontare un valore con gli elementi di un dato insieme, usando l’operatore di confronto op&lt;br /&gt;
EXISTS, per controllare se un insieme è vuoto.&lt;br /&gt;
BETWEEN, permette di determinare le tuple che contengono in un dato attributo valori in un intervallo dato. C BETWEEN v AND v° , nella forma negata invece C NOT BETWEEN v AND v°,&lt;br /&gt;
ABS(N); calcola il valore assoluto del valore numerico N,&lt;br /&gt;
MOD(n,b); calcola il resto intero della divisione n per b.&lt;br /&gt;
UNION, INTERSECT ed EXCEPT possono essere usati su qualsiasi coppia di tabelle che siano compatibili rispetto all’unione, cioè che abbiamo lo stesso numero e tipo di colonne.&lt;br /&gt;
Nel caso si UNION i duplicati vengono eliminati automaticamente. Per mantenerli è necessario aggiungere ALL (UNION ALL). Lo stesso discorso vale per INTERSECT ed EXCEPT.&lt;br /&gt;
Espressioni e funzioni: un’espressione usata nella clausola di proiezione di un’interrogazione, dà luogo ad una colonna, detta virtuale, non presente nella relazione su cui si effettua l’interrogazione.&lt;br /&gt;
Le colonne virtuali non sono fisicamente memorizzate, ma sono calcolate dinamicamente come risultato dell’esecuzione dell’interrogazione. &lt;br /&gt;
Espressioni e funzioni per stringhe:&lt;br /&gt;
Operatore di concatenazione denotato da ||,&lt;br /&gt;
LENGHT(str), restituisce la lunghezza della stringa str, in numero di caratteri,&lt;br /&gt;
UPPER(str) e LOWER(str), trasformano la stringa str in caratteri tutti maiuscoli o tutti minuscoli, rispettivamente,&lt;br /&gt;
SUBSTR(str, m,[n]), estrae dalla stringa str la sottostringa dal carattere di posizione m per una lunghezza n,&lt;br /&gt;
TRIM[str°] FROM str, elimina dalla stringa str° i caratteri in str.&lt;br /&gt;
Un’interrogazione annidata è un’interrogazione che al suo interno ha un’altra interrogazione. Questa solitamente appare nella clausola WHERE, o anche in FROM o HAVING. Se una sub-query scalare restituisce più di una tupla si genera un errore di run-time, e se nessuna tupla verifica la sotto-interrogazione, viene restituito il valore NULL.&lt;br /&gt;
E’ anche possibile selezionare più di una colonna tramite sotto-interrogazioni, in tal caso è necessario apporre delle parentesi alla lista delle colonne a sinistra dell’operatore di confronto. Ad esempio, voglio elencare gli impiegati con la stessa mansione di Martini;&lt;br /&gt;
		SELECT Nome FROM Impiegati&lt;br /&gt;
		WHERE(Mansione, Stipendio) = (SELECT&lt;br /&gt;
			Mansione, Stipendio FROM Impiegati&lt;br /&gt;
				WHERE Nome = “Martini”);&lt;br /&gt;
Una sub-query può contenere a sua volta un’altra sub-query. E’ possibile definire sotto-interrogazioni che sono eseguite ripetutamente per ogni tupla candidata considerata nella valutazione dell’interrogazione esterna, e ogni volta che questa considera una tupla candidata, deve invocare la sotto-interrogazione. Questo tipo viene chiamato correlato, dato che ogni esecuzione è correlata al valore di uno o più attributi delle tuple candidate nell’interrogazione principale. Per poter fare riferimento alle colonne delle tuple candidate nell’interrogazione esterna si fa uso degli alias di relazione(questo è definito nell’interrogazione esterna e riferito nella sotto-interrogazione correlata. Sono utili quando si vuole fare riferimento a due diverse tuple della stessa relazione.).&lt;br /&gt;
UNIQUE, quando applichiamo questo comando ad una sotto-interrogazione, la condizione che ne risulta ritorna vero se  nessuna riga appare due volte nella risposta all’interrogazione, se non ci sono duplicati. Ritorna vero se la risposta è vuota.&lt;br /&gt;
Operatori di aggregazione:&lt;br /&gt;
COUNT ([DISTINCT] A) , è numero di valori unici della colonna A,&lt;br /&gt;
SUM ([DISTINCT] A) , la somma di tutti i valori unici nella colonna A,&lt;br /&gt;
AVG ([DISTINCT] A) , la media di tutti i valori unici nella colonna A,&lt;br /&gt;
MAX (A) , il valore massimo della colonna A,&lt;br /&gt;
MIN (A) , il valore minimo della colonna A.&lt;br /&gt;
Non ha senso specificare DISTINCT insieme a MIN e MAX.&lt;br /&gt;
Le clausole GROUP BY e HAVING;&lt;br /&gt;
		SELECT [DISTINCT]  lista-select&lt;br /&gt;
		FROM lista-from&lt;br /&gt;
		WHERE qualificazione&lt;br /&gt;
		GROUP BY lista gruppo&lt;br /&gt;
		HAVING  qualificazione gruppo.&lt;br /&gt;
La lista-select consiste di una lista di nomi di colonne e una lista di termini della forma aggop(nome-colonna) AS nuovo-nome. Ogni colonna che appare nella lista dei nomi deve apparire nella lista-gruppo.&lt;br /&gt;
Le espressioni che compaiono nella qualificazione gruppo della clausola HAVING devono avere un singolo valore per gruppo. L’idea di base è che la clausola HAVING         ( può essere una combinazione Booleana di predicati, i quali tuttavia possono solo coinvolger funzioni di gruppo) determina se per ogni gruppo dato debba essere generata una riga della risposta.&lt;br /&gt;
Un’importante restrizione ci dice che una clausola di protezione di una query contenente GROUP BY può includere solamente:&lt;br /&gt;
una o più colonne tra le colonne che compaiono nella suddetta clausola,&lt;br /&gt;
funzioni di gruppo(che possono apparire in funzioni aritmetiche).&lt;br /&gt;
Le funzioni di gruppo permettono di estrarre informazioni da gruppi di tuple invece di una relazione, queste si basano su due concetti:&lt;br /&gt;
il partizionamento delle tuple di un relazione in base al valore di uno o più colonne della relazione,&lt;br /&gt;
il calcolo della funzione di gruppo per ogni gruppo ottenuto col partizionamento. &lt;br /&gt;
Una funzione di gruppo ha come argomento una colonna e si applica all’insieme dei valori di questa colonna, estratti dalle tuple che appartengono allo stesso gruppo.&lt;br /&gt;
E’ possibile applicare queste funzioni senza partizionamento e in tal caso saranno applicate ad un unico gruppo contente tutte le tuple della relazione.&lt;br /&gt;
Se GROUP BY viene omesso l’intera tabella viene vista come un singolo gruppo&lt;br /&gt;
COUNT, se questo non include DISTINCT, allora COUNT(*) dà la stessa risposta di COUNT(x), dove x è un qualunque insieme di attributi.&lt;br /&gt;
L’SQL fornisce un valore di colonna speciale chiamato null da usare quando il valore della colonna è sconosciuto oppure inapplicabile.&lt;br /&gt;
Possiamo impedire l’uso dei valori null specificando NOT NULL come parte della definizione dei campi. Inoltre i campi in una chiave primaria non posso assumere valori null, quindi vi è un vincolo di NOT NULL, implicito per ogni campo elencato in un vincolo di PRIMARY KEY.&lt;br /&gt;
Si può specificare vincoli sulla tabella usando vincoli di tabella, che hanno la forma CHECK espressione-condizionale.&lt;br /&gt;
In un comando CREATE TABLE, la clausola CHECK può comparire;&lt;br /&gt;
di seguito alla definizione di una colonna ( vincoli di CHECK su colonna )&lt;br /&gt;
come clausola separata dall’interno della definizione della relazione ( vincoli CHECK su relazione ).&lt;br /&gt;
Specificando un vincolo CHECK vogliamo che ogni tupla nella relazione soddisfi la condizione. E’ consigliabile esprimere tramite CHECK solo le condizioni che devono essere verificate da ogni singola tupla della relazione cui associamo il vincolo.&lt;br /&gt;
E’ possibile assegnare nome ai vincoli associati alle definizioni di relazione facendo seguire la specifica del vincolo nella parola chiave CONSTRAINT e dal nome. Difetti specificare un nome per tutti i vincoli è utile per potersi poi riferire ad essi.&lt;br /&gt;
Le asserzioni servono per esprimere vincoli di integrità che coinvolgono più tuple o relazioni, e vengono così formulate:&lt;br /&gt;
		CREATE ASSERTION &amp;lt; nome asserzione &amp;gt;&lt;br /&gt;
		CHECK(&amp;lt; condizione &amp;gt;).&lt;br /&gt;
I vincoli di una tabella sono associati ad una tabella singola. Il soddisfacimento di questi vincoli è richiesto solo se la tabella associata è vuota, quando un vincolo coinvolge due o più tabelle, il meccanismo di vincoli sulle tabelle è in qualche modo anomalo, e non ciò che si desidera.&lt;br /&gt;
Un trigger è una procedura che viene eseguita dal DBMS in risposta a specifici cambiamenti nella base di dati ed è definita dal DBA. Questi son divisi in tre parti:&lt;br /&gt;
evento: un cambiamento nella base di dati che attiva il trigger;&lt;br /&gt;
condizione: un’interrogazione o un test che viene eseguito quando il trigger è attivato;&lt;br /&gt;
azione; procedura che viene eseguita quando il trigger è attivato e la sua condizione è verificata.&lt;br /&gt;
Una condizione di trigger può essere un comando vero/falso oppure un’interrogazione. Questa viene interpretata come vero se l’insieme di risposta non è vuoto, falso se l’opposto. L’azione di un trigger può esaminare la risposta all’interrogazione nella parte condizionale dei trigger , fare riferimento a valori vecchi e nuovi delle tuple modificate dal comando che ha attivato il trigger, eseguire nuove interrogazioni e apportare cambiamenti alla base di dati.&lt;br /&gt;
&lt;br /&gt;
==Progettazione di una base dati==&lt;br /&gt;
1)Analisi dei requisiti: il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni  devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
2)Progettazione concettuale della base di dati: le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare. Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
3)Progettazione logica della base dati:  dobbiamo scegliere un DBMS per implementare in nostro progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
4)Raffinamento dello schema: analizzare l’insieme di relazioni del nostro schema relazionale per identificare potenziali problemi, e a rifinirlo.&lt;br /&gt;
5)Progettazione fisica della base di dati: consideriamo i carichi di lavoro attesi che la nostra base di dati dovrò sopportare, e raffiniamo il progetto per garantire che esso soddisfi i criteri di prestazioni richieste. Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
6)Progettazione delle applicazioni e della sicurezza.&lt;br /&gt;
Una entità è un oggetto nel mondo reale che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un’astrazione della realtà la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. La coppia (nome_di_attributo, dominio) viene chiamata attributo e ogni entità è caratterizzata da uno o più attributi(i quali possono essere monovalore, multivalore e compositi).&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
semplice, sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
composti, l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini i un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica. &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una chiave. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come chiave primaria. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli ovali, e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei rettangoli.&lt;br /&gt;
Una relazione è un’associazione tra due o più entità.&lt;br /&gt;
Come per le entità potremmo voler raccogliere un gruppo di relazioni simili in un insieme di relazioni. Questo può essere visto come un insieme di n-tuple:&lt;br /&gt;
{( e1,… en)  E1,…,en   En}&lt;br /&gt;
Ciascuna n-tupla denota una relazione che coinvolge n entità, da e1 a en, dove l’entità ei appartiene all’insieme di entità Ei.&lt;br /&gt;
Una relazione può anche avere attributi descrittivi, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante.&lt;br /&gt;
Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
Ruolo, è la funzione che un’istanza di entità esercita nell’ambito di un’associazione, e nel caso di un’associazione unaria il ruolo è sempre necessario.&lt;br /&gt;
Il modello ER offre costrutti per definire: &lt;br /&gt;
vincoli di cardinalità, sia per associazioni che per attributi. Questi si dividono in cardinalità minima( numero minimo d’istanze di un’associazione a cui le istanze delle entità coinvolte nell’associazione possono partecipare) e cardinalità massima( numero massimo di un’associazione a cui le istanze dell’entità coinvolte nell’associazione posso partecipare).&lt;br /&gt;
Data un’entità E ed un’associazione A: &lt;br /&gt;
i.c_max=1, ogni istanza di E può partecipare a non più di un’istanza di A,&lt;br /&gt;
ii.c_max=c_min=1, ogni istanza i E partecipa ad una ed una sola istanza di A,&lt;br /&gt;
iii.c_min=0, c_max=n, ogni istanza di E può partecipare ad un numero qualsiasi di istanze di A, anche nessuna.&lt;br /&gt;
vincoli d’identificazione, per entità. Identificatori per un’entità: insieme di attributi e/o entità che identificano le istanze dell’entità. Un identificatore è minimale se qualsiasi sottoinsieme proprio non è un identificatore. Le entità deboli ha  sempre cardinalità(1,1) rispetto all’associazione attraverso cui avviene l’dentificazione.&lt;br /&gt;
Uno a uno: se c_max di E e di E°, rispetto ad A è 1;&lt;br /&gt;
Uno a molti: se c_max di E rispetto ad A è n e c_max di E° rispetto ad A è 1, o viceversa. Un impiegato può essere associato a molti altri reparti.&lt;br /&gt;
Molti a molti: l’insieme di relazioni Lavora_in, in cui un impiegato può lavorare in diversi reparti e ogni reparto può avere diversi impiegati.&lt;br /&gt;
Insieme di entità deboli: se c_max di E e di E°, rispetto ad A è n. Questa viene identificata univocamente solo considerando alcuni attributi in congiunzione con la chiave primaria di un’altra entità, che è chiamata  proprietario identificante. Devono valere queste condizioni:&lt;br /&gt;
l’insieme di entità proprietarie e l’insieme di entità deboli devono partecipare in un insieme di relazioni uno-a-molti. Questo insieme di relazioni è chiamato insieme di relazioni identificanti dell’insieme di relazioni deboli&lt;br /&gt;
l’insieme di entità deboli deve aver partecipazione totale nell’insieme di relazioni identificanti.&lt;br /&gt;
Per identificare che si ha un’entità debole si usa un tratto più spesso.                  &lt;br /&gt;
Mentre per indicare che si ha una chiave parziale si userà una sottolineatura a tratti. &lt;br /&gt;
La specializzazione è il processo con cui s’individuano sottoinsiemi di un insieme di entità(la superclasse) che condividono alcune caratteristiche distintive. Tipicamente, la superclasse viene definita per prima,poi le sottoclassi, ed infine si aggiungono gli attributi specifici e gli insiemi di relazioni.&lt;br /&gt;
La generalizzazione consiste nell’identificare alcune caratteristiche comuni a una collezione di insiemi di entità e creare un nuovo insieme di entità che contiene quelle entità che possiedono caratteristiche comuni. Le sottoclassi si definiscono per prime, poi le superclassi, e poi si aggiungono tutti gli insiemi di relazioni che coinvolgono la superclasse.&lt;br /&gt;
I vincoli di disgiunzione determinano se a due sottoclassi è premesso contenere la stessa identità.&lt;br /&gt;
I vincoli di copertura determinano se le entità di una sottoclasse includono, nel loro complesso tutte le entità della superclasse.&lt;br /&gt;
L’aggregazione ci permette di indicare che un insieme di relazioni partecipa in un altro insieme di relazioni. Ciò viene illustrato con un riquadro tratteggiato intorno all’insieme di relazioni.&lt;br /&gt;
L’uso di un modello di dati semantico di alto livello offre nella progettazione concettuale il vantaggio addizionale che il progetto ad alto livello può essere rappresentato con diagrammi e facilmente compreso dalle molte persone che devono fornire informazioni utili al processo progettuale.&lt;br /&gt;
L’approccio normale consta nel considerare le necessità dei vari gruppo di utenti, risolvere i conflitti e generare un singolo insieme di requisiti. Un altro tipo di approccio consiste nello sviluppare schemi concettuali separati per i diversi gruppi di utenza, per poi integrarli. Per fare ciò si deve stabilire le corrispondenze tra le entità, le relazioni e gli attributi, e risolvere diversi tipi di conflitti.&lt;br /&gt;
&lt;br /&gt;
Un insieme di entità è tradotto in una relazione in maniera molto semplice: ogni attributo di un insieme di entità diventa un attributo della tabella.&lt;br /&gt;
Per rappresentare una relazione, dobbiamo potere identificare ciascuna entità partecipante, e dare valori agli attributi descrittivi della relazione, quindi:&lt;br /&gt;
gli attributi della chiave primaria di ciascun insieme di entità partecipante, come campi di chiavi esterne&lt;br /&gt;
gli attributi descrittivi dell’insieme di relazioni.&lt;br /&gt;
Se un insieme di relazioni coinvolge n insiemi di entità, e m di essi sono collegati con frecce ne diagramma ER, la chiave per ciascuno di questi m insiemi costituisce una chiave per la relazione in cui l’insieme è tradotto. Quindi abbiamo m  chiavi candidate, e una di queste dovrebbe essere scelta come chiave primaria.&lt;br /&gt;
Un secondo approccio per tradurre un insieme di relazioni con vincoli di chiave si rivela spesso migliore, perché evita di creare una tabella distinta per l’insieme di relazioni.&lt;br /&gt;
L’idea è di includere le informazioni sull’insieme di relazioni nella tabella corrispondente all’insieme di entità con la chiave, sfruttando il vincolo di chiave.&lt;br /&gt;
Lo svantaggio in questo è che potrebbe esserci uno spreco di spazio. In tal caso i campi aggiunti dovrebbero essere riempiti con valori null. La prima traduzione evita questa inefficienza, ma alcune interrogazioni importanti richiedono di combinare informazioni da due relazioni, il che può essere un operazione lenta.&lt;br /&gt;
Un insieme di entità deboli partecipa sempre in una relazione binaria uno-a-molti e ha vincoli di chiave e di partecipazione totale. Questa ha solo una chiave parziale, e quando un’entità proprietaria viene cancellata, vogliamo che vengano eliminate anche le entità deboli collegate.&lt;br /&gt;
&lt;br /&gt;
==PROGETTAZIONE CONCETTUALE==&lt;br /&gt;
&lt;br /&gt;
La progettazione concettuale di una base di dati ci fornisce un insieme di schemi di relazione e VI che possono essere considerati un buon punto di partenza per il progetto finale. Permette di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale.&lt;br /&gt;
Presentiamo ora una panoramica sui problemi che il raffinamento degli schemi intendo risolvere:&lt;br /&gt;
problemi causati dalla ridondanza: memorizzare la stessa informazione in maniera ridondante, cioè in diversi posti all’interno della stessa base di dati può portare a diversi problemi: &lt;br /&gt;
memorizzazione ridondante;&lt;br /&gt;
anomalie da aggiornamento, se una coppia di questi dati ripetuti viene aggiornata si crea un’inconsistenza, a meno di aggiornare anche tutte le altre copie;&lt;br /&gt;
anomalie da inserimento, potrebbe non essere possibile registrare certe informazioni, a meno di inserire anche qualche altra informazione non correlata;&lt;br /&gt;
anomalie di cancellazione.&lt;br /&gt;
Idealmente vorremmo degli schemi che non permettano ridondanza, ma quanto meno vogliamo poter identificare gli schemi che lo permettono:&lt;br /&gt;
valori null: questi non possono fornire una soluzione completa, ma possono aiutare. Questi valori possono essere utili per le anomalie da inserimento e cancellazione.&lt;br /&gt;
decomposizione, la ridondanza nasce quando uno schema relazionale forza una associazione tra attributi che non è naturale. Le dipendenze funzionali possono essere usate per identificare tali situazioni e per suggerire raffinamenti dello schema. Molti problemi che nascono dalla ridondanza possono essere risolti sostituendo una relazione con una collezione di relazioni “più piccolo”. Una decomposizione di uno schema di relazione r consiste nella sostituzione della schema di relazione con due(o più) schemi di relazione ciascuno dei quali contiene un sottoinsieme di attributi di R, e la cui unione include tutti tali attributi. Noi vogliamo memorizzare le informazioni in ogni data istanza di r memorizzandone le proiezioni. Se non si sta attenti con la decomposizione si possono creare più problemi di quanti se ne vogliano.&lt;br /&gt;
 la proprietà senza perdita(lossless join) ci permette di recuperare qualunque istanza di una relazione decomposta a partire dalle corrispondenti istanze delle relazioni componenti tramite operazioni di join;&lt;br /&gt;
la proprietà di  conservazione delle dipendenze ci consente di mantenere qualunque vincolo della relazione originaria semplicemente imponendo alcuni vincoli su ciascuna delle relazioni componenti. Ossia non abbiamo bisogno di effettuare join delle relazioni più piccolo per controllare se viene violato un vincolo della relazione originale.&lt;br /&gt;
La decomposizione  potrebbe migliorare le prestazioni, nel caso in cui la maggior parte delle interrogazioni degli aggiornamenti  esaminano solo una delle relazioni componenti, che è più piccola della relazione originale.&lt;br /&gt;
Dipendenze funzionali: DF è un tipo di VI che generalizza il concetto di chiave. Sia R uno schema di relazione e siano X e Y insiemi non vuoti di attributi di R, diciamo che un’istanza r di R soddisfa la DF X  Y (si  legge X determina funzionalmente Y, o X determina Y) se per ogni coppia di tuple t1 e t2 in r vale al seguente:&lt;br /&gt;
se t1.X  =  t2.X , allora  t1.Y = t2.Y&lt;br /&gt;
Una DF  X  Y essenzialmente dice che se due tuple coincidono sui valori dell’attributo X, devono anche avere lo stesso valore per l’attributo Y.&lt;br /&gt;
Un’istanza legale di una relazione soddisfare tutti i VI specificati. Quindi guardando l’istanza di una relazione, potremmo essere in grado di dire che una certa DF non è valida, però non possiamo mai dedurre che una DF è valida solo guardando una o più istanza di una relazione, perché una DF, diversamente da un VI, è un’affermazione su tutte le possibili istanze legali di una relazione.&lt;br /&gt;
La definizione di una DF non richiede che l’insieme X sia minimale: l’ulteriore condizione di minimalità deve essere soddisfatta perché X sia una chiave. Se vale X  Y, dove Y  è l’insieme di tutti gli attributi, ed esiste qualche sottoinsieme X di  tale che V  Y, allora X è una superchiave.&lt;br /&gt;
Diciamo che una DF f è implicata da un dato insieme F di DF se f vale su ogni istanza di relazione che soddisfa tutte le dipendenze in F, f vale ogni volta che tutte le DF valgono in F.  &lt;br /&gt;
Chiusura di un insieme di DF, l’insieme di tutte le DF implicate in un dato insieme F di DF è detto chiusura di F, denotato come F+. Come possiamo inferire(calcolare la chiusura di un dato insieme)?&lt;br /&gt;
Con gli Assiomi si Armstrong, i quali possono essere applicati per inferire tute le DF implicate da un insieme F di DF.&lt;br /&gt;
riflessività, se X  Y, allora X  Y;&lt;br /&gt;
aumento, se X  Y allora XZ  YZ per ogni Z;&lt;br /&gt;
transitività, se X  Y e Y  X, allora X  Z.&lt;br /&gt;
Teorema 1  gli assiomi di Armstrong sono corretti, nel senso che generano solo DF in F+ quando sono applicati a un insieme F di DF. Sono anche completi, nel senso che ripetute applicazioni di queste regole generano tutte le DF nella chiusura F+.&lt;br /&gt;
Quando si parla di F+ conviene usare alcune regole addizionali:&lt;br /&gt;
unione: se X  Y e X  Z, allora X  YZ;&lt;br /&gt;
decomposizione: se X  YZ, allora X  Y e X  Z.&lt;br /&gt;
in una DF banale, la parte destra contiene solo attributi che appaiono anche nella parte sinistra; tali dipendenze valgono sempre per via della riflessività. Usando questa possiamo generare tutte le dipendenze banali, che hanno la forma:&lt;br /&gt;
X  Y, dove Y  X, X  ABC e Y  ABC.&lt;br /&gt;
Dalla transitività otteniamo A  C. &lt;br /&gt;
Dall’aumento otteniamo le dipendenze non banali:&lt;br /&gt;
AC  BC, AB  AC, AB  CB.&lt;br /&gt;
Chiusura degli attributi, se volgiamo controllare se una data dipendenza, diciamo X  Y, è nella chiusura di un insieme F di DF, possiamo farlo in maniera efficiente senza calcolare la chiusura stessa.&lt;br /&gt;
Prima troviamo la chiusura degli attributi X+ rispetto a F, che è l’insieme degli attributi A tali che X  A può essere derivata usando gli Assiomi di Armstrong. Questo è l’algoritmo di calcolo:&lt;br /&gt;
		chiusura = X;&lt;br /&gt;
		ripeti fin quando non ci sono più cambiamenti: {&lt;br /&gt;
			se c’è una DF U  V in F tale che U  chiusura,&lt;br /&gt;
				allora chiusura = chiusura  V&lt;br /&gt;
			}&lt;br /&gt;
Teorema 2 l’algoritmo mostrato calcola la chiusura dell’insieme X di attributi rispetto all’insieme F delle DF.&lt;br /&gt;
Forme normali,  dato uno schema di relazione, abbiamo bisogno di decidere se esso sia un buon progetto o se c’è necessità di decomporlo in relazioni più piccole. Una tale decisione deve essere guidata dalla comprensione di quali problemi sono presenti nello schema corrente.&lt;br /&gt;
Le forme normali basate su DF sono la prima forma normale (1NF), la seconda(2NF), la terza(3NF) e la forma normale di Boyce-Codd(BCNF).&lt;br /&gt;
Una relazione è nella 1NF se ogni campo contiene solo valori atomici, cioè niente liste o insiemi. La 2NF ha un interesse storico. La 3NF e la BCNF sono importanti dal punto di vista della progettazione di una base di dati.&lt;br /&gt;
forma normale di Boyce-Codd, sia R uno schema di relazione, F sia l’insieme delle DF date su R, X sia un sottoinsieme degli attributi di R, e A un attributo di R. R è nella BCNF se per ogni DF X  A in F vale una delle seguenti asserzioni: &lt;br /&gt;
A  X, cioè è una DF banale,&lt;br /&gt;
X è una superchiave.&lt;br /&gt;
In una relazione in BCNF le sole dipendenze non banali sono   quelle in cui una chiave determina alcuni attributi. Perciò ogni tupla può essere vista come un’entità o relazione, identificata da una chiave e descritta dai restanti attributi. &lt;br /&gt;
La BCNF assicura che nessuna ridondanza può essere rilevata usando solo le informazioni delle DF. Quindi è la più desiderabile delle forme normali, se prendiamo in considerazione solo le informazioni delle DF.&lt;br /&gt;
Se X è una chiave, allora y1=y2, il che significa ce le due tuple sono identiche. Poiché una relazione è definita come un insieme di tuple, non possiamo avere due copie della stessa tupla.&lt;br /&gt;
Se una relazione è in BCNF, ogni campo di ciascuna tupla registra una parte d’informazione che non può essere dedotta dall’istanza della relazione.&lt;br /&gt;
terza forma normale, sia R uno schema di relazione, F l’insieme delle DF date su R, X un sottoinsieme degli attributi di R, e A un attributo di R. R è in 3NF se per ogni DF X  A in F vale:&lt;br /&gt;
A  X, cioè è una DF banale&lt;br /&gt;
X è una superchiave&lt;br /&gt;
A fa parte di una chiave di R.&lt;br /&gt;
Supponiamo che una dipendenza X  A provochi una violazione della 3NF, sono possibili due casi:&lt;br /&gt;
1)X è un  sottoinsieme proprio di qualche chiave K. Questa viene chiamata dipendenza parziale e viene memorizzato la coppia (X,A) in maniera ridondante.&lt;br /&gt;
2)X non è un sottoinsieme proprio di una chiave. Una tale dipendenza è a volte chiamata dipendenza transitiva, perché significa che abbiamo una catena di dipendenze K   X  A. Il problema è che non possiamo associare un valore X con un valore K a meno di associare anche un valore A con un valore X.&lt;br /&gt;
Nella 3NF è possibile qualche ridondanza. I problemi associati alle dipendenze parziali e transitive persistono se c’è una dipendenza non banale X  A e X non è una superchiave, anche se la relazione è nella forma 3NF perché A è parte di una chiave.&lt;br /&gt;
Proprietà delle decomposizioni;&lt;br /&gt;
- decomposizioni senza perdita, sia R uno schema di relazione e sia F un insieme di DF su R: una decomposizione di R in due schemi con insiemi di attributi X e Y si dice decomposizione senza perdita rispetto a F se per ogni istanza r di R che soddisfa le dipendenze in F, x(r) &amp;gt;&amp;lt; y ( r ) = r. Possiamo tornare alla relazione originale a partire dalle relazioni della decomposizione.&lt;br /&gt;
Tutte le decomposizioni usate per eliminare la ridondanza devono essere senza perdita d’informazione.&lt;br /&gt;
Teorema 3 sia R una relazione e F un insieme di DF che valgono su R. la decomposizione di R in due relazioni con insiemi di attributi R1 e R2 è senza perdita d’informazione se e solo se F+ contiene la DF R1R2 R1 oppure la DF R1R2 R2.   &lt;br /&gt;
- decomposizione con conservazione delle dipendenze, permette di applicare tutte le DF esaminando una singola istanza di relazione su ciascun inserimento o modifica di una tupla.&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&lt;br /&gt;
L’uso di comandi SQL in un programma scritto in un linguaggio ospite è chiamato SQL incapsulato, o embedded SQL. &lt;br /&gt;
I comandi SQL possono essere usati nel linguaggio ospite ovunque sia permesso. Ogni variabile del compilatore di quel linguaggio, usata per passare argomenti ad un comando SQL, deve essere dichiarata in SQL.&lt;br /&gt;
Devono essere dichiarate alcune variabili speciali del linguaggio ospite. Vi sono due complicazione di cui tener conto:&lt;br /&gt;
i tipi di dati riconosciuti da SQL potrebbero non essere riconosciuti dal linguaggio ospite, e viceversa,&lt;br /&gt;
SQL è orientato agli insiemi, quindi si passa all’uso dei cursori. I comandi operano su tabelle e producono tabelle, cioè insiemi.&lt;br /&gt;
I comandi possono far riferimento a variabili definite nel programma ospite, queste però devono essere precedute da due punti (:) nei comandi SQL, e devono essere dichiarate tra i comandi EXEC SQL BEGIN DECLARE SECTION ed EXEC SQL END DECLARE SECTION.&lt;br /&gt;
Si può pensare ad un cursore come se “puntasse” ad una riga nella collezione di risposte dell’interrogazione cui è associato. Quando un cursore viene aperto si posiziona appena prima della prima riga. Possiamo usare il comando FETCH per leggere la prima riga del cursore nelle variabili del linguaggio ospite. &lt;br /&gt;
Quando questo viene eseguito, il cursore viene posizionato per puntare alla riga successiva( che è la prima riga della tabella quando FETCH è eseguito per la prima volta dopo l’apertura del cursore) e i valori delle colonne nella riga sono copiarti nelle corrispondenti variabili ospiti. Eseguendo ripetutamente questo comando FETCH possiamo leggere tutte le righe calcolate dall’interrogazione, una alla volta.&lt;br /&gt;
Quando abbiamo finito col cursore usiamo il comando CLOSE.&lt;br /&gt;
Proprietà dei cursori, la forma generale della dichiarazione di un cursore è:&lt;br /&gt;
		DECLARE nome_cursore [INSENSITIVE] [SCROLL] CURSOR&lt;br /&gt;
		[WITH HOLD]&lt;br /&gt;
		FOR qualche interrogazione&lt;br /&gt;
		[ORDER BY lista-ordinamento]&lt;br /&gt;
		[FOR READ ONLY | FOR UPDATE]&lt;br /&gt;
Un cursore può essere dichiarato di sola lettura (FOR READ ONLY) oppure, se è definito su una relazione di base o una vista aggiornabile(FOR UPDATE).&lt;br /&gt;
Se è aggiornabile, semplici varianti dei comandi UPDATE e DELETE ci permettono di aggiornare o cancellare la riga su cui il cursore è posizionato&lt;br /&gt;
Un cursore è aggiornabile per default a meno che nella sua definizione sia stato specificato SCROLL e INSENSITIVE, nel qual caso è di sola lettura.&lt;br /&gt;
SCROLL;il cursore è scorrevole, quindi le varianti del comando FETCH possono essere usate per posizionarlo in maniera molto flessibile; altrimenti è consentito il solo comando FETCH di base, che sposta il cursore alla riga successiva.&lt;br /&gt;
INSENSITIVE;il cursore si comporta come se si muovesse su una copia privata della collezione di righe della risposta. Altrimenti per impostazione predefinita, le azioni di qualche altra transazione potrebbero modificare tali righe, creando comportamenti non prevedibili.&lt;br /&gt;
Un cursore mantenibile viene specificato con la clausola WITH HOLD, e non è chiuso quando la transazione termina. Se una qualunque transazione viene interrotta il sistema, potenzialmente, deve rifare parecchio lavoro. Quindi l’alternativa è spezzare la transazione in diverse transazioni, più piccole, ma ricordare la posizione nella tabella è complicato e soggetto a errori.&lt;br /&gt;
ORDER BY; può essere usata per specificare un ordinamento. La lista-ordinamento è una lista di voci di ordinamento(nome di colonna), eventualmente seguito da una delle parole chiave ASC e DESC. Ogni colonna menzionata nella clausola ORDER BY deve apparire anche nella lista-selezione dell’interrogazione associata al cursore; altrimenti non è chiaro su quali colonne effettuare l’ordinamento.&lt;br /&gt;
SQL dinamico; i due comandi principali sono PREPARE e EXECUTE:&lt;br /&gt;
	char c_stringaSQL[] =  {“DELETE FROM Velisti WHERE esperienza &amp;gt; 5”};&lt;br /&gt;
	EXEC SQL PREPARE pronto FROM: c_stringaSQL;&lt;br /&gt;
	EXE SQL EXECUTE pronto;&lt;br /&gt;
1)il primo comando dichiara la variabile C c_stringaSQL e ne imposta il valore ad una rappresentazione stringa di un comando di SQL.&lt;br /&gt;
2)la seconda istruzione fa sì che tale stringa venga esaminata e compilata come comando SQL, con l’eseguibile risultante legato alla variabile pronto&lt;br /&gt;
3)la terza istruzione esegue il comando.&lt;br /&gt;
La preparazione di un comando SQL dinamico avviene durante l’esecuzione, che ne risulta appesantita. I comandi dell’SQL interattivo e dell’SQL incapsulato possono essere preparati una volta per tutte al momento della compilazione, e poi ri-eseguiti quanto si vuole. Di fatti si deve limitare l’uso dell’SQL dinamico a quelle situazioni in cui è essenziale.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter sottomettere al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti(Downie);&lt;br /&gt;
1.Pitch Facet; la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
note sul pentagramma,&lt;br /&gt;
nome A, B,C#,&lt;br /&gt;
pitch class number 0, 1, 2,&lt;br /&gt;
solfeggio do, re mi.&lt;br /&gt;
Intervallo: è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
Melodia: insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
Chiave: viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
Contorno melodico: il pattern degli intervalli.&lt;br /&gt;
2.Temporal Facet: informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
i.Metrica&lt;br /&gt;
ii.Indicatori di tempo&lt;br /&gt;
iii.Durata del pitch&lt;br /&gt;
iv.Accenti&lt;br /&gt;
v.Durata armonica&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano(questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato)&lt;br /&gt;
Pause: possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
Informazione temporale: può essere:&lt;br /&gt;
Assoluta ( metronomo ),&lt;br /&gt;
Generale ( adagio, forte ),&lt;br /&gt;
Relativo ( schneller, langsamer ),&lt;br /&gt;
Temporal distorsion ( rubato, rallentando ).&lt;br /&gt;
3.Harmonic Facet: quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia ( caratteristica fondamentale della musica occidentale).&lt;br /&gt;
Gli eventi armonici , sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
4.Timbral Facet: comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
5.Editorial Facet: istruzioni sull’esecuzione( diteggiatura, ornamenti, istruzioni dinamiche, etc…). Anche la musica stessa può essere inclusa.&lt;br /&gt;
6.Textual Facet: è l’aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa.&lt;br /&gt;
7.Bibliographic Facet: sono informazioni relative a:&lt;br /&gt;
titolo&lt;br /&gt;
compositore&lt;br /&gt;
arrangiatore&lt;br /&gt;
editore&lt;br /&gt;
numero di catalogo&lt;br /&gt;
data pubblicazione&lt;br /&gt;
esecutori.&lt;br /&gt;
Uno degli obbiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
Interrogazioni per contenuto: confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca.&lt;br /&gt;
Per la costruzione di un DB musicale vi son tre passi:&lt;br /&gt;
1.individuare lo scopo dei dati. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
2.elencare i dati necessari, considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copy-right.&lt;br /&gt;
3.definire la miglior struttura per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni.&lt;br /&gt;
Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi son tre tipi di ricerca:&lt;br /&gt;
Browsing: può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti,&lt;br /&gt;
Textual search: indicizzazione di tutte le informazioni testuali accademiche( autore, titolo, …) e non accademiche( genere, frammenti delle liriche, …).&lt;br /&gt;
Search by content: interrogazioni basate sulla melodia o altri aspetti del contenuto audio.&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia( informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
Catalog information: sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
Multimedia characteristics: son metadadata che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette( da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
Query by content: servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
Verifica se un brano appena composto da un autore si frutto della creatività dell’artista e non influenzato da uno ascoltato in passato e poi dimenticato.&lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
a frammenti tematici: contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale,&lt;br /&gt;
database di intere partiture: sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
Query-by-humming, può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
L’approccio per questo metodo sono di due tipi: &lt;br /&gt;
DSP: elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
Simbolico: trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenza melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio( si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo(discreto) il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio(non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
Vi son dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
Note segmentation: dove sono posizionate esattamente le note?Quanto durano?&lt;br /&gt;
Pitch variation della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
Note quantization: come posizionare le altezze sulle scale musicali?&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze(di differenti ottave).&lt;br /&gt;
Sequenze di note: ogni elemento della sequenza è descritto da qualche parametro ( solitamente nome e durata della nota ).&lt;br /&gt;
Rappresentazione: &lt;br /&gt;
tutte le rappresentazioni della stessa nota vengono collassate in una sola,&lt;br /&gt;
l’alfabeto di 12 elementi, viene usato per rappresentare e dividere le altezze in semitoni,&lt;br /&gt;
questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Trasposizione: gli algoritmi per calcolare la similarità vengono applicati 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit&lt;br /&gt;
Sequenza d’intervalli: distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava.&lt;br /&gt;
È anche dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
Contorno melodico: si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to.&lt;br /&gt;
Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibili individuare univocamente il brano cercato.&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note, significa ottenere centinaia di brani simili, impossibili ascoltarli tutti per trovare quello corretto.&lt;br /&gt;
Però questo sistema è utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
Classi di equivalenza: ogni simbolo rappresenta n intervalli. &lt;br /&gt;
C1:ogni simbolo rappresenta un intervallo,&lt;br /&gt;
C3: ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
CU: tutti gli intervalli crescenti e decrescenti collassato in due differenti classi( contorno melodico ).&lt;br /&gt;
Rappresentazione Frame-based:&lt;br /&gt;
non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia,&lt;br /&gt;
il tempo viene diviso in frame di ugual misura,&lt;br /&gt;
viene stimato il valore di un pitch per ogni frame,&lt;br /&gt;
le note non sono esplicitamente descritte,&lt;br /&gt;
in un unico valore sono rappresentabili le informazioni relative ad altezza e durata.&lt;br /&gt;
Svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
Music psychology: c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, di fatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando.&lt;br /&gt;
L’interrogazione è distribuita su più voci:&lt;br /&gt;
non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando,&lt;br /&gt;
in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
memoria, che può essere a breve o lungo termine,&lt;br /&gt;
tipologia di utente, che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
Melodia: definire come una sequenza di note sia riconosciuta dall’uomo come una melodia di un brano polifonico.&lt;br /&gt;
String matching and melodic similarità: approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia f  la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e s la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
 f è fattore di x?&lt;br /&gt;
se f non appare in x, quale sottoparte di f è presente in s?&lt;br /&gt;
quante volte un’approssimazione di f è presente in s?&lt;br /&gt;
Blast algorithm: Basic Local Alignment Search Tool: uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze:&lt;br /&gt;
zone uguali o simili,&lt;br /&gt;
allineamenti globali.&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
Identità percentuale: numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi,&lt;br /&gt;
Conservazione: quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17648</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17648"/>
		<updated>2007-07-11T14:42:08Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Database e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati. Si dice '''transazione''' una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è dunque diviso in:&lt;br /&gt;
* Ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente &lt;br /&gt;
* Piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
* Gestore dello spazio sul disco&lt;br /&gt;
* Gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
* gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
* gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema.&lt;br /&gt;
&lt;br /&gt;
Un DBMS applica inoltre dei '''vincoli d’integrità''', condizioni specificate dal DBA (Database Administrator) o dall’utente finale in uno schema di base dati, che limitano i dati memorizzabili in una istanza della base dati stessa. Ci sono vincoli statici (relativi ad uno stato della base di dati) e vincoli di transizione (relativi a stati diversi della base di dati).&lt;br /&gt;
&lt;br /&gt;
Quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni ai vincoli d'integrità e in quel caso non premette le modifiche ai dati.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
==Il modello relazionale==&lt;br /&gt;
===Cos'è===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo, ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise in colonne (o campi) contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un''''istanza della base di dati'''.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
	&lt;br /&gt;
Il calcolo relazionale è un linguaggio d'interrogazione formale basato sulla logica matematica, e le interrogazioni in tale linguaggio hanno un significato preciso e intuitivo.&lt;br /&gt;
&lt;br /&gt;
L’algebra relazionale è una forma di linguaggio formale basato su una relazione di operatori per manipolare le relazioni e ha la stessa potenza del calcolo.&lt;br /&gt;
&lt;br /&gt;
Lo standard dei linguaggi SQL usa la parola table per indicare relazione.&lt;br /&gt;
CREATE TABLE, usato per definire una nuova tabella (CREATE TABLE Studenti )&lt;br /&gt;
CREATE TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	(&amp;lt; specifica colonna &amp;gt; [, &amp;lt; specifica colonna &amp;gt; ]);&lt;br /&gt;
&amp;lt; specifica colonna &amp;gt;, ha il seguente formato&lt;br /&gt;
&amp;lt; nome colonna &amp;gt; &amp;lt; dominio &amp;gt; [DEFAULT &amp;lt; valore default &amp;gt;]&lt;br /&gt;
dove &amp;lt; dominio &amp;gt; è il dominio della colonna, ed è uno dei tipi di dato SQL;&lt;br /&gt;
&amp;lt; valore default &amp;gt; è un valore del dominio, assunto dalle tuple se nessun valore è specificato per la colonna.&lt;br /&gt;
INSERT, usato per inserire le tuple&lt;br /&gt;
INSERT&lt;br /&gt;
INTO R [(C…C°)]&lt;br /&gt;
{VALUES (e…e°)| sq};&lt;br /&gt;
(e…e°) è una lista di valori da assegnare alla nuova tupla, questi sono assegnati in base ad una corrispondenza posizionale&lt;br /&gt;
sq, è una sub-query&lt;br /&gt;
le tuple generate come risposta alla sq vengono inserite nella relazione R&lt;br /&gt;
la clausola di proiezioni di sq deve contenere colonne compatibili con le colonne di R a cui si assegnano valori&lt;br /&gt;
il dominio della colonna C(i=1,…., n) deve essere compatibile con il dominio della colonna i-esima contenuta nella clausola di proiezione di SQL.&lt;br /&gt;
Tutte le colonne non esplicitamente elencate ricevono il valore nullo o il valore di default.&lt;br /&gt;
DELETE, usato per cancellare le tuple&lt;br /&gt;
DELETE&lt;br /&gt;
FROM  R[alias]&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può essere associato ad un alias se è necessario riferire a tuple di tale relazione una qualche sotto-interrogazione presente in F&lt;br /&gt;
se non viene specificata alcuna clausola di qualificazione vengono cancellate tutte le tuple.&lt;br /&gt;
UPDATE, usato per modificare i valori in una riga esistente&lt;br /&gt;
UPDATE R[alias]&lt;br /&gt;
SET C={e |NULL},…, C°={e° | NULL}&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può avere associato un alias se è necessario riferire tuple di tale relazione in una qualche sotto-interrogazione presente in F&lt;br /&gt;
C={e |NULL},…, C°={i=1 | NULL}, è un’espressione di assegnamento che specifica che alla colonna C, deve essere assegnato il valore dell’espressione e.&lt;br /&gt;
Questa può essere una costante, spesso funzione dei valori correnti delle tuple da modificare, o una sub-query&lt;br /&gt;
si può specificare che alla colonna sia assegnato il valore nullo.&lt;br /&gt;
&lt;br /&gt;
===Integrità referenziale===&lt;br /&gt;
&lt;br /&gt;
Integrità referenziale; rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,….,Vn, allora deve esistere nella relazione riferita una tupla t° con valori di chiave V1,….,Vn.&lt;br /&gt;
VINCOLI DI CHIAVE è l’imposizione che un certo sottoinsieme minimale dei campi di una relazione sia un identificatore unico per una tupla. Un insieme di campi che identificano univocamente una tupla secondo un vincolo di chiave si chiama chiave candidata per la relazione, altresì chiamata chiave.&lt;br /&gt;
due tuple distinte in una istanza legale non possono avere valori uguali in tutti i campi di una chiave. In ogni istanza legale i valori nei campi chiave identificano univocamente una tupla di una istanza.&lt;br /&gt;
nessun sottoinsieme dell’insieme dei campi di una chiave è un identificatore unico della tupla.&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Se ci sono altri vincoli, alcuni sottoinsiemi dei campi possono formare una chiave, ma se ciò non si verifica l’insieme di tutti i campi è una chiave&lt;br /&gt;
Chiave primaria, si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave. Per definire una chiave primaria in SQL viene usato il comando PRIMARY KEY, mentre per dichiarare un sottoinsieme delle colonne di una tabella si usa UNIQUE. Nella scelta di una chiave primaria è meglio usarne una, candidata, che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
Chiave esterna, deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi. Se una relazione R ha trai suoi attributi un insieme di attributi che costituisce la chiave di una relazione R, allora tale insieme è una chiave esterna di R su R°. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni. Quindi una tupla che deve riferire ad un’altra tupla include tra i suoi attributi uno o più di essi, il cui valore è quello della chiave della seconda tupla.&lt;br /&gt;
 La presenza di NULL in una chiave esterna non viola il vincolo di chiave. Il comando in SQL è FOREIGN KEY che ha delle opzioni aggiuntive, sul come comportarsi una volta implementata la chiave esterna. &lt;br /&gt;
	FOREIGN KEY(&amp;lt; lista nomi colonne &amp;gt;)&lt;br /&gt;
	REFERENCES &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	 [ON DELETE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
	[ ON UPDATE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
l’opzione predefinita è NO ACTION(l’azione deve essere ignorata).&lt;br /&gt;
CASCADE dice che se una riga viene cancellata, tutte le sue righe che la referenziano devono essere eliminate. Lo stesso vale per il caso di un UPDATE, dove l’aggiornamento viene propagato a ciascuna riga,&lt;br /&gt;
ON DELETE permette di specificare le azioni da eseguire nel caso di cancellazione di una tupla riferita tramite chiave esterna,&lt;br /&gt;
ON UPDATE permette di specificare le azioni da eseguire nel caso di modifica del valore di chiave di una tupla riferita tramite chiave esterna&lt;br /&gt;
Per default un vincolo viene verificato al termine di ogni istruzione SQL che potrebbe portare ad una violazione, e se questa ci fosse il comando viene rifiutato.&lt;br /&gt;
L’SQL permette di specificare che un vincolo sia in modalità DEFERRED o IMMEDIATE: SET CONSTRAINT vincolo DEFERRED.&lt;br /&gt;
Un’interrogazione di una base di dati relazionale è una domanda sui dati, e la risposta consiste in una nuova relazione contenente il risultato. Un esempio di query è:&lt;br /&gt;
	SELECT*&lt;br /&gt;
	FROM&lt;br /&gt;
	WHERE&lt;br /&gt;
*significa che vogliamo tutti i campi delle tuple che compongono il risultato.&lt;br /&gt;
Una vista è una tabella le cui righe non sono esplicitamente memorizzate nella base dati, ma sono calcolate quando necessario in base a una definizione di vista.&lt;br /&gt;
Questa può essere usata come in una tabella di base per definire nuove interrogazioni o viste.&lt;br /&gt;
DROP TABLE, per eliminare una tabella e la sua forma è:&lt;br /&gt;
		DROP TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
			{ RESTRICT | CASCADE };&lt;br /&gt;
se viene specificata l’opzione RESTRICT, la relazione viene cancellata solo se non è riferita da altri elementi dello schema della base di dati;&lt;br /&gt;
se viene specificata l’opzione CASCADE, la relazione e tutti gli elementi dello schema della base di dati che eventualmente la riferiscono vengono cancellati.&lt;br /&gt;
ALTER TABLE, modifica la struttura di una tabella esistente e la sua forma è:&lt;br /&gt;
		ALTER TABLE &amp;lt; nome relazione &amp;gt; &amp;lt; modifica &amp;gt;;&lt;br /&gt;
&amp;lt; modifica &amp;gt; è la modifica da effettuare, tra l’aggiunta di una nuova colonna, modifica di una colonna e l’eliminazione.&lt;br /&gt;
ALGEBRA RELAZIONALE: linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori, e ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione con risultato.&lt;br /&gt;
Invece un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
Selezione ; l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione Booleana di termini che hanno la forma attributo op costante oppure attributo1 op attributo2, dove op è uno degli operatori di confronto &amp;lt;,&amp;lt;=,=,=&amp;gt;,&amp;gt;,.&lt;br /&gt;
Proiezione ; l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
UNIONE, RS restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione R oppure S. Due istanze sono dette compatibili rispetto all’unione quando: &lt;br /&gt;
1) hanno lo stesso numero dei campi;&lt;br /&gt;
2) campi corrispondenti hanno lo stesso dominio. &lt;br /&gt;
INTERSEZIONE, RS restituisce un’istanza contenente tutte le tuple presenti sia in R che in S&lt;br /&gt;
DIFFERENZA, R-S restituisce un’istanza contenente tutte le tuple presenti in R ma non in S. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a R&lt;br /&gt;
PRODOTTO CARTESIANO, RxS restituisce un’istanza di relazione il cui schema contiene tutti i campi di R seguiti da tutti i campi di S. Il risultato di RxS contiene una tupla |r,s|.&lt;br /&gt;
Rinomina , usato per rinominare le tabelle.&lt;br /&gt;
JOIN: usato per combinare informazioni da due o più relazioni. Un predicato di JOIN esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
JOIN CONDIZIONALE; la versione più generale dell’operatore di join accetta una condizione di join c e un paio di istanze di relazione come argomenti e restituisce un’istanza di relazione.&lt;br /&gt;
      c (RxS)&lt;br /&gt;
EQUIJOIN; lo si ha quando la condizione di join consiste solamente di uguaglianze della forma R.nome1=S.nome2. In questo caso mantenere entrambi gli attributi sarebbe ridondante come cosa. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui S.nome2 viene scartato. Lo schema del risultato di un equijoin contiene i campi di R, seguiti dai campi di  che non appaiono condizioni di join.&lt;br /&gt;
JOIN NATURALE; è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in R e S. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome. C’è anche da dire che non corrisponde ad un operatore di NATURAL JOIN,dato che non si esegue alcuna proiezione, e lo scema risultante è quello del prodotto cartesiano. La sua forma è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; NATURAL JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
JOIN ESTERNI(pg99); questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL,&lt;br /&gt;
R OUTER JOIN S&lt;br /&gt;
Esistono diverse varianti dell’OUTER JOIN;&lt;br /&gt;
1.FULL: sia le tuple di R che quelle di S che non partecipano  al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
2.LEFT: le tuple di R che non partecipano al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
3.RIGHT: le tuple S che non partecipano al JOIN vengono completate ed inserite nel risultato.&lt;br /&gt;
CROSS JOIN; questi operatori poiché producono relazioni possono essere usati nella clausola FROM. È la forma di operatore JOIN più semplice che corrisponde al prodotto cartesiano. La sua sintassi è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; CROSS JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
DIVISIONE, l’operazione di divisione A/B è l’insieme di tutti valori di x(in forma di tuple unarie) tali che per ogni valore y in B, ci sia una tupla |x,y| in A. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti(un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A).Le tuple interdette possono esser calcolate così: x(( x (A) x B) – A).&lt;br /&gt;
&lt;br /&gt;
SQL:I linguaggi di basi dati come SQL permettono all’utente di specificare per quali relazioni e quali attributi è necessario mantenere l’integrità referenziale( e le azioni da eseguire in caso di violazione). La forma base di un’interrogazione SQL è: &lt;br /&gt;
SELECT [DISTINCT] lista-select&lt;br /&gt;
FROM lista-from&lt;br /&gt;
WHERE qualificazione&lt;br /&gt;
Lista-select, è una lista di nomi di colonne delle tabelle nominate nella lista-from. I nomi di colonne possono avere come prefisso una variabile di range.&lt;br /&gt;
Lista-from, è una lista di nomi di tabelle. Un nome di tabella può essere seguito da una variabile di range(questa è utile quando lo stesso nome di tabella appare più volte nella lista-from).&lt;br /&gt;
Qualificazione, è una combinazione booleana di condizioni nella forma espressione op espressione, dove op è uno degli operatori di confronto.&lt;br /&gt;
Ogni interrogazione deve avere una clausola SELECT, che specifica le colonne da includere nel risultato, e una clausola FROM, che specifica un prodotto cartesiano di tabelle. La clausola opzionale WHERE specifica condizioni di selezione sulle tabelle menzionate nella clausola FROM.&lt;br /&gt;
Se omettiamo la parola chiave DISTINCT, otterremo una copia della riga (v,e), e la risposta sarebbe un multi-insieme di righe. &lt;br /&gt;
Il processo d’interrogazione di un DB consta in:&lt;br /&gt;
caricamento della lista di attributi;&lt;br /&gt;
scarto delle tuple che non soddisfano la qualificazione;&lt;br /&gt;
eliminazione degli attributi che non sono nella lista-from.&lt;br /&gt;
Un multi-insieme è un simile ad un insieme, nel senso che è una collezione non ordinata di elementi, ma possono esserci diverse copie, e il numero di copie è significativo: due multi-insiemi possono avere gli stessi elementi e tuttavia essere diversi, poiché il numero di copie dello stesso elemento è diverso.&lt;br /&gt;
Tipi numerici esatti:&lt;br /&gt;
INTEGER; la precisione di questo tipo di dato è espressa in numero di bit, a seconda della specifica implementazione di SQL,&lt;br /&gt;
SMALLINT; l’unico requisito è che la precisione di questo tipo di dato sia non maggiore della precisione del tipo di dato INTEGER. Questo viene usato per eventuali ottimizzazioni in quanto i valori richiedono minore spazio di memorizzazione,&lt;br /&gt;
BIGINT; l’unico requisito è che la precisione di questo tipo di dato sia non minore della precisione del tipo di dato INTEGER,&lt;br /&gt;
NUMERIC; caratterizzato da una precisione(numero totale di cifre) e una scala(numero di cifre dopo la virgola), il valore default per la precisione è 1 e per la scala è 0,&lt;br /&gt;
DECIMAL; simile a NUMERIC, ma la specifica di questo tipo di dato ha la forma: DECIMAL[(precisione[,scala])].&lt;br /&gt;
Tipi numerici approssimati:&lt;br /&gt;
REAL; rappresenta valori reali a singola precisione in virgola mobile, e la precisione dipende dalla specifica implementazione si SQL,&lt;br /&gt;
DOUBLE PRECISION; rappresenta valori reali a doppia precisione in virgola mobile, e questa dipende sempre dall’implementazione di SQL(però deve essere maggiore della precisione di tipo REAL),&lt;br /&gt;
FLOAT; rappresenta valori reali alla precisione desiderata, ed ha la forma FLOAT[(precisione)]. La precisione minima specificabile è 1.&lt;br /&gt;
Tipi di dato carattere:&lt;br /&gt;
CHARACTER; rappresenta stringhe di caratteri di lunghezza predefinita, spesso abbreviato in CHAR. La specifica ha il formato CHAR[(n)], con n lunghezza delle stringhe. E’ possibile usare come valore una stringa di lunghezza inferiore a n, che viene completata con spazi fino a raggiungere tale lunghezza,&lt;br /&gt;
CHARACTER VARYING; rappresenta stringhe di caratteri di lunghezza massima predefinita. Spesso abbreviato in VARCHART, e la sua forma è VARCHART(n), dove n è la lunghezza massima delle stringhe.&lt;br /&gt;
Tipi di dato temporali:&lt;br /&gt;
DATE; rappresenta le date espresse come anno(4cifre), mese(2cifre) e giorno(2cifre),&lt;br /&gt;
TIME; rappresenta i tempi espressi come ora(2cifre), minuto(2cifre) e secondo(2cifre),&lt;br /&gt;
TIMESTAMP; rappresenta una “concatenazione” fra DATE e TIME. Permette di rappresentare timestamp che consistono in: anno, mese, giorno, ora, minuto, secondo e microsecondo,&lt;br /&gt;
INTERVAL; rappresenta una durata temporale in riferimento ad uno o più qualificatori. I valori di questo tipo son rappresentati dalla parola chiave INTERVAL seguita da una stringa che esprime la durata in termini di uno o più qualificatori. Se sono presenti due qualificatori, il primo è più ampio del secondo e sono separati dalla parola chiave TO.&lt;br /&gt;
Tipo di dato:&lt;br /&gt;
BOOLEAN; i valori di tali tipo sono TRUE, FALSE, UNKNOWN(questo viene introdotto per la gestione dei confronti con valori nulli,&lt;br /&gt;
CHARACTER LARGE OBJECT(CLOB); permette di rappresentare sequenze di caratteri di elevate dimensioni,&lt;br /&gt;
BINARY LARGE OBJECT(BLOB); permette di rappresentare sequenze di bit di elevate dimensioni. &lt;br /&gt;
E’ possibile convertire un valore ad un altro tipo mediante l’operatore di CAST&lt;br /&gt;
		CAST (e) AS &amp;lt; tipo target &amp;gt;&lt;br /&gt;
AS: per introdurre una variabile di range.&lt;br /&gt;
I nomi delle tabelle possono essere implicitamente usati come variabili in linea. Si ha la necessità di introdurre esplicitamente le variabili di range solo quando la clausola FROM contiene più di una occorrenza di una relazione. Se una variabile di range è stata introdotta nella relazione, un nome di tabella non può essere usato come variabile di range esplicita.&lt;br /&gt;
Ogni elemento in una lista-select può essere della forma espressione AS nome_colonna ( questo è il nuovo nome che la colonna avrà nel risultato dell’interrogazione. Inoltre, ogni termine in una qualificazione può anche essere rappresentato nella forma generale espressione1 = espressione2.&lt;br /&gt;
L’SQL permette il pattern matching, su valori di tipo stringa, attraverso l’uso dell’operatore LIKE, insieme all’uso dei caratteri jolly %( zero o più caratteri qualunque) e ( esattamente un carattere qualunque). Quindi “AB%” denota una qualunque stringa che contiene almeno tre caratteri, con il secondo ed il terzo uguali a A e B.&lt;br /&gt;
SQL fornisce tre comandi per la manipolazione degli insiemi che estendono la forma d’interrogazione basilare, e sono:&lt;br /&gt;
UNION, restituisce tutte le tuple distinte restituite da almeno una delle sotto-interrogazioni a cui è applicato. Se si usa la clausola ORDER BY, questa deve essere usata una sola volta alla fine dell’interrogazione e non alla fine di ogni SELECT,&lt;br /&gt;
INTERSECT, corrisponde all’intersezione, restituisce le tuple restituite da entrambe le sotto interrogazioni a cui è applicato.&lt;br /&gt;
EXCEPT, corrisponde alla differenza, e restituisce le tuple della seconda sotto-interrogazione a cui è applicato.&lt;br /&gt;
Questo linguaggio fornisce anche altre operazioni sugli insiemi:&lt;br /&gt;
IN, per controllare se un elemento è in un dato insieme. C IN(v,….v°), nella forma negata C NOT IN(v,….v°).&lt;br /&gt;
ANY&lt;br /&gt;
ALL, per confrontare un valore con gli elementi di un dato insieme, usando l’operatore di confronto op&lt;br /&gt;
EXISTS, per controllare se un insieme è vuoto.&lt;br /&gt;
BETWEEN, permette di determinare le tuple che contengono in un dato attributo valori in un intervallo dato. C BETWEEN v AND v° , nella forma negata invece C NOT BETWEEN v AND v°,&lt;br /&gt;
ABS(N); calcola il valore assoluto del valore numerico N,&lt;br /&gt;
MOD(n,b); calcola il resto intero della divisione n per b.&lt;br /&gt;
UNION, INTERSECT ed EXCEPT possono essere usati su qualsiasi coppia di tabelle che siano compatibili rispetto all’unione, cioè che abbiamo lo stesso numero e tipo di colonne.&lt;br /&gt;
Nel caso si UNION i duplicati vengono eliminati automaticamente. Per mantenerli è necessario aggiungere ALL (UNION ALL). Lo stesso discorso vale per INTERSECT ed EXCEPT.&lt;br /&gt;
Espressioni e funzioni: un’espressione usata nella clausola di proiezione di un’interrogazione, dà luogo ad una colonna, detta virtuale, non presente nella relazione su cui si effettua l’interrogazione.&lt;br /&gt;
Le colonne virtuali non sono fisicamente memorizzate, ma sono calcolate dinamicamente come risultato dell’esecuzione dell’interrogazione. &lt;br /&gt;
Espressioni e funzioni per stringhe:&lt;br /&gt;
Operatore di concatenazione denotato da ||,&lt;br /&gt;
LENGHT(str), restituisce la lunghezza della stringa str, in numero di caratteri,&lt;br /&gt;
UPPER(str) e LOWER(str), trasformano la stringa str in caratteri tutti maiuscoli o tutti minuscoli, rispettivamente,&lt;br /&gt;
SUBSTR(str, m,[n]), estrae dalla stringa str la sottostringa dal carattere di posizione m per una lunghezza n,&lt;br /&gt;
TRIM[str°] FROM str, elimina dalla stringa str° i caratteri in str.&lt;br /&gt;
Un’interrogazione annidata è un’interrogazione che al suo interno ha un’altra interrogazione. Questa solitamente appare nella clausola WHERE, o anche in FROM o HAVING. Se una sub-query scalare restituisce più di una tupla si genera un errore di run-time, e se nessuna tupla verifica la sotto-interrogazione, viene restituito il valore NULL.&lt;br /&gt;
E’ anche possibile selezionare più di una colonna tramite sotto-interrogazioni, in tal caso è necessario apporre delle parentesi alla lista delle colonne a sinistra dell’operatore di confronto. Ad esempio, voglio elencare gli impiegati con la stessa mansione di Martini;&lt;br /&gt;
		SELECT Nome FROM Impiegati&lt;br /&gt;
		WHERE(Mansione, Stipendio) = (SELECT&lt;br /&gt;
			Mansione, Stipendio FROM Impiegati&lt;br /&gt;
				WHERE Nome = “Martini”);&lt;br /&gt;
Una sub-query può contenere a sua volta un’altra sub-query. E’ possibile definire sotto-interrogazioni che sono eseguite ripetutamente per ogni tupla candidata considerata nella valutazione dell’interrogazione esterna, e ogni volta che questa considera una tupla candidata, deve invocare la sotto-interrogazione. Questo tipo viene chiamato correlato, dato che ogni esecuzione è correlata al valore di uno o più attributi delle tuple candidate nell’interrogazione principale. Per poter fare riferimento alle colonne delle tuple candidate nell’interrogazione esterna si fa uso degli alias di relazione(questo è definito nell’interrogazione esterna e riferito nella sotto-interrogazione correlata. Sono utili quando si vuole fare riferimento a due diverse tuple della stessa relazione.).&lt;br /&gt;
UNIQUE, quando applichiamo questo comando ad una sotto-interrogazione, la condizione che ne risulta ritorna vero se  nessuna riga appare due volte nella risposta all’interrogazione, se non ci sono duplicati. Ritorna vero se la risposta è vuota.&lt;br /&gt;
Operatori di aggregazione:&lt;br /&gt;
COUNT ([DISTINCT] A) , è numero di valori unici della colonna A,&lt;br /&gt;
SUM ([DISTINCT] A) , la somma di tutti i valori unici nella colonna A,&lt;br /&gt;
AVG ([DISTINCT] A) , la media di tutti i valori unici nella colonna A,&lt;br /&gt;
MAX (A) , il valore massimo della colonna A,&lt;br /&gt;
MIN (A) , il valore minimo della colonna A.&lt;br /&gt;
Non ha senso specificare DISTINCT insieme a MIN e MAX.&lt;br /&gt;
Le clausole GROUP BY e HAVING;&lt;br /&gt;
		SELECT [DISTINCT]  lista-select&lt;br /&gt;
		FROM lista-from&lt;br /&gt;
		WHERE qualificazione&lt;br /&gt;
		GROUP BY lista gruppo&lt;br /&gt;
		HAVING  qualificazione gruppo.&lt;br /&gt;
La lista-select consiste di una lista di nomi di colonne e una lista di termini della forma aggop(nome-colonna) AS nuovo-nome. Ogni colonna che appare nella lista dei nomi deve apparire nella lista-gruppo.&lt;br /&gt;
Le espressioni che compaiono nella qualificazione gruppo della clausola HAVING devono avere un singolo valore per gruppo. L’idea di base è che la clausola HAVING         ( può essere una combinazione Booleana di predicati, i quali tuttavia possono solo coinvolger funzioni di gruppo) determina se per ogni gruppo dato debba essere generata una riga della risposta.&lt;br /&gt;
Un’importante restrizione ci dice che una clausola di protezione di una query contenente GROUP BY può includere solamente:&lt;br /&gt;
una o più colonne tra le colonne che compaiono nella suddetta clausola,&lt;br /&gt;
funzioni di gruppo(che possono apparire in funzioni aritmetiche).&lt;br /&gt;
Le funzioni di gruppo permettono di estrarre informazioni da gruppi di tuple invece di una relazione, queste si basano su due concetti:&lt;br /&gt;
il partizionamento delle tuple di un relazione in base al valore di uno o più colonne della relazione,&lt;br /&gt;
il calcolo della funzione di gruppo per ogni gruppo ottenuto col partizionamento. &lt;br /&gt;
Una funzione di gruppo ha come argomento una colonna e si applica all’insieme dei valori di questa colonna, estratti dalle tuple che appartengono allo stesso gruppo.&lt;br /&gt;
E’ possibile applicare queste funzioni senza partizionamento e in tal caso saranno applicate ad un unico gruppo contente tutte le tuple della relazione.&lt;br /&gt;
Se GROUP BY viene omesso l’intera tabella viene vista come un singolo gruppo&lt;br /&gt;
COUNT, se questo non include DISTINCT, allora COUNT(*) dà la stessa risposta di COUNT(x), dove x è un qualunque insieme di attributi.&lt;br /&gt;
L’SQL fornisce un valore di colonna speciale chiamato null da usare quando il valore della colonna è sconosciuto oppure inapplicabile.&lt;br /&gt;
Possiamo impedire l’uso dei valori null specificando NOT NULL come parte della definizione dei campi. Inoltre i campi in una chiave primaria non posso assumere valori null, quindi vi è un vincolo di NOT NULL, implicito per ogni campo elencato in un vincolo di PRIMARY KEY.&lt;br /&gt;
Si può specificare vincoli sulla tabella usando vincoli di tabella, che hanno la forma CHECK espressione-condizionale.&lt;br /&gt;
In un comando CREATE TABLE, la clausola CHECK può comparire;&lt;br /&gt;
di seguito alla definizione di una colonna ( vincoli di CHECK su colonna )&lt;br /&gt;
come clausola separata dall’interno della definizione della relazione ( vincoli CHECK su relazione ).&lt;br /&gt;
Specificando un vincolo CHECK vogliamo che ogni tupla nella relazione soddisfi la condizione. E’ consigliabile esprimere tramite CHECK solo le condizioni che devono essere verificate da ogni singola tupla della relazione cui associamo il vincolo.&lt;br /&gt;
E’ possibile assegnare nome ai vincoli associati alle definizioni di relazione facendo seguire la specifica del vincolo nella parola chiave CONSTRAINT e dal nome. Difetti specificare un nome per tutti i vincoli è utile per potersi poi riferire ad essi.&lt;br /&gt;
Le asserzioni servono per esprimere vincoli di integrità che coinvolgono più tuple o relazioni, e vengono così formulate:&lt;br /&gt;
		CREATE ASSERTION &amp;lt; nome asserzione &amp;gt;&lt;br /&gt;
		CHECK(&amp;lt; condizione &amp;gt;).&lt;br /&gt;
I vincoli di una tabella sono associati ad una tabella singola. Il soddisfacimento di questi vincoli è richiesto solo se la tabella associata è vuota, quando un vincolo coinvolge due o più tabelle, il meccanismo di vincoli sulle tabelle è in qualche modo anomalo, e non ciò che si desidera.&lt;br /&gt;
Un trigger è una procedura che viene eseguita dal DBMS in risposta a specifici cambiamenti nella base di dati ed è definita dal DBA. Questi son divisi in tre parti:&lt;br /&gt;
evento: un cambiamento nella base di dati che attiva il trigger;&lt;br /&gt;
condizione: un’interrogazione o un test che viene eseguito quando il trigger è attivato;&lt;br /&gt;
azione; procedura che viene eseguita quando il trigger è attivato e la sua condizione è verificata.&lt;br /&gt;
Una condizione di trigger può essere un comando vero/falso oppure un’interrogazione. Questa viene interpretata come vero se l’insieme di risposta non è vuoto, falso se l’opposto. L’azione di un trigger può esaminare la risposta all’interrogazione nella parte condizionale dei trigger , fare riferimento a valori vecchi e nuovi delle tuple modificate dal comando che ha attivato il trigger, eseguire nuove interrogazioni e apportare cambiamenti alla base di dati.&lt;br /&gt;
&lt;br /&gt;
Progettazione di una base dati:&lt;br /&gt;
1)Analisi dei requisiti: il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni  devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
2)Progettazione concettuale della base di dati: le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare. Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
3)Progettazione logica della base dati:  dobbiamo scegliere un DBMS per implementare in nostro progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
4)Raffinamento dello schema: analizzare l’insieme di relazioni del nostro schema relazionale per identificare potenziali problemi, e a rifinirlo.&lt;br /&gt;
5)Progettazione fisica della base di dati: consideriamo i carichi di lavoro attesi che la nostra base di dati dovrò sopportare, e raffiniamo il progetto per garantire che esso soddisfi i criteri di prestazioni richieste. Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
6)Progettazione delle applicazioni e della sicurezza.&lt;br /&gt;
Una entità è un oggetto nel mondo reale che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un’astrazione della realtà la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. La coppia (nome_di_attributo, dominio) viene chiamata attributo e ogni entità è caratterizzata da uno o più attributi(i quali possono essere monovalore, multivalore e compositi).&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
semplice, sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
composti, l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini i un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica. &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una chiave. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come chiave primaria. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli ovali, e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei rettangoli.&lt;br /&gt;
Una relazione è un’associazione tra due o più entità.&lt;br /&gt;
Come per le entità potremmo voler raccogliere un gruppo di relazioni simili in un insieme di relazioni. Questo può essere visto come un insieme di n-tuple:&lt;br /&gt;
{( e1,… en)  E1,…,en   En}&lt;br /&gt;
Ciascuna n-tupla denota una relazione che coinvolge n entità, da e1 a en, dove l’entità ei appartiene all’insieme di entità Ei.&lt;br /&gt;
Una relazione può anche avere attributi descrittivi, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante.&lt;br /&gt;
Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
Ruolo, è la funzione che un’istanza di entità esercita nell’ambito di un’associazione, e nel caso di un’associazione unaria il ruolo è sempre necessario.&lt;br /&gt;
Il modello ER offre costrutti per definire: &lt;br /&gt;
vincoli di cardinalità, sia per associazioni che per attributi. Questi si dividono in cardinalità minima( numero minimo d’istanze di un’associazione a cui le istanze delle entità coinvolte nell’associazione possono partecipare) e cardinalità massima( numero massimo di un’associazione a cui le istanze dell’entità coinvolte nell’associazione posso partecipare).&lt;br /&gt;
Data un’entità E ed un’associazione A: &lt;br /&gt;
i.c_max=1, ogni istanza di E può partecipare a non più di un’istanza di A,&lt;br /&gt;
ii.c_max=c_min=1, ogni istanza i E partecipa ad una ed una sola istanza di A,&lt;br /&gt;
iii.c_min=0, c_max=n, ogni istanza di E può partecipare ad un numero qualsiasi di istanze di A, anche nessuna.&lt;br /&gt;
vincoli d’identificazione, per entità. Identificatori per un’entità: insieme di attributi e/o entità che identificano le istanze dell’entità. Un identificatore è minimale se qualsiasi sottoinsieme proprio non è un identificatore. Le entità deboli ha  sempre cardinalità(1,1) rispetto all’associazione attraverso cui avviene l’dentificazione.&lt;br /&gt;
Uno a uno: se c_max di E e di E°, rispetto ad A è 1;&lt;br /&gt;
Uno a molti: se c_max di E rispetto ad A è n e c_max di E° rispetto ad A è 1, o viceversa. Un impiegato può essere associato a molti altri reparti.&lt;br /&gt;
Molti a molti: l’insieme di relazioni Lavora_in, in cui un impiegato può lavorare in diversi reparti e ogni reparto può avere diversi impiegati.&lt;br /&gt;
Insieme di entità deboli: se c_max di E e di E°, rispetto ad A è n. Questa viene identificata univocamente solo considerando alcuni attributi in congiunzione con la chiave primaria di un’altra entità, che è chiamata  proprietario identificante. Devono valere queste condizioni:&lt;br /&gt;
l’insieme di entità proprietarie e l’insieme di entità deboli devono partecipare in un insieme di relazioni uno-a-molti. Questo insieme di relazioni è chiamato insieme di relazioni identificanti dell’insieme di relazioni deboli&lt;br /&gt;
l’insieme di entità deboli deve aver partecipazione totale nell’insieme di relazioni identificanti.&lt;br /&gt;
Per identificare che si ha un’entità debole si usa un tratto più spesso.                  &lt;br /&gt;
Mentre per indicare che si ha una chiave parziale si userà una sottolineatura a tratti. &lt;br /&gt;
La specializzazione è il processo con cui s’individuano sottoinsiemi di un insieme di entità(la superclasse) che condividono alcune caratteristiche distintive. Tipicamente, la superclasse viene definita per prima,poi le sottoclassi, ed infine si aggiungono gli attributi specifici e gli insiemi di relazioni.&lt;br /&gt;
La generalizzazione consiste nell’identificare alcune caratteristiche comuni a una collezione di insiemi di entità e creare un nuovo insieme di entità che contiene quelle entità che possiedono caratteristiche comuni. Le sottoclassi si definiscono per prime, poi le superclassi, e poi si aggiungono tutti gli insiemi di relazioni che coinvolgono la superclasse.&lt;br /&gt;
I vincoli di disgiunzione determinano se a due sottoclassi è premesso contenere la stessa identità.&lt;br /&gt;
I vincoli di copertura determinano se le entità di una sottoclasse includono, nel loro complesso tutte le entità della superclasse.&lt;br /&gt;
L’aggregazione ci permette di indicare che un insieme di relazioni partecipa in un altro insieme di relazioni. Ciò viene illustrato con un riquadro tratteggiato intorno all’insieme di relazioni.&lt;br /&gt;
L’uso di un modello di dati semantico di alto livello offre nella progettazione concettuale il vantaggio addizionale che il progetto ad alto livello può essere rappresentato con diagrammi e facilmente compreso dalle molte persone che devono fornire informazioni utili al processo progettuale.&lt;br /&gt;
L’approccio normale consta nel considerare le necessità dei vari gruppo di utenti, risolvere i conflitti e generare un singolo insieme di requisiti. Un altro tipo di approccio consiste nello sviluppare schemi concettuali separati per i diversi gruppi di utenza, per poi integrarli. Per fare ciò si deve stabilire le corrispondenze tra le entità, le relazioni e gli attributi, e risolvere diversi tipi di conflitti.&lt;br /&gt;
&lt;br /&gt;
Un insieme di entità è tradotto in una relazione in maniera molto semplice: ogni attributo di un insieme di entità diventa un attributo della tabella.&lt;br /&gt;
Per rappresentare una relazione, dobbiamo potere identificare ciascuna entità partecipante, e dare valori agli attributi descrittivi della relazione, quindi:&lt;br /&gt;
gli attributi della chiave primaria di ciascun insieme di entità partecipante, come campi di chiavi esterne&lt;br /&gt;
gli attributi descrittivi dell’insieme di relazioni.&lt;br /&gt;
Se un insieme di relazioni coinvolge n insiemi di entità, e m di essi sono collegati con frecce ne diagramma ER, la chiave per ciascuno di questi m insiemi costituisce una chiave per la relazione in cui l’insieme è tradotto. Quindi abbiamo m  chiavi candidate, e una di queste dovrebbe essere scelta come chiave primaria.&lt;br /&gt;
Un secondo approccio per tradurre un insieme di relazioni con vincoli di chiave si rivela spesso migliore, perché evita di creare una tabella distinta per l’insieme di relazioni.&lt;br /&gt;
L’idea è di includere le informazioni sull’insieme di relazioni nella tabella corrispondente all’insieme di entità con la chiave, sfruttando il vincolo di chiave.&lt;br /&gt;
Lo svantaggio in questo è che potrebbe esserci uno spreco di spazio. In tal caso i campi aggiunti dovrebbero essere riempiti con valori null. La prima traduzione evita questa inefficienza, ma alcune interrogazioni importanti richiedono di combinare informazioni da due relazioni, il che può essere un operazione lenta.&lt;br /&gt;
Un insieme di entità deboli partecipa sempre in una relazione binaria uno-a-molti e ha vincoli di chiave e di partecipazione totale. Questa ha solo una chiave parziale, e quando un’entità proprietaria viene cancellata, vogliamo che vengano eliminate anche le entità deboli collegate.&lt;br /&gt;
&lt;br /&gt;
==PROGETTAZIONE CONCETTUALE==&lt;br /&gt;
&lt;br /&gt;
La progettazione concettuale di una base di dati ci fornisce un insieme di schemi di relazione e VI che possono essere considerati un buon punto di partenza per il progetto finale. Permette di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale.&lt;br /&gt;
Presentiamo ora una panoramica sui problemi che il raffinamento degli schemi intendo risolvere:&lt;br /&gt;
problemi causati dalla ridondanza: memorizzare la stessa informazione in maniera ridondante, cioè in diversi posti all’interno della stessa base di dati può portare a diversi problemi: &lt;br /&gt;
memorizzazione ridondante;&lt;br /&gt;
anomalie da aggiornamento, se una coppia di questi dati ripetuti viene aggiornata si crea un’inconsistenza, a meno di aggiornare anche tutte le altre copie;&lt;br /&gt;
anomalie da inserimento, potrebbe non essere possibile registrare certe informazioni, a meno di inserire anche qualche altra informazione non correlata;&lt;br /&gt;
anomalie di cancellazione.&lt;br /&gt;
Idealmente vorremmo degli schemi che non permettano ridondanza, ma quanto meno vogliamo poter identificare gli schemi che lo permettono:&lt;br /&gt;
valori null: questi non possono fornire una soluzione completa, ma possono aiutare. Questi valori possono essere utili per le anomalie da inserimento e cancellazione.&lt;br /&gt;
decomposizione, la ridondanza nasce quando uno schema relazionale forza una associazione tra attributi che non è naturale. Le dipendenze funzionali possono essere usate per identificare tali situazioni e per suggerire raffinamenti dello schema. Molti problemi che nascono dalla ridondanza possono essere risolti sostituendo una relazione con una collezione di relazioni “più piccolo”. Una decomposizione di uno schema di relazione r consiste nella sostituzione della schema di relazione con due(o più) schemi di relazione ciascuno dei quali contiene un sottoinsieme di attributi di R, e la cui unione include tutti tali attributi. Noi vogliamo memorizzare le informazioni in ogni data istanza di r memorizzandone le proiezioni. Se non si sta attenti con la decomposizione si possono creare più problemi di quanti se ne vogliano.&lt;br /&gt;
 la proprietà senza perdita(lossless join) ci permette di recuperare qualunque istanza di una relazione decomposta a partire dalle corrispondenti istanze delle relazioni componenti tramite operazioni di join;&lt;br /&gt;
la proprietà di  conservazione delle dipendenze ci consente di mantenere qualunque vincolo della relazione originaria semplicemente imponendo alcuni vincoli su ciascuna delle relazioni componenti. Ossia non abbiamo bisogno di effettuare join delle relazioni più piccolo per controllare se viene violato un vincolo della relazione originale.&lt;br /&gt;
La decomposizione  potrebbe migliorare le prestazioni, nel caso in cui la maggior parte delle interrogazioni degli aggiornamenti  esaminano solo una delle relazioni componenti, che è più piccola della relazione originale.&lt;br /&gt;
Dipendenze funzionali: DF è un tipo di VI che generalizza il concetto di chiave. Sia R uno schema di relazione e siano X e Y insiemi non vuoti di attributi di R, diciamo che un’istanza r di R soddisfa la DF X  Y (si  legge X determina funzionalmente Y, o X determina Y) se per ogni coppia di tuple t1 e t2 in r vale al seguente:&lt;br /&gt;
se t1.X  =  t2.X , allora  t1.Y = t2.Y&lt;br /&gt;
Una DF  X  Y essenzialmente dice che se due tuple coincidono sui valori dell’attributo X, devono anche avere lo stesso valore per l’attributo Y.&lt;br /&gt;
Un’istanza legale di una relazione soddisfare tutti i VI specificati. Quindi guardando l’istanza di una relazione, potremmo essere in grado di dire che una certa DF non è valida, però non possiamo mai dedurre che una DF è valida solo guardando una o più istanza di una relazione, perché una DF, diversamente da un VI, è un’affermazione su tutte le possibili istanze legali di una relazione.&lt;br /&gt;
La definizione di una DF non richiede che l’insieme X sia minimale: l’ulteriore condizione di minimalità deve essere soddisfatta perché X sia una chiave. Se vale X  Y, dove Y  è l’insieme di tutti gli attributi, ed esiste qualche sottoinsieme X di  tale che V  Y, allora X è una superchiave.&lt;br /&gt;
Diciamo che una DF f è implicata da un dato insieme F di DF se f vale su ogni istanza di relazione che soddisfa tutte le dipendenze in F, f vale ogni volta che tutte le DF valgono in F.  &lt;br /&gt;
Chiusura di un insieme di DF, l’insieme di tutte le DF implicate in un dato insieme F di DF è detto chiusura di F, denotato come F+. Come possiamo inferire(calcolare la chiusura di un dato insieme)?&lt;br /&gt;
Con gli Assiomi si Armstrong, i quali possono essere applicati per inferire tute le DF implicate da un insieme F di DF.&lt;br /&gt;
riflessività, se X  Y, allora X  Y;&lt;br /&gt;
aumento, se X  Y allora XZ  YZ per ogni Z;&lt;br /&gt;
transitività, se X  Y e Y  X, allora X  Z.&lt;br /&gt;
Teorema 1  gli assiomi di Armstrong sono corretti, nel senso che generano solo DF in F+ quando sono applicati a un insieme F di DF. Sono anche completi, nel senso che ripetute applicazioni di queste regole generano tutte le DF nella chiusura F+.&lt;br /&gt;
Quando si parla di F+ conviene usare alcune regole addizionali:&lt;br /&gt;
unione: se X  Y e X  Z, allora X  YZ;&lt;br /&gt;
decomposizione: se X  YZ, allora X  Y e X  Z.&lt;br /&gt;
in una DF banale, la parte destra contiene solo attributi che appaiono anche nella parte sinistra; tali dipendenze valgono sempre per via della riflessività. Usando questa possiamo generare tutte le dipendenze banali, che hanno la forma:&lt;br /&gt;
X  Y, dove Y  X, X  ABC e Y  ABC.&lt;br /&gt;
Dalla transitività otteniamo A  C. &lt;br /&gt;
Dall’aumento otteniamo le dipendenze non banali:&lt;br /&gt;
AC  BC, AB  AC, AB  CB.&lt;br /&gt;
Chiusura degli attributi, se volgiamo controllare se una data dipendenza, diciamo X  Y, è nella chiusura di un insieme F di DF, possiamo farlo in maniera efficiente senza calcolare la chiusura stessa.&lt;br /&gt;
Prima troviamo la chiusura degli attributi X+ rispetto a F, che è l’insieme degli attributi A tali che X  A può essere derivata usando gli Assiomi di Armstrong. Questo è l’algoritmo di calcolo:&lt;br /&gt;
		chiusura = X;&lt;br /&gt;
		ripeti fin quando non ci sono più cambiamenti: {&lt;br /&gt;
			se c’è una DF U  V in F tale che U  chiusura,&lt;br /&gt;
				allora chiusura = chiusura  V&lt;br /&gt;
			}&lt;br /&gt;
Teorema 2 l’algoritmo mostrato calcola la chiusura dell’insieme X di attributi rispetto all’insieme F delle DF.&lt;br /&gt;
Forme normali,  dato uno schema di relazione, abbiamo bisogno di decidere se esso sia un buon progetto o se c’è necessità di decomporlo in relazioni più piccole. Una tale decisione deve essere guidata dalla comprensione di quali problemi sono presenti nello schema corrente.&lt;br /&gt;
Le forme normali basate su DF sono la prima forma normale (1NF), la seconda(2NF), la terza(3NF) e la forma normale di Boyce-Codd(BCNF).&lt;br /&gt;
Una relazione è nella 1NF se ogni campo contiene solo valori atomici, cioè niente liste o insiemi. La 2NF ha un interesse storico. La 3NF e la BCNF sono importanti dal punto di vista della progettazione di una base di dati.&lt;br /&gt;
forma normale di Boyce-Codd, sia R uno schema di relazione, F sia l’insieme delle DF date su R, X sia un sottoinsieme degli attributi di R, e A un attributo di R. R è nella BCNF se per ogni DF X  A in F vale una delle seguenti asserzioni: &lt;br /&gt;
A  X, cioè è una DF banale,&lt;br /&gt;
X è una superchiave.&lt;br /&gt;
In una relazione in BCNF le sole dipendenze non banali sono   quelle in cui una chiave determina alcuni attributi. Perciò ogni tupla può essere vista come un’entità o relazione, identificata da una chiave e descritta dai restanti attributi. &lt;br /&gt;
La BCNF assicura che nessuna ridondanza può essere rilevata usando solo le informazioni delle DF. Quindi è la più desiderabile delle forme normali, se prendiamo in considerazione solo le informazioni delle DF.&lt;br /&gt;
Se X è una chiave, allora y1=y2, il che significa ce le due tuple sono identiche. Poiché una relazione è definita come un insieme di tuple, non possiamo avere due copie della stessa tupla.&lt;br /&gt;
Se una relazione è in BCNF, ogni campo di ciascuna tupla registra una parte d’informazione che non può essere dedotta dall’istanza della relazione.&lt;br /&gt;
terza forma normale, sia R uno schema di relazione, F l’insieme delle DF date su R, X un sottoinsieme degli attributi di R, e A un attributo di R. R è in 3NF se per ogni DF X  A in F vale:&lt;br /&gt;
A  X, cioè è una DF banale&lt;br /&gt;
X è una superchiave&lt;br /&gt;
A fa parte di una chiave di R.&lt;br /&gt;
Supponiamo che una dipendenza X  A provochi una violazione della 3NF, sono possibili due casi:&lt;br /&gt;
1)X è un  sottoinsieme proprio di qualche chiave K. Questa viene chiamata dipendenza parziale e viene memorizzato la coppia (X,A) in maniera ridondante.&lt;br /&gt;
2)X non è un sottoinsieme proprio di una chiave. Una tale dipendenza è a volte chiamata dipendenza transitiva, perché significa che abbiamo una catena di dipendenze K   X  A. Il problema è che non possiamo associare un valore X con un valore K a meno di associare anche un valore A con un valore X.&lt;br /&gt;
Nella 3NF è possibile qualche ridondanza. I problemi associati alle dipendenze parziali e transitive persistono se c’è una dipendenza non banale X  A e X non è una superchiave, anche se la relazione è nella forma 3NF perché A è parte di una chiave.&lt;br /&gt;
Proprietà delle decomposizioni;&lt;br /&gt;
- decomposizioni senza perdita, sia R uno schema di relazione e sia F un insieme di DF su R: una decomposizione di R in due schemi con insiemi di attributi X e Y si dice decomposizione senza perdita rispetto a F se per ogni istanza r di R che soddisfa le dipendenze in F, x(r) &amp;gt;&amp;lt; y ( r ) = r. Possiamo tornare alla relazione originale a partire dalle relazioni della decomposizione.&lt;br /&gt;
Tutte le decomposizioni usate per eliminare la ridondanza devono essere senza perdita d’informazione.&lt;br /&gt;
Teorema 3 sia R una relazione e F un insieme di DF che valgono su R. la decomposizione di R in due relazioni con insiemi di attributi R1 e R2 è senza perdita d’informazione se e solo se F+ contiene la DF R1R2 R1 oppure la DF R1R2 R2.   &lt;br /&gt;
- decomposizione con conservazione delle dipendenze, permette di applicare tutte le DF esaminando una singola istanza di relazione su ciascun inserimento o modifica di una tupla.&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&lt;br /&gt;
L’uso di comandi SQL in un programma scritto in un linguaggio ospite è chiamato SQL incapsulato, o embedded SQL. &lt;br /&gt;
I comandi SQL possono essere usati nel linguaggio ospite ovunque sia permesso. Ogni variabile del compilatore di quel linguaggio, usata per passare argomenti ad un comando SQL, deve essere dichiarata in SQL.&lt;br /&gt;
Devono essere dichiarate alcune variabili speciali del linguaggio ospite. Vi sono due complicazione di cui tener conto:&lt;br /&gt;
i tipi di dati riconosciuti da SQL potrebbero non essere riconosciuti dal linguaggio ospite, e viceversa,&lt;br /&gt;
SQL è orientato agli insiemi, quindi si passa all’uso dei cursori. I comandi operano su tabelle e producono tabelle, cioè insiemi.&lt;br /&gt;
I comandi possono far riferimento a variabili definite nel programma ospite, queste però devono essere precedute da due punti (:) nei comandi SQL, e devono essere dichiarate tra i comandi EXEC SQL BEGIN DECLARE SECTION ed EXEC SQL END DECLARE SECTION.&lt;br /&gt;
Si può pensare ad un cursore come se “puntasse” ad una riga nella collezione di risposte dell’interrogazione cui è associato. Quando un cursore viene aperto si posiziona appena prima della prima riga. Possiamo usare il comando FETCH per leggere la prima riga del cursore nelle variabili del linguaggio ospite. &lt;br /&gt;
Quando questo viene eseguito, il cursore viene posizionato per puntare alla riga successiva( che è la prima riga della tabella quando FETCH è eseguito per la prima volta dopo l’apertura del cursore) e i valori delle colonne nella riga sono copiarti nelle corrispondenti variabili ospiti. Eseguendo ripetutamente questo comando FETCH possiamo leggere tutte le righe calcolate dall’interrogazione, una alla volta.&lt;br /&gt;
Quando abbiamo finito col cursore usiamo il comando CLOSE.&lt;br /&gt;
Proprietà dei cursori, la forma generale della dichiarazione di un cursore è:&lt;br /&gt;
		DECLARE nome_cursore [INSENSITIVE] [SCROLL] CURSOR&lt;br /&gt;
		[WITH HOLD]&lt;br /&gt;
		FOR qualche interrogazione&lt;br /&gt;
		[ORDER BY lista-ordinamento]&lt;br /&gt;
		[FOR READ ONLY | FOR UPDATE]&lt;br /&gt;
Un cursore può essere dichiarato di sola lettura (FOR READ ONLY) oppure, se è definito su una relazione di base o una vista aggiornabile(FOR UPDATE).&lt;br /&gt;
Se è aggiornabile, semplici varianti dei comandi UPDATE e DELETE ci permettono di aggiornare o cancellare la riga su cui il cursore è posizionato&lt;br /&gt;
Un cursore è aggiornabile per default a meno che nella sua definizione sia stato specificato SCROLL e INSENSITIVE, nel qual caso è di sola lettura.&lt;br /&gt;
SCROLL;il cursore è scorrevole, quindi le varianti del comando FETCH possono essere usate per posizionarlo in maniera molto flessibile; altrimenti è consentito il solo comando FETCH di base, che sposta il cursore alla riga successiva.&lt;br /&gt;
INSENSITIVE;il cursore si comporta come se si muovesse su una copia privata della collezione di righe della risposta. Altrimenti per impostazione predefinita, le azioni di qualche altra transazione potrebbero modificare tali righe, creando comportamenti non prevedibili.&lt;br /&gt;
Un cursore mantenibile viene specificato con la clausola WITH HOLD, e non è chiuso quando la transazione termina. Se una qualunque transazione viene interrotta il sistema, potenzialmente, deve rifare parecchio lavoro. Quindi l’alternativa è spezzare la transazione in diverse transazioni, più piccole, ma ricordare la posizione nella tabella è complicato e soggetto a errori.&lt;br /&gt;
ORDER BY; può essere usata per specificare un ordinamento. La lista-ordinamento è una lista di voci di ordinamento(nome di colonna), eventualmente seguito da una delle parole chiave ASC e DESC. Ogni colonna menzionata nella clausola ORDER BY deve apparire anche nella lista-selezione dell’interrogazione associata al cursore; altrimenti non è chiaro su quali colonne effettuare l’ordinamento.&lt;br /&gt;
SQL dinamico; i due comandi principali sono PREPARE e EXECUTE:&lt;br /&gt;
	char c_stringaSQL[] =  {“DELETE FROM Velisti WHERE esperienza &amp;gt; 5”};&lt;br /&gt;
	EXEC SQL PREPARE pronto FROM: c_stringaSQL;&lt;br /&gt;
	EXE SQL EXECUTE pronto;&lt;br /&gt;
1)il primo comando dichiara la variabile C c_stringaSQL e ne imposta il valore ad una rappresentazione stringa di un comando di SQL.&lt;br /&gt;
2)la seconda istruzione fa sì che tale stringa venga esaminata e compilata come comando SQL, con l’eseguibile risultante legato alla variabile pronto&lt;br /&gt;
3)la terza istruzione esegue il comando.&lt;br /&gt;
La preparazione di un comando SQL dinamico avviene durante l’esecuzione, che ne risulta appesantita. I comandi dell’SQL interattivo e dell’SQL incapsulato possono essere preparati una volta per tutte al momento della compilazione, e poi ri-eseguiti quanto si vuole. Di fatti si deve limitare l’uso dell’SQL dinamico a quelle situazioni in cui è essenziale.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter sottomettere al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti(Downie);&lt;br /&gt;
1.Pitch Facet; la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
note sul pentagramma,&lt;br /&gt;
nome A, B,C#,&lt;br /&gt;
pitch class number 0, 1, 2,&lt;br /&gt;
solfeggio do, re mi.&lt;br /&gt;
Intervallo: è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
Melodia: insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
Chiave: viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
Contorno melodico: il pattern degli intervalli.&lt;br /&gt;
2.Temporal Facet: informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
i.Metrica&lt;br /&gt;
ii.Indicatori di tempo&lt;br /&gt;
iii.Durata del pitch&lt;br /&gt;
iv.Accenti&lt;br /&gt;
v.Durata armonica&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano(questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato)&lt;br /&gt;
Pause: possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
Informazione temporale: può essere:&lt;br /&gt;
Assoluta ( metronomo ),&lt;br /&gt;
Generale ( adagio, forte ),&lt;br /&gt;
Relativo ( schneller, langsamer ),&lt;br /&gt;
Temporal distorsion ( rubato, rallentando ).&lt;br /&gt;
3.Harmonic Facet: quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia ( caratteristica fondamentale della musica occidentale).&lt;br /&gt;
Gli eventi armonici , sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
4.Timbral Facet: comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
5.Editorial Facet: istruzioni sull’esecuzione( diteggiatura, ornamenti, istruzioni dinamiche, etc…). Anche la musica stessa può essere inclusa.&lt;br /&gt;
6.Textual Facet: è l’aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa.&lt;br /&gt;
7.Bibliographic Facet: sono informazioni relative a:&lt;br /&gt;
titolo&lt;br /&gt;
compositore&lt;br /&gt;
arrangiatore&lt;br /&gt;
editore&lt;br /&gt;
numero di catalogo&lt;br /&gt;
data pubblicazione&lt;br /&gt;
esecutori.&lt;br /&gt;
Uno degli obbiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
Interrogazioni per contenuto: confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca.&lt;br /&gt;
Per la costruzione di un DB musicale vi son tre passi:&lt;br /&gt;
1.individuare lo scopo dei dati. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
2.elencare i dati necessari, considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copy-right.&lt;br /&gt;
3.definire la miglior struttura per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni.&lt;br /&gt;
Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi son tre tipi di ricerca:&lt;br /&gt;
Browsing: può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti,&lt;br /&gt;
Textual search: indicizzazione di tutte le informazioni testuali accademiche( autore, titolo, …) e non accademiche( genere, frammenti delle liriche, …).&lt;br /&gt;
Search by content: interrogazioni basate sulla melodia o altri aspetti del contenuto audio.&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia( informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
Catalog information: sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
Multimedia characteristics: son metadadata che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette( da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
Query by content: servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
Verifica se un brano appena composto da un autore si frutto della creatività dell’artista e non influenzato da uno ascoltato in passato e poi dimenticato.&lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
a frammenti tematici: contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale,&lt;br /&gt;
database di intere partiture: sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
Query-by-humming, può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
L’approccio per questo metodo sono di due tipi: &lt;br /&gt;
DSP: elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
Simbolico: trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenza melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio( si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo(discreto) il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio(non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
Vi son dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
Note segmentation: dove sono posizionate esattamente le note?Quanto durano?&lt;br /&gt;
Pitch variation della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
Note quantization: come posizionare le altezze sulle scale musicali?&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze(di differenti ottave).&lt;br /&gt;
Sequenze di note: ogni elemento della sequenza è descritto da qualche parametro ( solitamente nome e durata della nota ).&lt;br /&gt;
Rappresentazione: &lt;br /&gt;
tutte le rappresentazioni della stessa nota vengono collassate in una sola,&lt;br /&gt;
l’alfabeto di 12 elementi, viene usato per rappresentare e dividere le altezze in semitoni,&lt;br /&gt;
questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Trasposizione: gli algoritmi per calcolare la similarità vengono applicati 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit&lt;br /&gt;
Sequenza d’intervalli: distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava.&lt;br /&gt;
È anche dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
Contorno melodico: si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to.&lt;br /&gt;
Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibili individuare univocamente il brano cercato.&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note, significa ottenere centinaia di brani simili, impossibili ascoltarli tutti per trovare quello corretto.&lt;br /&gt;
Però questo sistema è utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
Classi di equivalenza: ogni simbolo rappresenta n intervalli. &lt;br /&gt;
C1:ogni simbolo rappresenta un intervallo,&lt;br /&gt;
C3: ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
CU: tutti gli intervalli crescenti e decrescenti collassato in due differenti classi( contorno melodico ).&lt;br /&gt;
Rappresentazione Frame-based:&lt;br /&gt;
non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia,&lt;br /&gt;
il tempo viene diviso in frame di ugual misura,&lt;br /&gt;
viene stimato il valore di un pitch per ogni frame,&lt;br /&gt;
le note non sono esplicitamente descritte,&lt;br /&gt;
in un unico valore sono rappresentabili le informazioni relative ad altezza e durata.&lt;br /&gt;
Svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
Music psychology: c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, di fatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando.&lt;br /&gt;
L’interrogazione è distribuita su più voci:&lt;br /&gt;
non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando,&lt;br /&gt;
in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
memoria, che può essere a breve o lungo termine,&lt;br /&gt;
tipologia di utente, che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
Melodia: definire come una sequenza di note sia riconosciuta dall’uomo come una melodia di un brano polifonico.&lt;br /&gt;
String matching and melodic similarità: approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia f  la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e s la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
 f è fattore di x?&lt;br /&gt;
se f non appare in x, quale sottoparte di f è presente in s?&lt;br /&gt;
quante volte un’approssimazione di f è presente in s?&lt;br /&gt;
Blast algorithm: Basic Local Alignment Search Tool: uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze:&lt;br /&gt;
zone uguali o simili,&lt;br /&gt;
allineamenti globali.&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
Identità percentuale: numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi,&lt;br /&gt;
Conservazione: quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17647</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17647"/>
		<updated>2007-07-11T14:18:05Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: /* Caratteristiche */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Database e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati. Un WAL (write-ahead log) è usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
===Il modello relazionale===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo, ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise in colonne (o campi) contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un'istanza della base di dati.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
	&lt;br /&gt;
Il calcolo relazionale è un linguaggio d'interrogazione formale basato sulla logica matematica, e le interrogazioni in tale linguaggio hanno un significato preciso e intuitivo.&lt;br /&gt;
&lt;br /&gt;
L’algebra relazionale è una forma di linguaggio formale basato su una relazione di operatori per manipolare le relazioni e ha la stessa potenza del calcolo.&lt;br /&gt;
&lt;br /&gt;
Una transazione è una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un DMBS è diviso in :&lt;br /&gt;
un ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente per la sua valutazione&lt;br /&gt;
piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
gestore dello spazio sul disco&lt;br /&gt;
gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo standard dei linguaggi SQL usa la parola table per indicare relazione.&lt;br /&gt;
CREATE TABLE, usato per definire una nuova tabella (CREATE TABLE Studenti )&lt;br /&gt;
CREATE TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	(&amp;lt; specifica colonna &amp;gt; [, &amp;lt; specifica colonna &amp;gt; ]);&lt;br /&gt;
&amp;lt; specifica colonna &amp;gt;, ha il seguente formato&lt;br /&gt;
&amp;lt; nome colonna &amp;gt; &amp;lt; dominio &amp;gt; [DEFAULT &amp;lt; valore default &amp;gt;]&lt;br /&gt;
dove &amp;lt; dominio &amp;gt; è il dominio della colonna, ed è uno dei tipi di dato SQL;&lt;br /&gt;
&amp;lt; valore default &amp;gt; è un valore del dominio, assunto dalle tuple se nessun valore è specificato per la colonna.&lt;br /&gt;
INSERT, usato per inserire le tuple&lt;br /&gt;
INSERT&lt;br /&gt;
INTO R [(C…C°)]&lt;br /&gt;
{VALUES (e…e°)| sq};&lt;br /&gt;
(e…e°) è una lista di valori da assegnare alla nuova tupla, questi sono assegnati in base ad una corrispondenza posizionale&lt;br /&gt;
sq, è una sub-query&lt;br /&gt;
le tuple generate come risposta alla sq vengono inserite nella relazione R&lt;br /&gt;
la clausola di proiezioni di sq deve contenere colonne compatibili con le colonne di R a cui si assegnano valori&lt;br /&gt;
il dominio della colonna C(i=1,…., n) deve essere compatibile con il dominio della colonna i-esima contenuta nella clausola di proiezione di SQL.&lt;br /&gt;
Tutte le colonne non esplicitamente elencate ricevono il valore nullo o il valore di default.&lt;br /&gt;
DELETE, usato per cancellare le tuple&lt;br /&gt;
DELETE&lt;br /&gt;
FROM  R[alias]&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può essere associato ad un alias se è necessario riferire a tuple di tale relazione una qualche sotto-interrogazione presente in F&lt;br /&gt;
se non viene specificata alcuna clausola di qualificazione vengono cancellate tutte le tuple.&lt;br /&gt;
UPDATE, usato per modificare i valori in una riga esistente&lt;br /&gt;
UPDATE R[alias]&lt;br /&gt;
SET C={e |NULL},…, C°={e° | NULL}&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può avere associato un alias se è necessario riferire tuple di tale relazione in una qualche sotto-interrogazione presente in F&lt;br /&gt;
C={e |NULL},…, C°={i=1 | NULL}, è un’espressione di assegnamento che specifica che alla colonna C, deve essere assegnato il valore dell’espressione e.&lt;br /&gt;
Questa può essere una costante, spesso funzione dei valori correnti delle tuple da modificare, o una sub-query&lt;br /&gt;
si può specificare che alla colonna sia assegnato il valore nullo.&lt;br /&gt;
VINCOLI D’INTEGRITA’ è una condizione specificata in uno schema di base dati e limita i dati che possono essere memorizzati in una istanza alla base dati. Ci son vincoli statici(relativi ad uno stato della base di dati) e vincoli di transizione(mettono in relazione stati diversi della base di dati).&lt;br /&gt;
Un DBMS applica i vincoli d’integrità, nel senso che permette alle istanze legali di essere memorizzate nella base di dati&lt;br /&gt;
quando i DBA o l’utente finale definiscono uno schema di base dati, specificano i VI che devono valere per ogni istanza di tale base dati&lt;br /&gt;
quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni e no premette le modifiche ai dati che violano i VI specificati.&lt;br /&gt;
Integrità referenziale; rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,….,Vn, allora deve esistere nella relazione riferita una tupla t° con valori di chiave V1,….,Vn.&lt;br /&gt;
VINCOLI DI CHIAVE è l’imposizione che un certo sottoinsieme minimale dei campi di una relazione sia un identificatore unico per una tupla. Un insieme di campi che identificano univocamente una tupla secondo un vincolo di chiave si chiama chiave candidata per la relazione, altresì chiamata chiave.&lt;br /&gt;
due tuple distinte in una istanza legale non possono avere valori uguali in tutti i campi di una chiave. In ogni istanza legale i valori nei campi chiave identificano univocamente una tupla di una istanza.&lt;br /&gt;
nessun sottoinsieme dell’insieme dei campi di una chiave è un identificatore unico della tupla.&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Se ci sono altri vincoli, alcuni sottoinsiemi dei campi possono formare una chiave, ma se ciò non si verifica l’insieme di tutti i campi è una chiave&lt;br /&gt;
Chiave primaria, si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave. Per definire una chiave primaria in SQL viene usato il comando PRIMARY KEY, mentre per dichiarare un sottoinsieme delle colonne di una tabella si usa UNIQUE. Nella scelta di una chiave primaria è meglio usarne una, candidata, che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
Chiave esterna, deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi. Se una relazione R ha trai suoi attributi un insieme di attributi che costituisce la chiave di una relazione R, allora tale insieme è una chiave esterna di R su R°. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni. Quindi una tupla che deve riferire ad un’altra tupla include tra i suoi attributi uno o più di essi, il cui valore è quello della chiave della seconda tupla.&lt;br /&gt;
 La presenza di NULL in una chiave esterna non viola il vincolo di chiave. Il comando in SQL è FOREIGN KEY che ha delle opzioni aggiuntive, sul come comportarsi una volta implementata la chiave esterna. &lt;br /&gt;
	FOREIGN KEY(&amp;lt; lista nomi colonne &amp;gt;)&lt;br /&gt;
	REFERENCES &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	 [ON DELETE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
	[ ON UPDATE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
l’opzione predefinita è NO ACTION(l’azione deve essere ignorata).&lt;br /&gt;
CASCADE dice che se una riga viene cancellata, tutte le sue righe che la referenziano devono essere eliminate. Lo stesso vale per il caso di un UPDATE, dove l’aggiornamento viene propagato a ciascuna riga,&lt;br /&gt;
ON DELETE permette di specificare le azioni da eseguire nel caso di cancellazione di una tupla riferita tramite chiave esterna,&lt;br /&gt;
ON UPDATE permette di specificare le azioni da eseguire nel caso di modifica del valore di chiave di una tupla riferita tramite chiave esterna&lt;br /&gt;
Per default un vincolo viene verificato al termine di ogni istruzione SQL che potrebbe portare ad una violazione, e se questa ci fosse il comando viene rifiutato.&lt;br /&gt;
L’SQL permette di specificare che un vincolo sia in modalità DEFERRED o IMMEDIATE: SET CONSTRAINT vincolo DEFERRED.&lt;br /&gt;
Un’interrogazione di una base di dati relazionale è una domanda sui dati, e la risposta consiste in una nuova relazione contenente il risultato. Un esempio di query è:&lt;br /&gt;
	SELECT*&lt;br /&gt;
	FROM&lt;br /&gt;
	WHERE&lt;br /&gt;
*significa che vogliamo tutti i campi delle tuple che compongono il risultato.&lt;br /&gt;
Una vista è una tabella le cui righe non sono esplicitamente memorizzate nella base dati, ma sono calcolate quando necessario in base a una definizione di vista.&lt;br /&gt;
Questa può essere usata come in una tabella di base per definire nuove interrogazioni o viste.&lt;br /&gt;
DROP TABLE, per eliminare una tabella e la sua forma è:&lt;br /&gt;
		DROP TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
			{ RESTRICT | CASCADE };&lt;br /&gt;
se viene specificata l’opzione RESTRICT, la relazione viene cancellata solo se non è riferita da altri elementi dello schema della base di dati;&lt;br /&gt;
se viene specificata l’opzione CASCADE, la relazione e tutti gli elementi dello schema della base di dati che eventualmente la riferiscono vengono cancellati.&lt;br /&gt;
ALTER TABLE, modifica la struttura di una tabella esistente e la sua forma è:&lt;br /&gt;
		ALTER TABLE &amp;lt; nome relazione &amp;gt; &amp;lt; modifica &amp;gt;;&lt;br /&gt;
&amp;lt; modifica &amp;gt; è la modifica da effettuare, tra l’aggiunta di una nuova colonna, modifica di una colonna e l’eliminazione.&lt;br /&gt;
ALGEBRA RELAZIONALE: linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori, e ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione con risultato.&lt;br /&gt;
Invece un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
Selezione ; l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione Booleana di termini che hanno la forma attributo op costante oppure attributo1 op attributo2, dove op è uno degli operatori di confronto &amp;lt;,&amp;lt;=,=,=&amp;gt;,&amp;gt;,.&lt;br /&gt;
Proiezione ; l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
UNIONE, RS restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione R oppure S. Due istanze sono dette compatibili rispetto all’unione quando: &lt;br /&gt;
1) hanno lo stesso numero dei campi;&lt;br /&gt;
2) campi corrispondenti hanno lo stesso dominio. &lt;br /&gt;
INTERSEZIONE, RS restituisce un’istanza contenente tutte le tuple presenti sia in R che in S&lt;br /&gt;
DIFFERENZA, R-S restituisce un’istanza contenente tutte le tuple presenti in R ma non in S. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a R&lt;br /&gt;
PRODOTTO CARTESIANO, RxS restituisce un’istanza di relazione il cui schema contiene tutti i campi di R seguiti da tutti i campi di S. Il risultato di RxS contiene una tupla |r,s|.&lt;br /&gt;
Rinomina , usato per rinominare le tabelle.&lt;br /&gt;
JOIN: usato per combinare informazioni da due o più relazioni. Un predicato di JOIN esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
JOIN CONDIZIONALE; la versione più generale dell’operatore di join accetta una condizione di join c e un paio di istanze di relazione come argomenti e restituisce un’istanza di relazione.&lt;br /&gt;
      c (RxS)&lt;br /&gt;
EQUIJOIN; lo si ha quando la condizione di join consiste solamente di uguaglianze della forma R.nome1=S.nome2. In questo caso mantenere entrambi gli attributi sarebbe ridondante come cosa. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui S.nome2 viene scartato. Lo schema del risultato di un equijoin contiene i campi di R, seguiti dai campi di  che non appaiono condizioni di join.&lt;br /&gt;
JOIN NATURALE; è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in R e S. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome. C’è anche da dire che non corrisponde ad un operatore di NATURAL JOIN,dato che non si esegue alcuna proiezione, e lo scema risultante è quello del prodotto cartesiano. La sua forma è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; NATURAL JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
JOIN ESTERNI(pg99); questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL,&lt;br /&gt;
R OUTER JOIN S&lt;br /&gt;
Esistono diverse varianti dell’OUTER JOIN;&lt;br /&gt;
1.FULL: sia le tuple di R che quelle di S che non partecipano  al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
2.LEFT: le tuple di R che non partecipano al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
3.RIGHT: le tuple S che non partecipano al JOIN vengono completate ed inserite nel risultato.&lt;br /&gt;
CROSS JOIN; questi operatori poiché producono relazioni possono essere usati nella clausola FROM. È la forma di operatore JOIN più semplice che corrisponde al prodotto cartesiano. La sua sintassi è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; CROSS JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
DIVISIONE, l’operazione di divisione A/B è l’insieme di tutti valori di x(in forma di tuple unarie) tali che per ogni valore y in B, ci sia una tupla |x,y| in A. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti(un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A).Le tuple interdette possono esser calcolate così: x(( x (A) x B) – A).&lt;br /&gt;
&lt;br /&gt;
SQL:I linguaggi di basi dati come SQL permettono all’utente di specificare per quali relazioni e quali attributi è necessario mantenere l’integrità referenziale( e le azioni da eseguire in caso di violazione). La forma base di un’interrogazione SQL è: &lt;br /&gt;
SELECT [DISTINCT] lista-select&lt;br /&gt;
FROM lista-from&lt;br /&gt;
WHERE qualificazione&lt;br /&gt;
Lista-select, è una lista di nomi di colonne delle tabelle nominate nella lista-from. I nomi di colonne possono avere come prefisso una variabile di range.&lt;br /&gt;
Lista-from, è una lista di nomi di tabelle. Un nome di tabella può essere seguito da una variabile di range(questa è utile quando lo stesso nome di tabella appare più volte nella lista-from).&lt;br /&gt;
Qualificazione, è una combinazione booleana di condizioni nella forma espressione op espressione, dove op è uno degli operatori di confronto.&lt;br /&gt;
Ogni interrogazione deve avere una clausola SELECT, che specifica le colonne da includere nel risultato, e una clausola FROM, che specifica un prodotto cartesiano di tabelle. La clausola opzionale WHERE specifica condizioni di selezione sulle tabelle menzionate nella clausola FROM.&lt;br /&gt;
Se omettiamo la parola chiave DISTINCT, otterremo una copia della riga (v,e), e la risposta sarebbe un multi-insieme di righe. &lt;br /&gt;
Il processo d’interrogazione di un DB consta in:&lt;br /&gt;
caricamento della lista di attributi;&lt;br /&gt;
scarto delle tuple che non soddisfano la qualificazione;&lt;br /&gt;
eliminazione degli attributi che non sono nella lista-from.&lt;br /&gt;
Un multi-insieme è un simile ad un insieme, nel senso che è una collezione non ordinata di elementi, ma possono esserci diverse copie, e il numero di copie è significativo: due multi-insiemi possono avere gli stessi elementi e tuttavia essere diversi, poiché il numero di copie dello stesso elemento è diverso.&lt;br /&gt;
Tipi numerici esatti:&lt;br /&gt;
INTEGER; la precisione di questo tipo di dato è espressa in numero di bit, a seconda della specifica implementazione di SQL,&lt;br /&gt;
SMALLINT; l’unico requisito è che la precisione di questo tipo di dato sia non maggiore della precisione del tipo di dato INTEGER. Questo viene usato per eventuali ottimizzazioni in quanto i valori richiedono minore spazio di memorizzazione,&lt;br /&gt;
BIGINT; l’unico requisito è che la precisione di questo tipo di dato sia non minore della precisione del tipo di dato INTEGER,&lt;br /&gt;
NUMERIC; caratterizzato da una precisione(numero totale di cifre) e una scala(numero di cifre dopo la virgola), il valore default per la precisione è 1 e per la scala è 0,&lt;br /&gt;
DECIMAL; simile a NUMERIC, ma la specifica di questo tipo di dato ha la forma: DECIMAL[(precisione[,scala])].&lt;br /&gt;
Tipi numerici approssimati:&lt;br /&gt;
REAL; rappresenta valori reali a singola precisione in virgola mobile, e la precisione dipende dalla specifica implementazione si SQL,&lt;br /&gt;
DOUBLE PRECISION; rappresenta valori reali a doppia precisione in virgola mobile, e questa dipende sempre dall’implementazione di SQL(però deve essere maggiore della precisione di tipo REAL),&lt;br /&gt;
FLOAT; rappresenta valori reali alla precisione desiderata, ed ha la forma FLOAT[(precisione)]. La precisione minima specificabile è 1.&lt;br /&gt;
Tipi di dato carattere:&lt;br /&gt;
CHARACTER; rappresenta stringhe di caratteri di lunghezza predefinita, spesso abbreviato in CHAR. La specifica ha il formato CHAR[(n)], con n lunghezza delle stringhe. E’ possibile usare come valore una stringa di lunghezza inferiore a n, che viene completata con spazi fino a raggiungere tale lunghezza,&lt;br /&gt;
CHARACTER VARYING; rappresenta stringhe di caratteri di lunghezza massima predefinita. Spesso abbreviato in VARCHART, e la sua forma è VARCHART(n), dove n è la lunghezza massima delle stringhe.&lt;br /&gt;
Tipi di dato temporali:&lt;br /&gt;
DATE; rappresenta le date espresse come anno(4cifre), mese(2cifre) e giorno(2cifre),&lt;br /&gt;
TIME; rappresenta i tempi espressi come ora(2cifre), minuto(2cifre) e secondo(2cifre),&lt;br /&gt;
TIMESTAMP; rappresenta una “concatenazione” fra DATE e TIME. Permette di rappresentare timestamp che consistono in: anno, mese, giorno, ora, minuto, secondo e microsecondo,&lt;br /&gt;
INTERVAL; rappresenta una durata temporale in riferimento ad uno o più qualificatori. I valori di questo tipo son rappresentati dalla parola chiave INTERVAL seguita da una stringa che esprime la durata in termini di uno o più qualificatori. Se sono presenti due qualificatori, il primo è più ampio del secondo e sono separati dalla parola chiave TO.&lt;br /&gt;
Tipo di dato:&lt;br /&gt;
BOOLEAN; i valori di tali tipo sono TRUE, FALSE, UNKNOWN(questo viene introdotto per la gestione dei confronti con valori nulli,&lt;br /&gt;
CHARACTER LARGE OBJECT(CLOB); permette di rappresentare sequenze di caratteri di elevate dimensioni,&lt;br /&gt;
BINARY LARGE OBJECT(BLOB); permette di rappresentare sequenze di bit di elevate dimensioni. &lt;br /&gt;
E’ possibile convertire un valore ad un altro tipo mediante l’operatore di CAST&lt;br /&gt;
		CAST (e) AS &amp;lt; tipo target &amp;gt;&lt;br /&gt;
AS: per introdurre una variabile di range.&lt;br /&gt;
I nomi delle tabelle possono essere implicitamente usati come variabili in linea. Si ha la necessità di introdurre esplicitamente le variabili di range solo quando la clausola FROM contiene più di una occorrenza di una relazione. Se una variabile di range è stata introdotta nella relazione, un nome di tabella non può essere usato come variabile di range esplicita.&lt;br /&gt;
Ogni elemento in una lista-select può essere della forma espressione AS nome_colonna ( questo è il nuovo nome che la colonna avrà nel risultato dell’interrogazione. Inoltre, ogni termine in una qualificazione può anche essere rappresentato nella forma generale espressione1 = espressione2.&lt;br /&gt;
L’SQL permette il pattern matching, su valori di tipo stringa, attraverso l’uso dell’operatore LIKE, insieme all’uso dei caratteri jolly %( zero o più caratteri qualunque) e ( esattamente un carattere qualunque). Quindi “AB%” denota una qualunque stringa che contiene almeno tre caratteri, con il secondo ed il terzo uguali a A e B.&lt;br /&gt;
SQL fornisce tre comandi per la manipolazione degli insiemi che estendono la forma d’interrogazione basilare, e sono:&lt;br /&gt;
UNION, restituisce tutte le tuple distinte restituite da almeno una delle sotto-interrogazioni a cui è applicato. Se si usa la clausola ORDER BY, questa deve essere usata una sola volta alla fine dell’interrogazione e non alla fine di ogni SELECT,&lt;br /&gt;
INTERSECT, corrisponde all’intersezione, restituisce le tuple restituite da entrambe le sotto interrogazioni a cui è applicato.&lt;br /&gt;
EXCEPT, corrisponde alla differenza, e restituisce le tuple della seconda sotto-interrogazione a cui è applicato.&lt;br /&gt;
Questo linguaggio fornisce anche altre operazioni sugli insiemi:&lt;br /&gt;
IN, per controllare se un elemento è in un dato insieme. C IN(v,….v°), nella forma negata C NOT IN(v,….v°).&lt;br /&gt;
ANY&lt;br /&gt;
ALL, per confrontare un valore con gli elementi di un dato insieme, usando l’operatore di confronto op&lt;br /&gt;
EXISTS, per controllare se un insieme è vuoto.&lt;br /&gt;
BETWEEN, permette di determinare le tuple che contengono in un dato attributo valori in un intervallo dato. C BETWEEN v AND v° , nella forma negata invece C NOT BETWEEN v AND v°,&lt;br /&gt;
ABS(N); calcola il valore assoluto del valore numerico N,&lt;br /&gt;
MOD(n,b); calcola il resto intero della divisione n per b.&lt;br /&gt;
UNION, INTERSECT ed EXCEPT possono essere usati su qualsiasi coppia di tabelle che siano compatibili rispetto all’unione, cioè che abbiamo lo stesso numero e tipo di colonne.&lt;br /&gt;
Nel caso si UNION i duplicati vengono eliminati automaticamente. Per mantenerli è necessario aggiungere ALL (UNION ALL). Lo stesso discorso vale per INTERSECT ed EXCEPT.&lt;br /&gt;
Espressioni e funzioni: un’espressione usata nella clausola di proiezione di un’interrogazione, dà luogo ad una colonna, detta virtuale, non presente nella relazione su cui si effettua l’interrogazione.&lt;br /&gt;
Le colonne virtuali non sono fisicamente memorizzate, ma sono calcolate dinamicamente come risultato dell’esecuzione dell’interrogazione. &lt;br /&gt;
Espressioni e funzioni per stringhe:&lt;br /&gt;
Operatore di concatenazione denotato da ||,&lt;br /&gt;
LENGHT(str), restituisce la lunghezza della stringa str, in numero di caratteri,&lt;br /&gt;
UPPER(str) e LOWER(str), trasformano la stringa str in caratteri tutti maiuscoli o tutti minuscoli, rispettivamente,&lt;br /&gt;
SUBSTR(str, m,[n]), estrae dalla stringa str la sottostringa dal carattere di posizione m per una lunghezza n,&lt;br /&gt;
TRIM[str°] FROM str, elimina dalla stringa str° i caratteri in str.&lt;br /&gt;
Un’interrogazione annidata è un’interrogazione che al suo interno ha un’altra interrogazione. Questa solitamente appare nella clausola WHERE, o anche in FROM o HAVING. Se una sub-query scalare restituisce più di una tupla si genera un errore di run-time, e se nessuna tupla verifica la sotto-interrogazione, viene restituito il valore NULL.&lt;br /&gt;
E’ anche possibile selezionare più di una colonna tramite sotto-interrogazioni, in tal caso è necessario apporre delle parentesi alla lista delle colonne a sinistra dell’operatore di confronto. Ad esempio, voglio elencare gli impiegati con la stessa mansione di Martini;&lt;br /&gt;
		SELECT Nome FROM Impiegati&lt;br /&gt;
		WHERE(Mansione, Stipendio) = (SELECT&lt;br /&gt;
			Mansione, Stipendio FROM Impiegati&lt;br /&gt;
				WHERE Nome = “Martini”);&lt;br /&gt;
Una sub-query può contenere a sua volta un’altra sub-query. E’ possibile definire sotto-interrogazioni che sono eseguite ripetutamente per ogni tupla candidata considerata nella valutazione dell’interrogazione esterna, e ogni volta che questa considera una tupla candidata, deve invocare la sotto-interrogazione. Questo tipo viene chiamato correlato, dato che ogni esecuzione è correlata al valore di uno o più attributi delle tuple candidate nell’interrogazione principale. Per poter fare riferimento alle colonne delle tuple candidate nell’interrogazione esterna si fa uso degli alias di relazione(questo è definito nell’interrogazione esterna e riferito nella sotto-interrogazione correlata. Sono utili quando si vuole fare riferimento a due diverse tuple della stessa relazione.).&lt;br /&gt;
UNIQUE, quando applichiamo questo comando ad una sotto-interrogazione, la condizione che ne risulta ritorna vero se  nessuna riga appare due volte nella risposta all’interrogazione, se non ci sono duplicati. Ritorna vero se la risposta è vuota.&lt;br /&gt;
Operatori di aggregazione:&lt;br /&gt;
COUNT ([DISTINCT] A) , è numero di valori unici della colonna A,&lt;br /&gt;
SUM ([DISTINCT] A) , la somma di tutti i valori unici nella colonna A,&lt;br /&gt;
AVG ([DISTINCT] A) , la media di tutti i valori unici nella colonna A,&lt;br /&gt;
MAX (A) , il valore massimo della colonna A,&lt;br /&gt;
MIN (A) , il valore minimo della colonna A.&lt;br /&gt;
Non ha senso specificare DISTINCT insieme a MIN e MAX.&lt;br /&gt;
Le clausole GROUP BY e HAVING;&lt;br /&gt;
		SELECT [DISTINCT]  lista-select&lt;br /&gt;
		FROM lista-from&lt;br /&gt;
		WHERE qualificazione&lt;br /&gt;
		GROUP BY lista gruppo&lt;br /&gt;
		HAVING  qualificazione gruppo.&lt;br /&gt;
La lista-select consiste di una lista di nomi di colonne e una lista di termini della forma aggop(nome-colonna) AS nuovo-nome. Ogni colonna che appare nella lista dei nomi deve apparire nella lista-gruppo.&lt;br /&gt;
Le espressioni che compaiono nella qualificazione gruppo della clausola HAVING devono avere un singolo valore per gruppo. L’idea di base è che la clausola HAVING         ( può essere una combinazione Booleana di predicati, i quali tuttavia possono solo coinvolger funzioni di gruppo) determina se per ogni gruppo dato debba essere generata una riga della risposta.&lt;br /&gt;
Un’importante restrizione ci dice che una clausola di protezione di una query contenente GROUP BY può includere solamente:&lt;br /&gt;
una o più colonne tra le colonne che compaiono nella suddetta clausola,&lt;br /&gt;
funzioni di gruppo(che possono apparire in funzioni aritmetiche).&lt;br /&gt;
Le funzioni di gruppo permettono di estrarre informazioni da gruppi di tuple invece di una relazione, queste si basano su due concetti:&lt;br /&gt;
il partizionamento delle tuple di un relazione in base al valore di uno o più colonne della relazione,&lt;br /&gt;
il calcolo della funzione di gruppo per ogni gruppo ottenuto col partizionamento. &lt;br /&gt;
Una funzione di gruppo ha come argomento una colonna e si applica all’insieme dei valori di questa colonna, estratti dalle tuple che appartengono allo stesso gruppo.&lt;br /&gt;
E’ possibile applicare queste funzioni senza partizionamento e in tal caso saranno applicate ad un unico gruppo contente tutte le tuple della relazione.&lt;br /&gt;
Se GROUP BY viene omesso l’intera tabella viene vista come un singolo gruppo&lt;br /&gt;
COUNT, se questo non include DISTINCT, allora COUNT(*) dà la stessa risposta di COUNT(x), dove x è un qualunque insieme di attributi.&lt;br /&gt;
L’SQL fornisce un valore di colonna speciale chiamato null da usare quando il valore della colonna è sconosciuto oppure inapplicabile.&lt;br /&gt;
Possiamo impedire l’uso dei valori null specificando NOT NULL come parte della definizione dei campi. Inoltre i campi in una chiave primaria non posso assumere valori null, quindi vi è un vincolo di NOT NULL, implicito per ogni campo elencato in un vincolo di PRIMARY KEY.&lt;br /&gt;
Si può specificare vincoli sulla tabella usando vincoli di tabella, che hanno la forma CHECK espressione-condizionale.&lt;br /&gt;
In un comando CREATE TABLE, la clausola CHECK può comparire;&lt;br /&gt;
di seguito alla definizione di una colonna ( vincoli di CHECK su colonna )&lt;br /&gt;
come clausola separata dall’interno della definizione della relazione ( vincoli CHECK su relazione ).&lt;br /&gt;
Specificando un vincolo CHECK vogliamo che ogni tupla nella relazione soddisfi la condizione. E’ consigliabile esprimere tramite CHECK solo le condizioni che devono essere verificate da ogni singola tupla della relazione cui associamo il vincolo.&lt;br /&gt;
E’ possibile assegnare nome ai vincoli associati alle definizioni di relazione facendo seguire la specifica del vincolo nella parola chiave CONSTRAINT e dal nome. Difetti specificare un nome per tutti i vincoli è utile per potersi poi riferire ad essi.&lt;br /&gt;
Le asserzioni servono per esprimere vincoli di integrità che coinvolgono più tuple o relazioni, e vengono così formulate:&lt;br /&gt;
		CREATE ASSERTION &amp;lt; nome asserzione &amp;gt;&lt;br /&gt;
		CHECK(&amp;lt; condizione &amp;gt;).&lt;br /&gt;
I vincoli di una tabella sono associati ad una tabella singola. Il soddisfacimento di questi vincoli è richiesto solo se la tabella associata è vuota, quando un vincolo coinvolge due o più tabelle, il meccanismo di vincoli sulle tabelle è in qualche modo anomalo, e non ciò che si desidera.&lt;br /&gt;
Un trigger è una procedura che viene eseguita dal DBMS in risposta a specifici cambiamenti nella base di dati ed è definita dal DBA. Questi son divisi in tre parti:&lt;br /&gt;
evento: un cambiamento nella base di dati che attiva il trigger;&lt;br /&gt;
condizione: un’interrogazione o un test che viene eseguito quando il trigger è attivato;&lt;br /&gt;
azione; procedura che viene eseguita quando il trigger è attivato e la sua condizione è verificata.&lt;br /&gt;
Una condizione di trigger può essere un comando vero/falso oppure un’interrogazione. Questa viene interpretata come vero se l’insieme di risposta non è vuoto, falso se l’opposto. L’azione di un trigger può esaminare la risposta all’interrogazione nella parte condizionale dei trigger , fare riferimento a valori vecchi e nuovi delle tuple modificate dal comando che ha attivato il trigger, eseguire nuove interrogazioni e apportare cambiamenti alla base di dati.&lt;br /&gt;
&lt;br /&gt;
Progettazione di una base dati:&lt;br /&gt;
1)Analisi dei requisiti: il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni  devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
2)Progettazione concettuale della base di dati: le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare. Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
3)Progettazione logica della base dati:  dobbiamo scegliere un DBMS per implementare in nostro progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
4)Raffinamento dello schema: analizzare l’insieme di relazioni del nostro schema relazionale per identificare potenziali problemi, e a rifinirlo.&lt;br /&gt;
5)Progettazione fisica della base di dati: consideriamo i carichi di lavoro attesi che la nostra base di dati dovrò sopportare, e raffiniamo il progetto per garantire che esso soddisfi i criteri di prestazioni richieste. Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
6)Progettazione delle applicazioni e della sicurezza.&lt;br /&gt;
Una entità è un oggetto nel mondo reale che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un’astrazione della realtà la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. La coppia (nome_di_attributo, dominio) viene chiamata attributo e ogni entità è caratterizzata da uno o più attributi(i quali possono essere monovalore, multivalore e compositi).&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
semplice, sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
composti, l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini i un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica. &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una chiave. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come chiave primaria. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli ovali, e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei rettangoli.&lt;br /&gt;
Una relazione è un’associazione tra due o più entità.&lt;br /&gt;
Come per le entità potremmo voler raccogliere un gruppo di relazioni simili in un insieme di relazioni. Questo può essere visto come un insieme di n-tuple:&lt;br /&gt;
{( e1,… en)  E1,…,en   En}&lt;br /&gt;
Ciascuna n-tupla denota una relazione che coinvolge n entità, da e1 a en, dove l’entità ei appartiene all’insieme di entità Ei.&lt;br /&gt;
Una relazione può anche avere attributi descrittivi, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante.&lt;br /&gt;
Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
Ruolo, è la funzione che un’istanza di entità esercita nell’ambito di un’associazione, e nel caso di un’associazione unaria il ruolo è sempre necessario.&lt;br /&gt;
Il modello ER offre costrutti per definire: &lt;br /&gt;
vincoli di cardinalità, sia per associazioni che per attributi. Questi si dividono in cardinalità minima( numero minimo d’istanze di un’associazione a cui le istanze delle entità coinvolte nell’associazione possono partecipare) e cardinalità massima( numero massimo di un’associazione a cui le istanze dell’entità coinvolte nell’associazione posso partecipare).&lt;br /&gt;
Data un’entità E ed un’associazione A: &lt;br /&gt;
i.c_max=1, ogni istanza di E può partecipare a non più di un’istanza di A,&lt;br /&gt;
ii.c_max=c_min=1, ogni istanza i E partecipa ad una ed una sola istanza di A,&lt;br /&gt;
iii.c_min=0, c_max=n, ogni istanza di E può partecipare ad un numero qualsiasi di istanze di A, anche nessuna.&lt;br /&gt;
vincoli d’identificazione, per entità. Identificatori per un’entità: insieme di attributi e/o entità che identificano le istanze dell’entità. Un identificatore è minimale se qualsiasi sottoinsieme proprio non è un identificatore. Le entità deboli ha  sempre cardinalità(1,1) rispetto all’associazione attraverso cui avviene l’dentificazione.&lt;br /&gt;
Uno a uno: se c_max di E e di E°, rispetto ad A è 1;&lt;br /&gt;
Uno a molti: se c_max di E rispetto ad A è n e c_max di E° rispetto ad A è 1, o viceversa. Un impiegato può essere associato a molti altri reparti.&lt;br /&gt;
Molti a molti: l’insieme di relazioni Lavora_in, in cui un impiegato può lavorare in diversi reparti e ogni reparto può avere diversi impiegati.&lt;br /&gt;
Insieme di entità deboli: se c_max di E e di E°, rispetto ad A è n. Questa viene identificata univocamente solo considerando alcuni attributi in congiunzione con la chiave primaria di un’altra entità, che è chiamata  proprietario identificante. Devono valere queste condizioni:&lt;br /&gt;
l’insieme di entità proprietarie e l’insieme di entità deboli devono partecipare in un insieme di relazioni uno-a-molti. Questo insieme di relazioni è chiamato insieme di relazioni identificanti dell’insieme di relazioni deboli&lt;br /&gt;
l’insieme di entità deboli deve aver partecipazione totale nell’insieme di relazioni identificanti.&lt;br /&gt;
Per identificare che si ha un’entità debole si usa un tratto più spesso.                  &lt;br /&gt;
Mentre per indicare che si ha una chiave parziale si userà una sottolineatura a tratti. &lt;br /&gt;
La specializzazione è il processo con cui s’individuano sottoinsiemi di un insieme di entità(la superclasse) che condividono alcune caratteristiche distintive. Tipicamente, la superclasse viene definita per prima,poi le sottoclassi, ed infine si aggiungono gli attributi specifici e gli insiemi di relazioni.&lt;br /&gt;
La generalizzazione consiste nell’identificare alcune caratteristiche comuni a una collezione di insiemi di entità e creare un nuovo insieme di entità che contiene quelle entità che possiedono caratteristiche comuni. Le sottoclassi si definiscono per prime, poi le superclassi, e poi si aggiungono tutti gli insiemi di relazioni che coinvolgono la superclasse.&lt;br /&gt;
I vincoli di disgiunzione determinano se a due sottoclassi è premesso contenere la stessa identità.&lt;br /&gt;
I vincoli di copertura determinano se le entità di una sottoclasse includono, nel loro complesso tutte le entità della superclasse.&lt;br /&gt;
L’aggregazione ci permette di indicare che un insieme di relazioni partecipa in un altro insieme di relazioni. Ciò viene illustrato con un riquadro tratteggiato intorno all’insieme di relazioni.&lt;br /&gt;
L’uso di un modello di dati semantico di alto livello offre nella progettazione concettuale il vantaggio addizionale che il progetto ad alto livello può essere rappresentato con diagrammi e facilmente compreso dalle molte persone che devono fornire informazioni utili al processo progettuale.&lt;br /&gt;
L’approccio normale consta nel considerare le necessità dei vari gruppo di utenti, risolvere i conflitti e generare un singolo insieme di requisiti. Un altro tipo di approccio consiste nello sviluppare schemi concettuali separati per i diversi gruppi di utenza, per poi integrarli. Per fare ciò si deve stabilire le corrispondenze tra le entità, le relazioni e gli attributi, e risolvere diversi tipi di conflitti.&lt;br /&gt;
&lt;br /&gt;
Un insieme di entità è tradotto in una relazione in maniera molto semplice: ogni attributo di un insieme di entità diventa un attributo della tabella.&lt;br /&gt;
Per rappresentare una relazione, dobbiamo potere identificare ciascuna entità partecipante, e dare valori agli attributi descrittivi della relazione, quindi:&lt;br /&gt;
gli attributi della chiave primaria di ciascun insieme di entità partecipante, come campi di chiavi esterne&lt;br /&gt;
gli attributi descrittivi dell’insieme di relazioni.&lt;br /&gt;
Se un insieme di relazioni coinvolge n insiemi di entità, e m di essi sono collegati con frecce ne diagramma ER, la chiave per ciascuno di questi m insiemi costituisce una chiave per la relazione in cui l’insieme è tradotto. Quindi abbiamo m  chiavi candidate, e una di queste dovrebbe essere scelta come chiave primaria.&lt;br /&gt;
Un secondo approccio per tradurre un insieme di relazioni con vincoli di chiave si rivela spesso migliore, perché evita di creare una tabella distinta per l’insieme di relazioni.&lt;br /&gt;
L’idea è di includere le informazioni sull’insieme di relazioni nella tabella corrispondente all’insieme di entità con la chiave, sfruttando il vincolo di chiave.&lt;br /&gt;
Lo svantaggio in questo è che potrebbe esserci uno spreco di spazio. In tal caso i campi aggiunti dovrebbero essere riempiti con valori null. La prima traduzione evita questa inefficienza, ma alcune interrogazioni importanti richiedono di combinare informazioni da due relazioni, il che può essere un operazione lenta.&lt;br /&gt;
Un insieme di entità deboli partecipa sempre in una relazione binaria uno-a-molti e ha vincoli di chiave e di partecipazione totale. Questa ha solo una chiave parziale, e quando un’entità proprietaria viene cancellata, vogliamo che vengano eliminate anche le entità deboli collegate.&lt;br /&gt;
&lt;br /&gt;
==PROGETTAZIONE CONCETTUALE==&lt;br /&gt;
&lt;br /&gt;
La progettazione concettuale di una base di dati ci fornisce un insieme di schemi di relazione e VI che possono essere considerati un buon punto di partenza per il progetto finale. Permette di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale.&lt;br /&gt;
Presentiamo ora una panoramica sui problemi che il raffinamento degli schemi intendo risolvere:&lt;br /&gt;
problemi causati dalla ridondanza: memorizzare la stessa informazione in maniera ridondante, cioè in diversi posti all’interno della stessa base di dati può portare a diversi problemi: &lt;br /&gt;
memorizzazione ridondante;&lt;br /&gt;
anomalie da aggiornamento, se una coppia di questi dati ripetuti viene aggiornata si crea un’inconsistenza, a meno di aggiornare anche tutte le altre copie;&lt;br /&gt;
anomalie da inserimento, potrebbe non essere possibile registrare certe informazioni, a meno di inserire anche qualche altra informazione non correlata;&lt;br /&gt;
anomalie di cancellazione.&lt;br /&gt;
Idealmente vorremmo degli schemi che non permettano ridondanza, ma quanto meno vogliamo poter identificare gli schemi che lo permettono:&lt;br /&gt;
valori null: questi non possono fornire una soluzione completa, ma possono aiutare. Questi valori possono essere utili per le anomalie da inserimento e cancellazione.&lt;br /&gt;
decomposizione, la ridondanza nasce quando uno schema relazionale forza una associazione tra attributi che non è naturale. Le dipendenze funzionali possono essere usate per identificare tali situazioni e per suggerire raffinamenti dello schema. Molti problemi che nascono dalla ridondanza possono essere risolti sostituendo una relazione con una collezione di relazioni “più piccolo”. Una decomposizione di uno schema di relazione r consiste nella sostituzione della schema di relazione con due(o più) schemi di relazione ciascuno dei quali contiene un sottoinsieme di attributi di R, e la cui unione include tutti tali attributi. Noi vogliamo memorizzare le informazioni in ogni data istanza di r memorizzandone le proiezioni. Se non si sta attenti con la decomposizione si possono creare più problemi di quanti se ne vogliano.&lt;br /&gt;
 la proprietà senza perdita(lossless join) ci permette di recuperare qualunque istanza di una relazione decomposta a partire dalle corrispondenti istanze delle relazioni componenti tramite operazioni di join;&lt;br /&gt;
la proprietà di  conservazione delle dipendenze ci consente di mantenere qualunque vincolo della relazione originaria semplicemente imponendo alcuni vincoli su ciascuna delle relazioni componenti. Ossia non abbiamo bisogno di effettuare join delle relazioni più piccolo per controllare se viene violato un vincolo della relazione originale.&lt;br /&gt;
La decomposizione  potrebbe migliorare le prestazioni, nel caso in cui la maggior parte delle interrogazioni degli aggiornamenti  esaminano solo una delle relazioni componenti, che è più piccola della relazione originale.&lt;br /&gt;
Dipendenze funzionali: DF è un tipo di VI che generalizza il concetto di chiave. Sia R uno schema di relazione e siano X e Y insiemi non vuoti di attributi di R, diciamo che un’istanza r di R soddisfa la DF X  Y (si  legge X determina funzionalmente Y, o X determina Y) se per ogni coppia di tuple t1 e t2 in r vale al seguente:&lt;br /&gt;
se t1.X  =  t2.X , allora  t1.Y = t2.Y&lt;br /&gt;
Una DF  X  Y essenzialmente dice che se due tuple coincidono sui valori dell’attributo X, devono anche avere lo stesso valore per l’attributo Y.&lt;br /&gt;
Un’istanza legale di una relazione soddisfare tutti i VI specificati. Quindi guardando l’istanza di una relazione, potremmo essere in grado di dire che una certa DF non è valida, però non possiamo mai dedurre che una DF è valida solo guardando una o più istanza di una relazione, perché una DF, diversamente da un VI, è un’affermazione su tutte le possibili istanze legali di una relazione.&lt;br /&gt;
La definizione di una DF non richiede che l’insieme X sia minimale: l’ulteriore condizione di minimalità deve essere soddisfatta perché X sia una chiave. Se vale X  Y, dove Y  è l’insieme di tutti gli attributi, ed esiste qualche sottoinsieme X di  tale che V  Y, allora X è una superchiave.&lt;br /&gt;
Diciamo che una DF f è implicata da un dato insieme F di DF se f vale su ogni istanza di relazione che soddisfa tutte le dipendenze in F, f vale ogni volta che tutte le DF valgono in F.  &lt;br /&gt;
Chiusura di un insieme di DF, l’insieme di tutte le DF implicate in un dato insieme F di DF è detto chiusura di F, denotato come F+. Come possiamo inferire(calcolare la chiusura di un dato insieme)?&lt;br /&gt;
Con gli Assiomi si Armstrong, i quali possono essere applicati per inferire tute le DF implicate da un insieme F di DF.&lt;br /&gt;
riflessività, se X  Y, allora X  Y;&lt;br /&gt;
aumento, se X  Y allora XZ  YZ per ogni Z;&lt;br /&gt;
transitività, se X  Y e Y  X, allora X  Z.&lt;br /&gt;
Teorema 1  gli assiomi di Armstrong sono corretti, nel senso che generano solo DF in F+ quando sono applicati a un insieme F di DF. Sono anche completi, nel senso che ripetute applicazioni di queste regole generano tutte le DF nella chiusura F+.&lt;br /&gt;
Quando si parla di F+ conviene usare alcune regole addizionali:&lt;br /&gt;
unione: se X  Y e X  Z, allora X  YZ;&lt;br /&gt;
decomposizione: se X  YZ, allora X  Y e X  Z.&lt;br /&gt;
in una DF banale, la parte destra contiene solo attributi che appaiono anche nella parte sinistra; tali dipendenze valgono sempre per via della riflessività. Usando questa possiamo generare tutte le dipendenze banali, che hanno la forma:&lt;br /&gt;
X  Y, dove Y  X, X  ABC e Y  ABC.&lt;br /&gt;
Dalla transitività otteniamo A  C. &lt;br /&gt;
Dall’aumento otteniamo le dipendenze non banali:&lt;br /&gt;
AC  BC, AB  AC, AB  CB.&lt;br /&gt;
Chiusura degli attributi, se volgiamo controllare se una data dipendenza, diciamo X  Y, è nella chiusura di un insieme F di DF, possiamo farlo in maniera efficiente senza calcolare la chiusura stessa.&lt;br /&gt;
Prima troviamo la chiusura degli attributi X+ rispetto a F, che è l’insieme degli attributi A tali che X  A può essere derivata usando gli Assiomi di Armstrong. Questo è l’algoritmo di calcolo:&lt;br /&gt;
		chiusura = X;&lt;br /&gt;
		ripeti fin quando non ci sono più cambiamenti: {&lt;br /&gt;
			se c’è una DF U  V in F tale che U  chiusura,&lt;br /&gt;
				allora chiusura = chiusura  V&lt;br /&gt;
			}&lt;br /&gt;
Teorema 2 l’algoritmo mostrato calcola la chiusura dell’insieme X di attributi rispetto all’insieme F delle DF.&lt;br /&gt;
Forme normali,  dato uno schema di relazione, abbiamo bisogno di decidere se esso sia un buon progetto o se c’è necessità di decomporlo in relazioni più piccole. Una tale decisione deve essere guidata dalla comprensione di quali problemi sono presenti nello schema corrente.&lt;br /&gt;
Le forme normali basate su DF sono la prima forma normale (1NF), la seconda(2NF), la terza(3NF) e la forma normale di Boyce-Codd(BCNF).&lt;br /&gt;
Una relazione è nella 1NF se ogni campo contiene solo valori atomici, cioè niente liste o insiemi. La 2NF ha un interesse storico. La 3NF e la BCNF sono importanti dal punto di vista della progettazione di una base di dati.&lt;br /&gt;
forma normale di Boyce-Codd, sia R uno schema di relazione, F sia l’insieme delle DF date su R, X sia un sottoinsieme degli attributi di R, e A un attributo di R. R è nella BCNF se per ogni DF X  A in F vale una delle seguenti asserzioni: &lt;br /&gt;
A  X, cioè è una DF banale,&lt;br /&gt;
X è una superchiave.&lt;br /&gt;
In una relazione in BCNF le sole dipendenze non banali sono   quelle in cui una chiave determina alcuni attributi. Perciò ogni tupla può essere vista come un’entità o relazione, identificata da una chiave e descritta dai restanti attributi. &lt;br /&gt;
La BCNF assicura che nessuna ridondanza può essere rilevata usando solo le informazioni delle DF. Quindi è la più desiderabile delle forme normali, se prendiamo in considerazione solo le informazioni delle DF.&lt;br /&gt;
Se X è una chiave, allora y1=y2, il che significa ce le due tuple sono identiche. Poiché una relazione è definita come un insieme di tuple, non possiamo avere due copie della stessa tupla.&lt;br /&gt;
Se una relazione è in BCNF, ogni campo di ciascuna tupla registra una parte d’informazione che non può essere dedotta dall’istanza della relazione.&lt;br /&gt;
terza forma normale, sia R uno schema di relazione, F l’insieme delle DF date su R, X un sottoinsieme degli attributi di R, e A un attributo di R. R è in 3NF se per ogni DF X  A in F vale:&lt;br /&gt;
A  X, cioè è una DF banale&lt;br /&gt;
X è una superchiave&lt;br /&gt;
A fa parte di una chiave di R.&lt;br /&gt;
Supponiamo che una dipendenza X  A provochi una violazione della 3NF, sono possibili due casi:&lt;br /&gt;
1)X è un  sottoinsieme proprio di qualche chiave K. Questa viene chiamata dipendenza parziale e viene memorizzato la coppia (X,A) in maniera ridondante.&lt;br /&gt;
2)X non è un sottoinsieme proprio di una chiave. Una tale dipendenza è a volte chiamata dipendenza transitiva, perché significa che abbiamo una catena di dipendenze K   X  A. Il problema è che non possiamo associare un valore X con un valore K a meno di associare anche un valore A con un valore X.&lt;br /&gt;
Nella 3NF è possibile qualche ridondanza. I problemi associati alle dipendenze parziali e transitive persistono se c’è una dipendenza non banale X  A e X non è una superchiave, anche se la relazione è nella forma 3NF perché A è parte di una chiave.&lt;br /&gt;
Proprietà delle decomposizioni;&lt;br /&gt;
- decomposizioni senza perdita, sia R uno schema di relazione e sia F un insieme di DF su R: una decomposizione di R in due schemi con insiemi di attributi X e Y si dice decomposizione senza perdita rispetto a F se per ogni istanza r di R che soddisfa le dipendenze in F, x(r) &amp;gt;&amp;lt; y ( r ) = r. Possiamo tornare alla relazione originale a partire dalle relazioni della decomposizione.&lt;br /&gt;
Tutte le decomposizioni usate per eliminare la ridondanza devono essere senza perdita d’informazione.&lt;br /&gt;
Teorema 3 sia R una relazione e F un insieme di DF che valgono su R. la decomposizione di R in due relazioni con insiemi di attributi R1 e R2 è senza perdita d’informazione se e solo se F+ contiene la DF R1R2 R1 oppure la DF R1R2 R2.   &lt;br /&gt;
- decomposizione con conservazione delle dipendenze, permette di applicare tutte le DF esaminando una singola istanza di relazione su ciascun inserimento o modifica di una tupla.&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&lt;br /&gt;
L’uso di comandi SQL in un programma scritto in un linguaggio ospite è chiamato SQL incapsulato, o embedded SQL. &lt;br /&gt;
I comandi SQL possono essere usati nel linguaggio ospite ovunque sia permesso. Ogni variabile del compilatore di quel linguaggio, usata per passare argomenti ad un comando SQL, deve essere dichiarata in SQL.&lt;br /&gt;
Devono essere dichiarate alcune variabili speciali del linguaggio ospite. Vi sono due complicazione di cui tener conto:&lt;br /&gt;
i tipi di dati riconosciuti da SQL potrebbero non essere riconosciuti dal linguaggio ospite, e viceversa,&lt;br /&gt;
SQL è orientato agli insiemi, quindi si passa all’uso dei cursori. I comandi operano su tabelle e producono tabelle, cioè insiemi.&lt;br /&gt;
I comandi possono far riferimento a variabili definite nel programma ospite, queste però devono essere precedute da due punti (:) nei comandi SQL, e devono essere dichiarate tra i comandi EXEC SQL BEGIN DECLARE SECTION ed EXEC SQL END DECLARE SECTION.&lt;br /&gt;
Si può pensare ad un cursore come se “puntasse” ad una riga nella collezione di risposte dell’interrogazione cui è associato. Quando un cursore viene aperto si posiziona appena prima della prima riga. Possiamo usare il comando FETCH per leggere la prima riga del cursore nelle variabili del linguaggio ospite. &lt;br /&gt;
Quando questo viene eseguito, il cursore viene posizionato per puntare alla riga successiva( che è la prima riga della tabella quando FETCH è eseguito per la prima volta dopo l’apertura del cursore) e i valori delle colonne nella riga sono copiarti nelle corrispondenti variabili ospiti. Eseguendo ripetutamente questo comando FETCH possiamo leggere tutte le righe calcolate dall’interrogazione, una alla volta.&lt;br /&gt;
Quando abbiamo finito col cursore usiamo il comando CLOSE.&lt;br /&gt;
Proprietà dei cursori, la forma generale della dichiarazione di un cursore è:&lt;br /&gt;
		DECLARE nome_cursore [INSENSITIVE] [SCROLL] CURSOR&lt;br /&gt;
		[WITH HOLD]&lt;br /&gt;
		FOR qualche interrogazione&lt;br /&gt;
		[ORDER BY lista-ordinamento]&lt;br /&gt;
		[FOR READ ONLY | FOR UPDATE]&lt;br /&gt;
Un cursore può essere dichiarato di sola lettura (FOR READ ONLY) oppure, se è definito su una relazione di base o una vista aggiornabile(FOR UPDATE).&lt;br /&gt;
Se è aggiornabile, semplici varianti dei comandi UPDATE e DELETE ci permettono di aggiornare o cancellare la riga su cui il cursore è posizionato&lt;br /&gt;
Un cursore è aggiornabile per default a meno che nella sua definizione sia stato specificato SCROLL e INSENSITIVE, nel qual caso è di sola lettura.&lt;br /&gt;
SCROLL;il cursore è scorrevole, quindi le varianti del comando FETCH possono essere usate per posizionarlo in maniera molto flessibile; altrimenti è consentito il solo comando FETCH di base, che sposta il cursore alla riga successiva.&lt;br /&gt;
INSENSITIVE;il cursore si comporta come se si muovesse su una copia privata della collezione di righe della risposta. Altrimenti per impostazione predefinita, le azioni di qualche altra transazione potrebbero modificare tali righe, creando comportamenti non prevedibili.&lt;br /&gt;
Un cursore mantenibile viene specificato con la clausola WITH HOLD, e non è chiuso quando la transazione termina. Se una qualunque transazione viene interrotta il sistema, potenzialmente, deve rifare parecchio lavoro. Quindi l’alternativa è spezzare la transazione in diverse transazioni, più piccole, ma ricordare la posizione nella tabella è complicato e soggetto a errori.&lt;br /&gt;
ORDER BY; può essere usata per specificare un ordinamento. La lista-ordinamento è una lista di voci di ordinamento(nome di colonna), eventualmente seguito da una delle parole chiave ASC e DESC. Ogni colonna menzionata nella clausola ORDER BY deve apparire anche nella lista-selezione dell’interrogazione associata al cursore; altrimenti non è chiaro su quali colonne effettuare l’ordinamento.&lt;br /&gt;
SQL dinamico; i due comandi principali sono PREPARE e EXECUTE:&lt;br /&gt;
	char c_stringaSQL[] =  {“DELETE FROM Velisti WHERE esperienza &amp;gt; 5”};&lt;br /&gt;
	EXEC SQL PREPARE pronto FROM: c_stringaSQL;&lt;br /&gt;
	EXE SQL EXECUTE pronto;&lt;br /&gt;
1)il primo comando dichiara la variabile C c_stringaSQL e ne imposta il valore ad una rappresentazione stringa di un comando di SQL.&lt;br /&gt;
2)la seconda istruzione fa sì che tale stringa venga esaminata e compilata come comando SQL, con l’eseguibile risultante legato alla variabile pronto&lt;br /&gt;
3)la terza istruzione esegue il comando.&lt;br /&gt;
La preparazione di un comando SQL dinamico avviene durante l’esecuzione, che ne risulta appesantita. I comandi dell’SQL interattivo e dell’SQL incapsulato possono essere preparati una volta per tutte al momento della compilazione, e poi ri-eseguiti quanto si vuole. Di fatti si deve limitare l’uso dell’SQL dinamico a quelle situazioni in cui è essenziale.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter sottomettere al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti(Downie);&lt;br /&gt;
1.Pitch Facet; la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
note sul pentagramma,&lt;br /&gt;
nome A, B,C#,&lt;br /&gt;
pitch class number 0, 1, 2,&lt;br /&gt;
solfeggio do, re mi.&lt;br /&gt;
Intervallo: è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
Melodia: insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
Chiave: viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
Contorno melodico: il pattern degli intervalli.&lt;br /&gt;
2.Temporal Facet: informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
i.Metrica&lt;br /&gt;
ii.Indicatori di tempo&lt;br /&gt;
iii.Durata del pitch&lt;br /&gt;
iv.Accenti&lt;br /&gt;
v.Durata armonica&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano(questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato)&lt;br /&gt;
Pause: possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
Informazione temporale: può essere:&lt;br /&gt;
Assoluta ( metronomo ),&lt;br /&gt;
Generale ( adagio, forte ),&lt;br /&gt;
Relativo ( schneller, langsamer ),&lt;br /&gt;
Temporal distorsion ( rubato, rallentando ).&lt;br /&gt;
3.Harmonic Facet: quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia ( caratteristica fondamentale della musica occidentale).&lt;br /&gt;
Gli eventi armonici , sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
4.Timbral Facet: comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
5.Editorial Facet: istruzioni sull’esecuzione( diteggiatura, ornamenti, istruzioni dinamiche, etc…). Anche la musica stessa può essere inclusa.&lt;br /&gt;
6.Textual Facet: è l’aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa.&lt;br /&gt;
7.Bibliographic Facet: sono informazioni relative a:&lt;br /&gt;
titolo&lt;br /&gt;
compositore&lt;br /&gt;
arrangiatore&lt;br /&gt;
editore&lt;br /&gt;
numero di catalogo&lt;br /&gt;
data pubblicazione&lt;br /&gt;
esecutori.&lt;br /&gt;
Uno degli obbiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
Interrogazioni per contenuto: confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca.&lt;br /&gt;
Per la costruzione di un DB musicale vi son tre passi:&lt;br /&gt;
1.individuare lo scopo dei dati. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
2.elencare i dati necessari, considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copy-right.&lt;br /&gt;
3.definire la miglior struttura per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni.&lt;br /&gt;
Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi son tre tipi di ricerca:&lt;br /&gt;
Browsing: può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti,&lt;br /&gt;
Textual search: indicizzazione di tutte le informazioni testuali accademiche( autore, titolo, …) e non accademiche( genere, frammenti delle liriche, …).&lt;br /&gt;
Search by content: interrogazioni basate sulla melodia o altri aspetti del contenuto audio.&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia( informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
Catalog information: sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
Multimedia characteristics: son metadadata che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette( da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
Query by content: servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
Verifica se un brano appena composto da un autore si frutto della creatività dell’artista e non influenzato da uno ascoltato in passato e poi dimenticato.&lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
a frammenti tematici: contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale,&lt;br /&gt;
database di intere partiture: sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
Query-by-humming, può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
L’approccio per questo metodo sono di due tipi: &lt;br /&gt;
DSP: elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
Simbolico: trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenza melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio( si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo(discreto) il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio(non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
Vi son dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
Note segmentation: dove sono posizionate esattamente le note?Quanto durano?&lt;br /&gt;
Pitch variation della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
Note quantization: come posizionare le altezze sulle scale musicali?&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze(di differenti ottave).&lt;br /&gt;
Sequenze di note: ogni elemento della sequenza è descritto da qualche parametro ( solitamente nome e durata della nota ).&lt;br /&gt;
Rappresentazione: &lt;br /&gt;
tutte le rappresentazioni della stessa nota vengono collassate in una sola,&lt;br /&gt;
l’alfabeto di 12 elementi, viene usato per rappresentare e dividere le altezze in semitoni,&lt;br /&gt;
questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Trasposizione: gli algoritmi per calcolare la similarità vengono applicati 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit&lt;br /&gt;
Sequenza d’intervalli: distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava.&lt;br /&gt;
È anche dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
Contorno melodico: si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to.&lt;br /&gt;
Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibili individuare univocamente il brano cercato.&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note, significa ottenere centinaia di brani simili, impossibili ascoltarli tutti per trovare quello corretto.&lt;br /&gt;
Però questo sistema è utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
Classi di equivalenza: ogni simbolo rappresenta n intervalli. &lt;br /&gt;
C1:ogni simbolo rappresenta un intervallo,&lt;br /&gt;
C3: ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
CU: tutti gli intervalli crescenti e decrescenti collassato in due differenti classi( contorno melodico ).&lt;br /&gt;
Rappresentazione Frame-based:&lt;br /&gt;
non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia,&lt;br /&gt;
il tempo viene diviso in frame di ugual misura,&lt;br /&gt;
viene stimato il valore di un pitch per ogni frame,&lt;br /&gt;
le note non sono esplicitamente descritte,&lt;br /&gt;
in un unico valore sono rappresentabili le informazioni relative ad altezza e durata.&lt;br /&gt;
Svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
Music psychology: c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, di fatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando.&lt;br /&gt;
L’interrogazione è distribuita su più voci:&lt;br /&gt;
non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando,&lt;br /&gt;
in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
memoria, che può essere a breve o lungo termine,&lt;br /&gt;
tipologia di utente, che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
Melodia: definire come una sequenza di note sia riconosciuta dall’uomo come una melodia di un brano polifonico.&lt;br /&gt;
String matching and melodic similarità: approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia f  la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e s la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
 f è fattore di x?&lt;br /&gt;
se f non appare in x, quale sottoparte di f è presente in s?&lt;br /&gt;
quante volte un’approssimazione di f è presente in s?&lt;br /&gt;
Blast algorithm: Basic Local Alignment Search Tool: uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze:&lt;br /&gt;
zone uguali o simili,&lt;br /&gt;
allineamenti globali.&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
Identità percentuale: numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi,&lt;br /&gt;
Conservazione: quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17646</id>
		<title>Database Musicali/Appunti/2006-2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.dsy.it/index.php?title=Database_Musicali/Appunti/2006-2007&amp;diff=17646"/>
		<updated>2007-07-11T10:56:46Z</updated>

		<summary type="html">&lt;p&gt;SingInTime: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa pagina è un copia-incolla poderoso degli appunti di '''El Conte''', che li ha generosamente pubblicati su [http://www.musicomio.org musicomio] e che ringrazio infinitamente. L'impaginazione verrà sistemata al più presto e vedrò anche di integrare eventuali punti mancanti/carenti/non chiari, ammesso che ne trovi...&lt;br /&gt;
&lt;br /&gt;
Promesso!&lt;br /&gt;
&lt;br /&gt;
==Introduzione==&lt;br /&gt;
===Il sistema informativo===&lt;br /&gt;
Un '''sistema informativo''' è la componente (o il sottosistema) di una organizzazione che gestisce, acquisisce, elabora, conserva, produce, le informazioni di interesse, cioè utilizzate per il perseguimento degli scopi dell’organizzazione stessa.&lt;br /&gt;
&lt;br /&gt;
Ogni organizzazione ha un sistema informativo, anche se può essere eventualmente non esplicitato nella struttura. Quasi sempre il sistema informativo è di supporto ad altri sottosistemi, e va quindi studiato nel contesto in cui è inserito. Inoltre è di solito suddiviso in sottosistemi (in modo gerarchico o decentrato), più o meno fortemente integrati tra loro.&lt;br /&gt;
&lt;br /&gt;
Il '''sistema informatico''' è invece la parte del sistema informativo che gestisce informazioni per mezzo della tecnologia informatica.&lt;br /&gt;
&lt;br /&gt;
La presenza di un sistema informatico all'interno di un sistema informativo non è obbligatoria: il concetto di “sistema informativo” è indipendente da qualsiasi automatizzazione. Esistono infatti organizzazioni la cui ragione d’essere è la gestione di informazioni (es: servizi anagrafici e banche) e che per secoli hanno operato senza l'ausilio dell'informatica.&lt;br /&gt;
&lt;br /&gt;
===Gestione delle informazioni===&lt;br /&gt;
Nelle attività umane, le informazioni vengono gestite (registrate e scambiate) in forme diverse, a seconda delle necessità e capacità:&lt;br /&gt;
* idee informali&lt;br /&gt;
* linguaggio naturale (scritto o parlato, formale o colloquiale, in una lingua o in un’altra)&lt;br /&gt;
* disegni, grafici, schemi&lt;br /&gt;
* numeri&lt;br /&gt;
* codici (anche segreti)&lt;br /&gt;
&lt;br /&gt;
E su vari supporti, dalla memoria umana alla carta.&lt;br /&gt;
&lt;br /&gt;
Nelle attività standardizzate dei sistemi informativi complessi, sono state introdotte col tempo forme di organizzazione e codifica delle informazioni.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, nei servizi anagrafici si è iniziato con registrazioni discorsive e sono state poi introdotte informazioni via via più precise:&lt;br /&gt;
* nome e cognome&lt;br /&gt;
* estremi anagrafici&lt;br /&gt;
* codice fiscale&lt;br /&gt;
&lt;br /&gt;
In particolare, nei sistemi informatici (e non solo in essi), le informazioni vengono rappresentate attraverso i '''dati'''.&lt;br /&gt;
&lt;br /&gt;
Si dice '''informazione''' tutto ciò che produce variazioni nel patrimonio conoscitivo di un soggetto detto percettore dell'informazione.&lt;br /&gt;
&lt;br /&gt;
Si dice '''dato''' una registrazione della descrizione di una qualsiasi caratteristica della realtà su un supporto che ne garantisca la conservazione e, mediante un insieme di simboli, ne garantisca la comprensibilità e la reperibilità.&lt;br /&gt;
&lt;br /&gt;
Uno degli obiettivi fondamentali di un sistema di gestione dati è fornire un '''contesto interpretativo''' ai dati, in modo da consentire un accesso efficace alle informazioni da essi rappresentate.&lt;br /&gt;
&lt;br /&gt;
==Database e DBMS==&lt;br /&gt;
===Cosa sono===&lt;br /&gt;
In un'accezione generica, un '''database''' è una collezione di dati, utilizzati per rappresentare le informazioni di interesse per una o più applicazioni. In un'accezione più specifica, un database è una collezione di dati gestita da un DBMS.&lt;br /&gt;
&lt;br /&gt;
Un '''DBMS''' (Database Management System) è un sistema (prodotto software) in grado di gestire collezioni di dati che siano:&lt;br /&gt;
* '''Grandi:''' di dimensioni (molto) maggiori della memoria centrale dei sistemi di calcolo utilizzati&lt;br /&gt;
* '''Persistenti:''' con un periodo di vita indipendentedalle singole esecuzioni dei programmi che le utilizzano&lt;br /&gt;
* '''Condivise:''' utilizzate da applicazioni diverse&lt;br /&gt;
&lt;br /&gt;
Un DBMS deve garantire '''affidabilità''' (resistenza a malfunzionamenti hardware e software) e '''privatezza''' (mediante politiche di controllo degli accessi). Come ogni prodotto informatico, un DBMS deve essere '''efficiente''', utilizzando al meglio le risorse di spazio e tempo del sistema, ed '''efficace''', rendendo produttive le attività dei suoi utilizzatori.&lt;br /&gt;
&lt;br /&gt;
La gestione di sistemi di dati grandi e persistenti è possibile anche tramite sistemi più semplici, quali gli ordinari file system dei sistemi operativi, che permettono di realizzare anche rudimentali forme di condivisione. I DBMS però estendono le funzionalità dei file system, fornendo più servizi ed in maniera integrata.&lt;br /&gt;
&lt;br /&gt;
===Caratteristiche===&lt;br /&gt;
I maggiori vantaggi di un DBMS sono: &lt;br /&gt;
* l’indipendenza dei dati&lt;br /&gt;
* un loro accesso efficiente&lt;br /&gt;
* integrità e sicurezza&lt;br /&gt;
* amministrazione&lt;br /&gt;
* organizzazione degli accessi e ripristino da crash&lt;br /&gt;
* riduzione del tempo di sviluppo delle applicazioni.&lt;br /&gt;
&lt;br /&gt;
Un DBMS è utile quando la quantità di dati è elevata e porterebbe ad un appesantimento operativo e/o quando si vogliono usare le sue potenzialità d’interrogazione dell’archivio di dati.&lt;br /&gt;
&lt;br /&gt;
Compito importante di un DBMS è la '''sequenzalizzazione di accessi concorrenti ai dati''' , così che ogni utente possa ignorare il fatto che altri stanno accedendo ai dati allo stesso tempo. Per fare ciò ci si serve di un meccanismo detto '''lock''' che serve a controllare l’acceso agli oggetti della base di dati. Un '''protocollo di locking''' è l'insieme di regole che ogni transazione deve seguire per garantire che l’effetto sia identico a quello ottenuto eseguendo tutte le transazioni in qualche ordine seriale.&lt;br /&gt;
&lt;br /&gt;
Il DBMS mantiene un log di tutte le scritture sulla base di dati. Ogni azione di scrittura deve essere registrata prima di effettuare la modifica nella base di dati.&lt;br /&gt;
&lt;br /&gt;
WAL(write-ahead log): usato nel caso il sistema andasse in crash appena fatto il cambiamento, ma prima che esso sia registrato nel log.&lt;br /&gt;
&lt;br /&gt;
===Modelli di dati===&lt;br /&gt;
Un '''modello di dati''' è un insieme di strumenti concettuali, o '''formalismo''', che consta di tre componenti fondamentali:&lt;br /&gt;
* un insieme di strutture dati&lt;br /&gt;
* una notazione per specificare i dati tramite le strutture dati del modello&lt;br /&gt;
* un insieme di operazioni per manipolare i dati.&lt;br /&gt;
&lt;br /&gt;
Generalmente si tratta di una struttura ad alto livello che nasconde molti dei dettagli di memorizzazione a basso livello. Un DBMS permette all’utente di definire i dati da memorizzare in termini di un modello di dati.&lt;br /&gt;
&lt;br /&gt;
Un '''modello di dati semantico''' è un modello di dati ad alto livello che rende più semplice ad un utente creare una buona descrizione iniziale dei dati. Questi contengono una grande quantità di costrutti che aiutano a descrivere lo scenario di un’applicazione reale.&lt;br /&gt;
&lt;br /&gt;
Al grado più elevato di astrazione troviamo i '''modelli concettuali''', che permettono di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale. Sono utilizzati nelle fasi preliminari di progettazione. Il più noto è il modello '''entità-relazione'''.&lt;br /&gt;
&lt;br /&gt;
Scendendo di livello troviamo i '''modelli logici''', utilizzati per l’organizzazione dei dati. Ad essi fanno riferimento i programmi, e sono indipendenti dalle strutture fisiche di memorizzazione. Ecco alcuni esempi di modelli logici: relazionale, reticolare, gerarchico, a oggetti...&lt;br /&gt;
&lt;br /&gt;
E' importante che modelli simili favoriscano l''''indipendenza dei dati'''. Tale proprietà si ottiene quando le applicazioni sono isolate dalle modifiche al modo in cui i dati sono strutturati e memorizzati.&lt;br /&gt;
&lt;br /&gt;
Vi sono due tipi d’indipendenza dei dati: &lt;br /&gt;
* '''logica:''' i cambiamenti della struttura logica dei dati possono essere resi  trasparenti agli utenti , cosi come la scelta delle relazioni da memorizzare&lt;br /&gt;
* '''fisica:''' lo schema logico isola gli utenti dai cambiamenti nei dettagli fisici di registrazione.&lt;br /&gt;
&lt;br /&gt;
===Il modello relazionale===&lt;br /&gt;
Il '''modello relazionale''' è il modello logico più noto ed è quello che viene solitamente implementato in un DBMS. E' stato proposto da E. F. Codd nel 1970 per favorire l’indipendenza dei dati e reso disponibile in DBMS reali nel 1981. Si basa sul concetto matematico di '''relazione''', questo fornisce al modello una base teorica che permette di dimostrare formalmente proprietà di dati e operazioni.&lt;br /&gt;
&lt;br /&gt;
Una relazione consiste in uno '''schema relazionale''' e nelle sue '''istanze di relazione'''. Lo schema specifica il nome della relazione, il nome di ogni campo, ed il dominio di ciascun campo. Un'istanza di relazione è la &amp;quot;realizzazione concreta&amp;quot; dello schema relazionale e può essere vista come una tabella con righe, dette tuple o record, divise in colonne (o campi) contenenti i dati. I campi di ciascuna tupla devono corrispondere per numero e tipo ai campi dello schema relazionale.&lt;br /&gt;
&lt;br /&gt;
Il '''grado''' di una relazione è il numero dei campi presenti. La '''cardinalità''' di un'istanza di relazione è il numero di tuple in essa.&lt;br /&gt;
&lt;br /&gt;
Una collezione d'istanze di relazione, una per ogni schema di relazione nello schema di una base di dati relazionale, forma un'istanza della base di dati.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
	&lt;br /&gt;
Il calcolo relazionale è un linguaggio d'interrogazione formale basato sulla logica matematica, e le interrogazioni in tale linguaggio hanno un significato preciso e intuitivo.&lt;br /&gt;
&lt;br /&gt;
L’algebra relazionale è una forma di linguaggio formale basato su una relazione di operatori per manipolare le relazioni e ha la stessa potenza del calcolo.&lt;br /&gt;
&lt;br /&gt;
Una transazione è una qualunque esecuzione di un programma utenti in un DBMS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un DMBS è diviso in :&lt;br /&gt;
un ottimizzatore d’interrogazioni che usa informazioni sulla memorizzazione dei dati per produrre un piano di esecuzione efficiente per la sua valutazione&lt;br /&gt;
piano di esecuzione, usato per valutare l’interrogazione&lt;br /&gt;
gestore dello spazio sul disco&lt;br /&gt;
gestore delle transazioni, assicura che le transazioni richiedano e rilascino i lock seguendo un buon protocollo di bloccaggio e programma l’esecuzione delle transazioni&lt;br /&gt;
gestore dei lock, tiene traccia delle richieste dei lock&lt;br /&gt;
gestore del ripristino, responsabile del mantenimento del log e del ripristino del sistema. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo standard dei linguaggi SQL usa la parola table per indicare relazione.&lt;br /&gt;
CREATE TABLE, usato per definire una nuova tabella (CREATE TABLE Studenti )&lt;br /&gt;
CREATE TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	(&amp;lt; specifica colonna &amp;gt; [, &amp;lt; specifica colonna &amp;gt; ]);&lt;br /&gt;
&amp;lt; specifica colonna &amp;gt;, ha il seguente formato&lt;br /&gt;
&amp;lt; nome colonna &amp;gt; &amp;lt; dominio &amp;gt; [DEFAULT &amp;lt; valore default &amp;gt;]&lt;br /&gt;
dove &amp;lt; dominio &amp;gt; è il dominio della colonna, ed è uno dei tipi di dato SQL;&lt;br /&gt;
&amp;lt; valore default &amp;gt; è un valore del dominio, assunto dalle tuple se nessun valore è specificato per la colonna.&lt;br /&gt;
INSERT, usato per inserire le tuple&lt;br /&gt;
INSERT&lt;br /&gt;
INTO R [(C…C°)]&lt;br /&gt;
{VALUES (e…e°)| sq};&lt;br /&gt;
(e…e°) è una lista di valori da assegnare alla nuova tupla, questi sono assegnati in base ad una corrispondenza posizionale&lt;br /&gt;
sq, è una sub-query&lt;br /&gt;
le tuple generate come risposta alla sq vengono inserite nella relazione R&lt;br /&gt;
la clausola di proiezioni di sq deve contenere colonne compatibili con le colonne di R a cui si assegnano valori&lt;br /&gt;
il dominio della colonna C(i=1,…., n) deve essere compatibile con il dominio della colonna i-esima contenuta nella clausola di proiezione di SQL.&lt;br /&gt;
Tutte le colonne non esplicitamente elencate ricevono il valore nullo o il valore di default.&lt;br /&gt;
DELETE, usato per cancellare le tuple&lt;br /&gt;
DELETE&lt;br /&gt;
FROM  R[alias]&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può essere associato ad un alias se è necessario riferire a tuple di tale relazione una qualche sotto-interrogazione presente in F&lt;br /&gt;
se non viene specificata alcuna clausola di qualificazione vengono cancellate tutte le tuple.&lt;br /&gt;
UPDATE, usato per modificare i valori in una riga esistente&lt;br /&gt;
UPDATE R[alias]&lt;br /&gt;
SET C={e |NULL},…, C°={e° | NULL}&lt;br /&gt;
[WHERE F];&lt;br /&gt;
il nome della relazione può avere associato un alias se è necessario riferire tuple di tale relazione in una qualche sotto-interrogazione presente in F&lt;br /&gt;
C={e |NULL},…, C°={i=1 | NULL}, è un’espressione di assegnamento che specifica che alla colonna C, deve essere assegnato il valore dell’espressione e.&lt;br /&gt;
Questa può essere una costante, spesso funzione dei valori correnti delle tuple da modificare, o una sub-query&lt;br /&gt;
si può specificare che alla colonna sia assegnato il valore nullo.&lt;br /&gt;
VINCOLI D’INTEGRITA’ è una condizione specificata in uno schema di base dati e limita i dati che possono essere memorizzati in una istanza alla base dati. Ci son vincoli statici(relativi ad uno stato della base di dati) e vincoli di transizione(mettono in relazione stati diversi della base di dati).&lt;br /&gt;
Un DBMS applica i vincoli d’integrità, nel senso che permette alle istanze legali di essere memorizzate nella base di dati&lt;br /&gt;
quando i DBA o l’utente finale definiscono uno schema di base dati, specificano i VI che devono valere per ogni istanza di tale base dati&lt;br /&gt;
quando un’applicazione viene eseguita , il DBMS controlla se ci sono violazioni e no premette le modifiche ai dati che violano i VI specificati.&lt;br /&gt;
Integrità referenziale; rappresenta un importante vincolo d’integrità semantica. Difatti se una tupla t riferisce come valori di una chiave esterna i valori V1,….,Vn, allora deve esistere nella relazione riferita una tupla t° con valori di chiave V1,….,Vn.&lt;br /&gt;
VINCOLI DI CHIAVE è l’imposizione che un certo sottoinsieme minimale dei campi di una relazione sia un identificatore unico per una tupla. Un insieme di campi che identificano univocamente una tupla secondo un vincolo di chiave si chiama chiave candidata per la relazione, altresì chiamata chiave.&lt;br /&gt;
due tuple distinte in una istanza legale non possono avere valori uguali in tutti i campi di una chiave. In ogni istanza legale i valori nei campi chiave identificano univocamente una tupla di una istanza.&lt;br /&gt;
nessun sottoinsieme dell’insieme dei campi di una chiave è un identificatore unico della tupla.&lt;br /&gt;
Ogni relazione ha una chiave, e l’insieme di tutti i campi è una sottochiave. Se ci sono altri vincoli, alcuni sottoinsiemi dei campi possono formare una chiave, ma se ciò non si verifica l’insieme di tutti i campi è una chiave&lt;br /&gt;
Chiave primaria, si può far riferimento ad una tupla in qualunque parte della base di dati memorizzando i valori dai campi della sua chiave. Per definire una chiave primaria in SQL viene usato il comando PRIMARY KEY, mentre per dichiarare un sottoinsieme delle colonne di una tabella si usa UNIQUE. Nella scelta di una chiave primaria è meglio usarne una, candidata, che viene usata più frequentemente nelle interrogazioni.&lt;br /&gt;
Chiave esterna, deve essere uguale alla chiave primaria della relazione referenziata, cioè deve avere lo stesso numero di colonne e tipi di dati compatibili, sebbene i nomi delle colonne possano essere diversi. Se una relazione R ha trai suoi attributi un insieme di attributi che costituisce la chiave di una relazione R, allora tale insieme è una chiave esterna di R su R°. Queste chiavi permettono di collegare tra loro tuple di relazioni diverse e costituiscono un meccanismo, per valore, per modellare le associazioni tra relazioni. Quindi una tupla che deve riferire ad un’altra tupla include tra i suoi attributi uno o più di essi, il cui valore è quello della chiave della seconda tupla.&lt;br /&gt;
 La presenza di NULL in una chiave esterna non viola il vincolo di chiave. Il comando in SQL è FOREIGN KEY che ha delle opzioni aggiuntive, sul come comportarsi una volta implementata la chiave esterna. &lt;br /&gt;
	FOREIGN KEY(&amp;lt; lista nomi colonne &amp;gt;)&lt;br /&gt;
	REFERENCES &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
	 [ON DELETE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
	[ ON UPDATE { NO ACTION |&lt;br /&gt;
		CASCADE | SET NULL | SET DEFAULT )}&lt;br /&gt;
l’opzione predefinita è NO ACTION(l’azione deve essere ignorata).&lt;br /&gt;
CASCADE dice che se una riga viene cancellata, tutte le sue righe che la referenziano devono essere eliminate. Lo stesso vale per il caso di un UPDATE, dove l’aggiornamento viene propagato a ciascuna riga,&lt;br /&gt;
ON DELETE permette di specificare le azioni da eseguire nel caso di cancellazione di una tupla riferita tramite chiave esterna,&lt;br /&gt;
ON UPDATE permette di specificare le azioni da eseguire nel caso di modifica del valore di chiave di una tupla riferita tramite chiave esterna&lt;br /&gt;
Per default un vincolo viene verificato al termine di ogni istruzione SQL che potrebbe portare ad una violazione, e se questa ci fosse il comando viene rifiutato.&lt;br /&gt;
L’SQL permette di specificare che un vincolo sia in modalità DEFERRED o IMMEDIATE: SET CONSTRAINT vincolo DEFERRED.&lt;br /&gt;
Un’interrogazione di una base di dati relazionale è una domanda sui dati, e la risposta consiste in una nuova relazione contenente il risultato. Un esempio di query è:&lt;br /&gt;
	SELECT*&lt;br /&gt;
	FROM&lt;br /&gt;
	WHERE&lt;br /&gt;
*significa che vogliamo tutti i campi delle tuple che compongono il risultato.&lt;br /&gt;
Una vista è una tabella le cui righe non sono esplicitamente memorizzate nella base dati, ma sono calcolate quando necessario in base a una definizione di vista.&lt;br /&gt;
Questa può essere usata come in una tabella di base per definire nuove interrogazioni o viste.&lt;br /&gt;
DROP TABLE, per eliminare una tabella e la sua forma è:&lt;br /&gt;
		DROP TABLE &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
			{ RESTRICT | CASCADE };&lt;br /&gt;
se viene specificata l’opzione RESTRICT, la relazione viene cancellata solo se non è riferita da altri elementi dello schema della base di dati;&lt;br /&gt;
se viene specificata l’opzione CASCADE, la relazione e tutti gli elementi dello schema della base di dati che eventualmente la riferiscono vengono cancellati.&lt;br /&gt;
ALTER TABLE, modifica la struttura di una tabella esistente e la sua forma è:&lt;br /&gt;
		ALTER TABLE &amp;lt; nome relazione &amp;gt; &amp;lt; modifica &amp;gt;;&lt;br /&gt;
&amp;lt; modifica &amp;gt; è la modifica da effettuare, tra l’aggiunta di una nuova colonna, modifica di una colonna e l’eliminazione.&lt;br /&gt;
ALGEBRA RELAZIONALE: linguaggio formale di interrogazione associato al modello relazionale. Le interrogazioni sono composte usando una collezione di operatori, e ognuno di questi deve accettare istanze di relazione come argomenti e restituisce un’istanza di relazione con risultato.&lt;br /&gt;
Invece un’espressione di algebra relazionale è ricorsivamente definita come una relazione, un operatore algebrico unario applicato ad una singola espressione o un operatore algebrico binario applicato a due espressioni.&lt;br /&gt;
Ogni interrogazione relazionale descrive una procedura passo-passo per calcolare la risposta desiderata, basandosi sull’ordine in cui gli operatori sono in essa applicati.&lt;br /&gt;
Selezione ; l’operatore di selezione specifica le tuple da mantenere attraverso una condizione di selezione. Questa è una combinazione Booleana di termini che hanno la forma attributo op costante oppure attributo1 op attributo2, dove op è uno degli operatori di confronto &amp;lt;,&amp;lt;=,=,=&amp;gt;,&amp;gt;,.&lt;br /&gt;
Proiezione ; l’operatore di proiezione invece ci permette di estrarre colonne da una relazione.&lt;br /&gt;
Le operazioni possibili sugli insiemi sono: &lt;br /&gt;
UNIONE, RS restituisce un’istanza di relazione contenente tutte le tuple presenti nell’istanza di relazione R oppure S. Due istanze sono dette compatibili rispetto all’unione quando: &lt;br /&gt;
1) hanno lo stesso numero dei campi;&lt;br /&gt;
2) campi corrispondenti hanno lo stesso dominio. &lt;br /&gt;
INTERSEZIONE, RS restituisce un’istanza contenente tutte le tuple presenti sia in R che in S&lt;br /&gt;
DIFFERENZA, R-S restituisce un’istanza contenente tutte le tuple presenti in R ma non in S. Le relazioni devono essere compatibili all’unione, e lo schema del risultato è identico a R&lt;br /&gt;
PRODOTTO CARTESIANO, RxS restituisce un’istanza di relazione il cui schema contiene tutti i campi di R seguiti da tutti i campi di S. Il risultato di RxS contiene una tupla |r,s|.&lt;br /&gt;
Rinomina , usato per rinominare le tabelle.&lt;br /&gt;
JOIN: usato per combinare informazioni da due o più relazioni. Un predicato di JOIN esprime una relazione che deve essere verificata dalle tuple risultato dell’interrogazione. Vi sono diversi tipi di join:&lt;br /&gt;
JOIN CONDIZIONALE; la versione più generale dell’operatore di join accetta una condizione di join c e un paio di istanze di relazione come argomenti e restituisce un’istanza di relazione.&lt;br /&gt;
      c (RxS)&lt;br /&gt;
EQUIJOIN; lo si ha quando la condizione di join consiste solamente di uguaglianze della forma R.nome1=S.nome2. In questo caso mantenere entrambi gli attributi sarebbe ridondante come cosa. Per le condizioni di join che contengono solo queste uguaglianze l’operazione di join è completata con una ulteriore proiezione in cui S.nome2 viene scartato. Lo schema del risultato di un equijoin contiene i campi di R, seguiti dai campi di  che non appaiono condizioni di join.&lt;br /&gt;
JOIN NATURALE; è un equijoin in cui le uguaglianze sono specificate su tutti i campi aventi lo stesso nome in R e S. Questo tipo di join gode della proprietà per cui il risultato è certamente privo di coppie di campi con lo stesso nome. C’è anche da dire che non corrisponde ad un operatore di NATURAL JOIN,dato che non si esegue alcuna proiezione, e lo scema risultante è quello del prodotto cartesiano. La sua forma è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; NATURAL JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
JOIN ESTERNI(pg99); questi si basano sui valori null, aggiungono al risultato le tuple R e S che non hanno partecipato al join, completandole con NULL,&lt;br /&gt;
R OUTER JOIN S&lt;br /&gt;
Esistono diverse varianti dell’OUTER JOIN;&lt;br /&gt;
1.FULL: sia le tuple di R che quelle di S che non partecipano  al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
2.LEFT: le tuple di R che non partecipano al JOIN vengono completate ed inserite nel risultato,&lt;br /&gt;
3.RIGHT: le tuple S che non partecipano al JOIN vengono completate ed inserite nel risultato.&lt;br /&gt;
CROSS JOIN; questi operatori poiché producono relazioni possono essere usati nella clausola FROM. È la forma di operatore JOIN più semplice che corrisponde al prodotto cartesiano. La sua sintassi è:&lt;br /&gt;
&amp;lt; nome relazione &amp;gt; CROSS JOIN &amp;lt; nome relazione &amp;gt;&lt;br /&gt;
DIVISIONE, l’operazione di divisione A/B è l’insieme di tutti valori di x(in forma di tuple unarie) tali che per ogni valore y in B, ci sia una tupla |x,y| in A. L’idea di fondo è di calcolare tutti i valori di x che non sono interdetti(un valore è interdetto se unendo a esso un valore y di B si ottiene una tupla |x,y| che non è in A).Le tuple interdette possono esser calcolate così: x(( x (A) x B) – A).&lt;br /&gt;
&lt;br /&gt;
SQL:I linguaggi di basi dati come SQL permettono all’utente di specificare per quali relazioni e quali attributi è necessario mantenere l’integrità referenziale( e le azioni da eseguire in caso di violazione). La forma base di un’interrogazione SQL è: &lt;br /&gt;
SELECT [DISTINCT] lista-select&lt;br /&gt;
FROM lista-from&lt;br /&gt;
WHERE qualificazione&lt;br /&gt;
Lista-select, è una lista di nomi di colonne delle tabelle nominate nella lista-from. I nomi di colonne possono avere come prefisso una variabile di range.&lt;br /&gt;
Lista-from, è una lista di nomi di tabelle. Un nome di tabella può essere seguito da una variabile di range(questa è utile quando lo stesso nome di tabella appare più volte nella lista-from).&lt;br /&gt;
Qualificazione, è una combinazione booleana di condizioni nella forma espressione op espressione, dove op è uno degli operatori di confronto.&lt;br /&gt;
Ogni interrogazione deve avere una clausola SELECT, che specifica le colonne da includere nel risultato, e una clausola FROM, che specifica un prodotto cartesiano di tabelle. La clausola opzionale WHERE specifica condizioni di selezione sulle tabelle menzionate nella clausola FROM.&lt;br /&gt;
Se omettiamo la parola chiave DISTINCT, otterremo una copia della riga (v,e), e la risposta sarebbe un multi-insieme di righe. &lt;br /&gt;
Il processo d’interrogazione di un DB consta in:&lt;br /&gt;
caricamento della lista di attributi;&lt;br /&gt;
scarto delle tuple che non soddisfano la qualificazione;&lt;br /&gt;
eliminazione degli attributi che non sono nella lista-from.&lt;br /&gt;
Un multi-insieme è un simile ad un insieme, nel senso che è una collezione non ordinata di elementi, ma possono esserci diverse copie, e il numero di copie è significativo: due multi-insiemi possono avere gli stessi elementi e tuttavia essere diversi, poiché il numero di copie dello stesso elemento è diverso.&lt;br /&gt;
Tipi numerici esatti:&lt;br /&gt;
INTEGER; la precisione di questo tipo di dato è espressa in numero di bit, a seconda della specifica implementazione di SQL,&lt;br /&gt;
SMALLINT; l’unico requisito è che la precisione di questo tipo di dato sia non maggiore della precisione del tipo di dato INTEGER. Questo viene usato per eventuali ottimizzazioni in quanto i valori richiedono minore spazio di memorizzazione,&lt;br /&gt;
BIGINT; l’unico requisito è che la precisione di questo tipo di dato sia non minore della precisione del tipo di dato INTEGER,&lt;br /&gt;
NUMERIC; caratterizzato da una precisione(numero totale di cifre) e una scala(numero di cifre dopo la virgola), il valore default per la precisione è 1 e per la scala è 0,&lt;br /&gt;
DECIMAL; simile a NUMERIC, ma la specifica di questo tipo di dato ha la forma: DECIMAL[(precisione[,scala])].&lt;br /&gt;
Tipi numerici approssimati:&lt;br /&gt;
REAL; rappresenta valori reali a singola precisione in virgola mobile, e la precisione dipende dalla specifica implementazione si SQL,&lt;br /&gt;
DOUBLE PRECISION; rappresenta valori reali a doppia precisione in virgola mobile, e questa dipende sempre dall’implementazione di SQL(però deve essere maggiore della precisione di tipo REAL),&lt;br /&gt;
FLOAT; rappresenta valori reali alla precisione desiderata, ed ha la forma FLOAT[(precisione)]. La precisione minima specificabile è 1.&lt;br /&gt;
Tipi di dato carattere:&lt;br /&gt;
CHARACTER; rappresenta stringhe di caratteri di lunghezza predefinita, spesso abbreviato in CHAR. La specifica ha il formato CHAR[(n)], con n lunghezza delle stringhe. E’ possibile usare come valore una stringa di lunghezza inferiore a n, che viene completata con spazi fino a raggiungere tale lunghezza,&lt;br /&gt;
CHARACTER VARYING; rappresenta stringhe di caratteri di lunghezza massima predefinita. Spesso abbreviato in VARCHART, e la sua forma è VARCHART(n), dove n è la lunghezza massima delle stringhe.&lt;br /&gt;
Tipi di dato temporali:&lt;br /&gt;
DATE; rappresenta le date espresse come anno(4cifre), mese(2cifre) e giorno(2cifre),&lt;br /&gt;
TIME; rappresenta i tempi espressi come ora(2cifre), minuto(2cifre) e secondo(2cifre),&lt;br /&gt;
TIMESTAMP; rappresenta una “concatenazione” fra DATE e TIME. Permette di rappresentare timestamp che consistono in: anno, mese, giorno, ora, minuto, secondo e microsecondo,&lt;br /&gt;
INTERVAL; rappresenta una durata temporale in riferimento ad uno o più qualificatori. I valori di questo tipo son rappresentati dalla parola chiave INTERVAL seguita da una stringa che esprime la durata in termini di uno o più qualificatori. Se sono presenti due qualificatori, il primo è più ampio del secondo e sono separati dalla parola chiave TO.&lt;br /&gt;
Tipo di dato:&lt;br /&gt;
BOOLEAN; i valori di tali tipo sono TRUE, FALSE, UNKNOWN(questo viene introdotto per la gestione dei confronti con valori nulli,&lt;br /&gt;
CHARACTER LARGE OBJECT(CLOB); permette di rappresentare sequenze di caratteri di elevate dimensioni,&lt;br /&gt;
BINARY LARGE OBJECT(BLOB); permette di rappresentare sequenze di bit di elevate dimensioni. &lt;br /&gt;
E’ possibile convertire un valore ad un altro tipo mediante l’operatore di CAST&lt;br /&gt;
		CAST (e) AS &amp;lt; tipo target &amp;gt;&lt;br /&gt;
AS: per introdurre una variabile di range.&lt;br /&gt;
I nomi delle tabelle possono essere implicitamente usati come variabili in linea. Si ha la necessità di introdurre esplicitamente le variabili di range solo quando la clausola FROM contiene più di una occorrenza di una relazione. Se una variabile di range è stata introdotta nella relazione, un nome di tabella non può essere usato come variabile di range esplicita.&lt;br /&gt;
Ogni elemento in una lista-select può essere della forma espressione AS nome_colonna ( questo è il nuovo nome che la colonna avrà nel risultato dell’interrogazione. Inoltre, ogni termine in una qualificazione può anche essere rappresentato nella forma generale espressione1 = espressione2.&lt;br /&gt;
L’SQL permette il pattern matching, su valori di tipo stringa, attraverso l’uso dell’operatore LIKE, insieme all’uso dei caratteri jolly %( zero o più caratteri qualunque) e ( esattamente un carattere qualunque). Quindi “AB%” denota una qualunque stringa che contiene almeno tre caratteri, con il secondo ed il terzo uguali a A e B.&lt;br /&gt;
SQL fornisce tre comandi per la manipolazione degli insiemi che estendono la forma d’interrogazione basilare, e sono:&lt;br /&gt;
UNION, restituisce tutte le tuple distinte restituite da almeno una delle sotto-interrogazioni a cui è applicato. Se si usa la clausola ORDER BY, questa deve essere usata una sola volta alla fine dell’interrogazione e non alla fine di ogni SELECT,&lt;br /&gt;
INTERSECT, corrisponde all’intersezione, restituisce le tuple restituite da entrambe le sotto interrogazioni a cui è applicato.&lt;br /&gt;
EXCEPT, corrisponde alla differenza, e restituisce le tuple della seconda sotto-interrogazione a cui è applicato.&lt;br /&gt;
Questo linguaggio fornisce anche altre operazioni sugli insiemi:&lt;br /&gt;
IN, per controllare se un elemento è in un dato insieme. C IN(v,….v°), nella forma negata C NOT IN(v,….v°).&lt;br /&gt;
ANY&lt;br /&gt;
ALL, per confrontare un valore con gli elementi di un dato insieme, usando l’operatore di confronto op&lt;br /&gt;
EXISTS, per controllare se un insieme è vuoto.&lt;br /&gt;
BETWEEN, permette di determinare le tuple che contengono in un dato attributo valori in un intervallo dato. C BETWEEN v AND v° , nella forma negata invece C NOT BETWEEN v AND v°,&lt;br /&gt;
ABS(N); calcola il valore assoluto del valore numerico N,&lt;br /&gt;
MOD(n,b); calcola il resto intero della divisione n per b.&lt;br /&gt;
UNION, INTERSECT ed EXCEPT possono essere usati su qualsiasi coppia di tabelle che siano compatibili rispetto all’unione, cioè che abbiamo lo stesso numero e tipo di colonne.&lt;br /&gt;
Nel caso si UNION i duplicati vengono eliminati automaticamente. Per mantenerli è necessario aggiungere ALL (UNION ALL). Lo stesso discorso vale per INTERSECT ed EXCEPT.&lt;br /&gt;
Espressioni e funzioni: un’espressione usata nella clausola di proiezione di un’interrogazione, dà luogo ad una colonna, detta virtuale, non presente nella relazione su cui si effettua l’interrogazione.&lt;br /&gt;
Le colonne virtuali non sono fisicamente memorizzate, ma sono calcolate dinamicamente come risultato dell’esecuzione dell’interrogazione. &lt;br /&gt;
Espressioni e funzioni per stringhe:&lt;br /&gt;
Operatore di concatenazione denotato da ||,&lt;br /&gt;
LENGHT(str), restituisce la lunghezza della stringa str, in numero di caratteri,&lt;br /&gt;
UPPER(str) e LOWER(str), trasformano la stringa str in caratteri tutti maiuscoli o tutti minuscoli, rispettivamente,&lt;br /&gt;
SUBSTR(str, m,[n]), estrae dalla stringa str la sottostringa dal carattere di posizione m per una lunghezza n,&lt;br /&gt;
TRIM[str°] FROM str, elimina dalla stringa str° i caratteri in str.&lt;br /&gt;
Un’interrogazione annidata è un’interrogazione che al suo interno ha un’altra interrogazione. Questa solitamente appare nella clausola WHERE, o anche in FROM o HAVING. Se una sub-query scalare restituisce più di una tupla si genera un errore di run-time, e se nessuna tupla verifica la sotto-interrogazione, viene restituito il valore NULL.&lt;br /&gt;
E’ anche possibile selezionare più di una colonna tramite sotto-interrogazioni, in tal caso è necessario apporre delle parentesi alla lista delle colonne a sinistra dell’operatore di confronto. Ad esempio, voglio elencare gli impiegati con la stessa mansione di Martini;&lt;br /&gt;
		SELECT Nome FROM Impiegati&lt;br /&gt;
		WHERE(Mansione, Stipendio) = (SELECT&lt;br /&gt;
			Mansione, Stipendio FROM Impiegati&lt;br /&gt;
				WHERE Nome = “Martini”);&lt;br /&gt;
Una sub-query può contenere a sua volta un’altra sub-query. E’ possibile definire sotto-interrogazioni che sono eseguite ripetutamente per ogni tupla candidata considerata nella valutazione dell’interrogazione esterna, e ogni volta che questa considera una tupla candidata, deve invocare la sotto-interrogazione. Questo tipo viene chiamato correlato, dato che ogni esecuzione è correlata al valore di uno o più attributi delle tuple candidate nell’interrogazione principale. Per poter fare riferimento alle colonne delle tuple candidate nell’interrogazione esterna si fa uso degli alias di relazione(questo è definito nell’interrogazione esterna e riferito nella sotto-interrogazione correlata. Sono utili quando si vuole fare riferimento a due diverse tuple della stessa relazione.).&lt;br /&gt;
UNIQUE, quando applichiamo questo comando ad una sotto-interrogazione, la condizione che ne risulta ritorna vero se  nessuna riga appare due volte nella risposta all’interrogazione, se non ci sono duplicati. Ritorna vero se la risposta è vuota.&lt;br /&gt;
Operatori di aggregazione:&lt;br /&gt;
COUNT ([DISTINCT] A) , è numero di valori unici della colonna A,&lt;br /&gt;
SUM ([DISTINCT] A) , la somma di tutti i valori unici nella colonna A,&lt;br /&gt;
AVG ([DISTINCT] A) , la media di tutti i valori unici nella colonna A,&lt;br /&gt;
MAX (A) , il valore massimo della colonna A,&lt;br /&gt;
MIN (A) , il valore minimo della colonna A.&lt;br /&gt;
Non ha senso specificare DISTINCT insieme a MIN e MAX.&lt;br /&gt;
Le clausole GROUP BY e HAVING;&lt;br /&gt;
		SELECT [DISTINCT]  lista-select&lt;br /&gt;
		FROM lista-from&lt;br /&gt;
		WHERE qualificazione&lt;br /&gt;
		GROUP BY lista gruppo&lt;br /&gt;
		HAVING  qualificazione gruppo.&lt;br /&gt;
La lista-select consiste di una lista di nomi di colonne e una lista di termini della forma aggop(nome-colonna) AS nuovo-nome. Ogni colonna che appare nella lista dei nomi deve apparire nella lista-gruppo.&lt;br /&gt;
Le espressioni che compaiono nella qualificazione gruppo della clausola HAVING devono avere un singolo valore per gruppo. L’idea di base è che la clausola HAVING         ( può essere una combinazione Booleana di predicati, i quali tuttavia possono solo coinvolger funzioni di gruppo) determina se per ogni gruppo dato debba essere generata una riga della risposta.&lt;br /&gt;
Un’importante restrizione ci dice che una clausola di protezione di una query contenente GROUP BY può includere solamente:&lt;br /&gt;
una o più colonne tra le colonne che compaiono nella suddetta clausola,&lt;br /&gt;
funzioni di gruppo(che possono apparire in funzioni aritmetiche).&lt;br /&gt;
Le funzioni di gruppo permettono di estrarre informazioni da gruppi di tuple invece di una relazione, queste si basano su due concetti:&lt;br /&gt;
il partizionamento delle tuple di un relazione in base al valore di uno o più colonne della relazione,&lt;br /&gt;
il calcolo della funzione di gruppo per ogni gruppo ottenuto col partizionamento. &lt;br /&gt;
Una funzione di gruppo ha come argomento una colonna e si applica all’insieme dei valori di questa colonna, estratti dalle tuple che appartengono allo stesso gruppo.&lt;br /&gt;
E’ possibile applicare queste funzioni senza partizionamento e in tal caso saranno applicate ad un unico gruppo contente tutte le tuple della relazione.&lt;br /&gt;
Se GROUP BY viene omesso l’intera tabella viene vista come un singolo gruppo&lt;br /&gt;
COUNT, se questo non include DISTINCT, allora COUNT(*) dà la stessa risposta di COUNT(x), dove x è un qualunque insieme di attributi.&lt;br /&gt;
L’SQL fornisce un valore di colonna speciale chiamato null da usare quando il valore della colonna è sconosciuto oppure inapplicabile.&lt;br /&gt;
Possiamo impedire l’uso dei valori null specificando NOT NULL come parte della definizione dei campi. Inoltre i campi in una chiave primaria non posso assumere valori null, quindi vi è un vincolo di NOT NULL, implicito per ogni campo elencato in un vincolo di PRIMARY KEY.&lt;br /&gt;
Si può specificare vincoli sulla tabella usando vincoli di tabella, che hanno la forma CHECK espressione-condizionale.&lt;br /&gt;
In un comando CREATE TABLE, la clausola CHECK può comparire;&lt;br /&gt;
di seguito alla definizione di una colonna ( vincoli di CHECK su colonna )&lt;br /&gt;
come clausola separata dall’interno della definizione della relazione ( vincoli CHECK su relazione ).&lt;br /&gt;
Specificando un vincolo CHECK vogliamo che ogni tupla nella relazione soddisfi la condizione. E’ consigliabile esprimere tramite CHECK solo le condizioni che devono essere verificate da ogni singola tupla della relazione cui associamo il vincolo.&lt;br /&gt;
E’ possibile assegnare nome ai vincoli associati alle definizioni di relazione facendo seguire la specifica del vincolo nella parola chiave CONSTRAINT e dal nome. Difetti specificare un nome per tutti i vincoli è utile per potersi poi riferire ad essi.&lt;br /&gt;
Le asserzioni servono per esprimere vincoli di integrità che coinvolgono più tuple o relazioni, e vengono così formulate:&lt;br /&gt;
		CREATE ASSERTION &amp;lt; nome asserzione &amp;gt;&lt;br /&gt;
		CHECK(&amp;lt; condizione &amp;gt;).&lt;br /&gt;
I vincoli di una tabella sono associati ad una tabella singola. Il soddisfacimento di questi vincoli è richiesto solo se la tabella associata è vuota, quando un vincolo coinvolge due o più tabelle, il meccanismo di vincoli sulle tabelle è in qualche modo anomalo, e non ciò che si desidera.&lt;br /&gt;
Un trigger è una procedura che viene eseguita dal DBMS in risposta a specifici cambiamenti nella base di dati ed è definita dal DBA. Questi son divisi in tre parti:&lt;br /&gt;
evento: un cambiamento nella base di dati che attiva il trigger;&lt;br /&gt;
condizione: un’interrogazione o un test che viene eseguito quando il trigger è attivato;&lt;br /&gt;
azione; procedura che viene eseguita quando il trigger è attivato e la sua condizione è verificata.&lt;br /&gt;
Una condizione di trigger può essere un comando vero/falso oppure un’interrogazione. Questa viene interpretata come vero se l’insieme di risposta non è vuoto, falso se l’opposto. L’azione di un trigger può esaminare la risposta all’interrogazione nella parte condizionale dei trigger , fare riferimento a valori vecchi e nuovi delle tuple modificate dal comando che ha attivato il trigger, eseguire nuove interrogazioni e apportare cambiamenti alla base di dati.&lt;br /&gt;
&lt;br /&gt;
Progettazione di una base dati:&lt;br /&gt;
1)Analisi dei requisiti: il primissimo passo nella progettazione è capire quali dati devono essere memorizzati, quali applicazioni  devono essere costruite su di essi e quali operazioni sono più frequenti e soggette a requisiti prestazionali.&lt;br /&gt;
2)Progettazione concettuale della base di dati: le informazioni raccolte nel passo di analisi dei requisiti vengono usate per elaborare una descrizione ad alto livello dei dati da memorizzare. Questo passo è sviluppato usando il modello entità-relazione, il quale fa parte di una famiglia di diversi modelli di dati ad alto livello, o semantici, usati nella progettazione delle basi di dati. Lo scopo è creare una semplice descrizione dei dati che approssimi il modo in cui utenti e sviluppatori pensano ad essi.&lt;br /&gt;
3)Progettazione logica della base dati:  dobbiamo scegliere un DBMS per implementare in nostro progetto, e convertire la progettazione concettuale in uno schema nel modello del DBMS scelto. La traduzione non è sempre univoca.&lt;br /&gt;
4)Raffinamento dello schema: analizzare l’insieme di relazioni del nostro schema relazionale per identificare potenziali problemi, e a rifinirlo.&lt;br /&gt;
5)Progettazione fisica della base di dati: consideriamo i carichi di lavoro attesi che la nostra base di dati dovrò sopportare, e raffiniamo il progetto per garantire che esso soddisfi i criteri di prestazioni richieste. Questo può consistere nella costruzione di indici su qualche tabella e nel raggruppamento di alcune tabelle, oppure può coinvolgere una riprogettazione sostanziale di intere parti dello schema ottenuto precedentemente.&lt;br /&gt;
6)Progettazione delle applicazioni e della sicurezza.&lt;br /&gt;
Una entità è un oggetto nel mondo reale che si distingue da altri progetti. Vi sono anche insiemi di entità, e questi non hanno bisogno di essere disgiunti. Un entità è anche un’astrazione della realtà la cui informazione è indipendente dal dominio in cui l’entità è utilizzata. Invece un’istanza di entità sono specifici oggetti appartenenti ad una certa entità.&lt;br /&gt;
Un’entità è descritta usando un insieme di attributi. Tutte le entità di un dato insieme hanno gli stessi attributi: questo è ciò che s’intende con simili. La coppia (nome_di_attributo, dominio) viene chiamata attributo e ogni entità è caratterizzata da uno o più attributi(i quali possono essere monovalore, multivalore e compositi).&lt;br /&gt;
Per ogni attributo associato ad un insieme di entità, dobbiamo definire un dominio di valori possibili. Vi son diversi tipi di domini:&lt;br /&gt;
semplice, sono domini standard(interi, reali, booleani…), con intervalli ed insiemi di valori definiti per enumerazione dall’utente,&lt;br /&gt;
composti, l’insieme dei valori è dato dal prodotto cartesiano degli insiemi di valori associati ai domini componenti. Servono per associare un dominio agli attributi composti.&lt;br /&gt;
Le informazioni sui domini i un attributo non sono direttamente rappresentabili in un diagramma ER, sono però fondamentali per una corretta progettazione logica. &lt;br /&gt;
Inoltre per ciascun insieme di entità useremo una chiave. Questa è un insieme minimale di attributi i cui valori identificano univocamente una entità dell’insieme. Potrebbe esserci più di una chiave candidata, e in questo caso ne designiamo una come chiave primaria. Una chiave non può avere valori nulli, in alcuni casi la chiave può essere soltanto una dove il sistema non permette di averne di più.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli attributi vengono rappresentati con degli ovali, e se sono sottolineati sono delle chiavi primarie mentre le entità sono dei rettangoli.&lt;br /&gt;
Una relazione è un’associazione tra due o più entità.&lt;br /&gt;
Come per le entità potremmo voler raccogliere un gruppo di relazioni simili in un insieme di relazioni. Questo può essere visto come un insieme di n-tuple:&lt;br /&gt;
{( e1,… en)  E1,…,en   En}&lt;br /&gt;
Ciascuna n-tupla denota una relazione che coinvolge n entità, da e1 a en, dove l’entità ei appartiene all’insieme di entità Ei.&lt;br /&gt;
Una relazione può anche avere attributi descrittivi, i quali son usati per registrare informazioni sulla relazione, piuttosto che su ciascuna delle entità partecipanti.&lt;br /&gt;
Un’istanza di un insieme di relazioni è un insieme di relazioni, questa può esser vista come una “fotografia” dell’insieme di relazioni di un certo istante.&lt;br /&gt;
Gli insiemi di entità che partecipano ad una relazione non devono necessariamente essere distinti: qualche volta una relazione può coinvolgere entità dello stesso insieme.&lt;br /&gt;
Ruolo, è la funzione che un’istanza di entità esercita nell’ambito di un’associazione, e nel caso di un’associazione unaria il ruolo è sempre necessario.&lt;br /&gt;
Il modello ER offre costrutti per definire: &lt;br /&gt;
vincoli di cardinalità, sia per associazioni che per attributi. Questi si dividono in cardinalità minima( numero minimo d’istanze di un’associazione a cui le istanze delle entità coinvolte nell’associazione possono partecipare) e cardinalità massima( numero massimo di un’associazione a cui le istanze dell’entità coinvolte nell’associazione posso partecipare).&lt;br /&gt;
Data un’entità E ed un’associazione A: &lt;br /&gt;
i.c_max=1, ogni istanza di E può partecipare a non più di un’istanza di A,&lt;br /&gt;
ii.c_max=c_min=1, ogni istanza i E partecipa ad una ed una sola istanza di A,&lt;br /&gt;
iii.c_min=0, c_max=n, ogni istanza di E può partecipare ad un numero qualsiasi di istanze di A, anche nessuna.&lt;br /&gt;
vincoli d’identificazione, per entità. Identificatori per un’entità: insieme di attributi e/o entità che identificano le istanze dell’entità. Un identificatore è minimale se qualsiasi sottoinsieme proprio non è un identificatore. Le entità deboli ha  sempre cardinalità(1,1) rispetto all’associazione attraverso cui avviene l’dentificazione.&lt;br /&gt;
Uno a uno: se c_max di E e di E°, rispetto ad A è 1;&lt;br /&gt;
Uno a molti: se c_max di E rispetto ad A è n e c_max di E° rispetto ad A è 1, o viceversa. Un impiegato può essere associato a molti altri reparti.&lt;br /&gt;
Molti a molti: l’insieme di relazioni Lavora_in, in cui un impiegato può lavorare in diversi reparti e ogni reparto può avere diversi impiegati.&lt;br /&gt;
Insieme di entità deboli: se c_max di E e di E°, rispetto ad A è n. Questa viene identificata univocamente solo considerando alcuni attributi in congiunzione con la chiave primaria di un’altra entità, che è chiamata  proprietario identificante. Devono valere queste condizioni:&lt;br /&gt;
l’insieme di entità proprietarie e l’insieme di entità deboli devono partecipare in un insieme di relazioni uno-a-molti. Questo insieme di relazioni è chiamato insieme di relazioni identificanti dell’insieme di relazioni deboli&lt;br /&gt;
l’insieme di entità deboli deve aver partecipazione totale nell’insieme di relazioni identificanti.&lt;br /&gt;
Per identificare che si ha un’entità debole si usa un tratto più spesso.                  &lt;br /&gt;
Mentre per indicare che si ha una chiave parziale si userà una sottolineatura a tratti. &lt;br /&gt;
La specializzazione è il processo con cui s’individuano sottoinsiemi di un insieme di entità(la superclasse) che condividono alcune caratteristiche distintive. Tipicamente, la superclasse viene definita per prima,poi le sottoclassi, ed infine si aggiungono gli attributi specifici e gli insiemi di relazioni.&lt;br /&gt;
La generalizzazione consiste nell’identificare alcune caratteristiche comuni a una collezione di insiemi di entità e creare un nuovo insieme di entità che contiene quelle entità che possiedono caratteristiche comuni. Le sottoclassi si definiscono per prime, poi le superclassi, e poi si aggiungono tutti gli insiemi di relazioni che coinvolgono la superclasse.&lt;br /&gt;
I vincoli di disgiunzione determinano se a due sottoclassi è premesso contenere la stessa identità.&lt;br /&gt;
I vincoli di copertura determinano se le entità di una sottoclasse includono, nel loro complesso tutte le entità della superclasse.&lt;br /&gt;
L’aggregazione ci permette di indicare che un insieme di relazioni partecipa in un altro insieme di relazioni. Ciò viene illustrato con un riquadro tratteggiato intorno all’insieme di relazioni.&lt;br /&gt;
L’uso di un modello di dati semantico di alto livello offre nella progettazione concettuale il vantaggio addizionale che il progetto ad alto livello può essere rappresentato con diagrammi e facilmente compreso dalle molte persone che devono fornire informazioni utili al processo progettuale.&lt;br /&gt;
L’approccio normale consta nel considerare le necessità dei vari gruppo di utenti, risolvere i conflitti e generare un singolo insieme di requisiti. Un altro tipo di approccio consiste nello sviluppare schemi concettuali separati per i diversi gruppi di utenza, per poi integrarli. Per fare ciò si deve stabilire le corrispondenze tra le entità, le relazioni e gli attributi, e risolvere diversi tipi di conflitti.&lt;br /&gt;
&lt;br /&gt;
Un insieme di entità è tradotto in una relazione in maniera molto semplice: ogni attributo di un insieme di entità diventa un attributo della tabella.&lt;br /&gt;
Per rappresentare una relazione, dobbiamo potere identificare ciascuna entità partecipante, e dare valori agli attributi descrittivi della relazione, quindi:&lt;br /&gt;
gli attributi della chiave primaria di ciascun insieme di entità partecipante, come campi di chiavi esterne&lt;br /&gt;
gli attributi descrittivi dell’insieme di relazioni.&lt;br /&gt;
Se un insieme di relazioni coinvolge n insiemi di entità, e m di essi sono collegati con frecce ne diagramma ER, la chiave per ciascuno di questi m insiemi costituisce una chiave per la relazione in cui l’insieme è tradotto. Quindi abbiamo m  chiavi candidate, e una di queste dovrebbe essere scelta come chiave primaria.&lt;br /&gt;
Un secondo approccio per tradurre un insieme di relazioni con vincoli di chiave si rivela spesso migliore, perché evita di creare una tabella distinta per l’insieme di relazioni.&lt;br /&gt;
L’idea è di includere le informazioni sull’insieme di relazioni nella tabella corrispondente all’insieme di entità con la chiave, sfruttando il vincolo di chiave.&lt;br /&gt;
Lo svantaggio in questo è che potrebbe esserci uno spreco di spazio. In tal caso i campi aggiunti dovrebbero essere riempiti con valori null. La prima traduzione evita questa inefficienza, ma alcune interrogazioni importanti richiedono di combinare informazioni da due relazioni, il che può essere un operazione lenta.&lt;br /&gt;
Un insieme di entità deboli partecipa sempre in una relazione binaria uno-a-molti e ha vincoli di chiave e di partecipazione totale. Questa ha solo una chiave parziale, e quando un’entità proprietaria viene cancellata, vogliamo che vengano eliminate anche le entità deboli collegate.&lt;br /&gt;
&lt;br /&gt;
==PROGETTAZIONE CONCETTUALE==&lt;br /&gt;
&lt;br /&gt;
La progettazione concettuale di una base di dati ci fornisce un insieme di schemi di relazione e VI che possono essere considerati un buon punto di partenza per il progetto finale. Permette di rappresentare i dati in modo indipendente da ogni sistema, cercando di descrivere i concetti del mondo reale.&lt;br /&gt;
Presentiamo ora una panoramica sui problemi che il raffinamento degli schemi intendo risolvere:&lt;br /&gt;
problemi causati dalla ridondanza: memorizzare la stessa informazione in maniera ridondante, cioè in diversi posti all’interno della stessa base di dati può portare a diversi problemi: &lt;br /&gt;
memorizzazione ridondante;&lt;br /&gt;
anomalie da aggiornamento, se una coppia di questi dati ripetuti viene aggiornata si crea un’inconsistenza, a meno di aggiornare anche tutte le altre copie;&lt;br /&gt;
anomalie da inserimento, potrebbe non essere possibile registrare certe informazioni, a meno di inserire anche qualche altra informazione non correlata;&lt;br /&gt;
anomalie di cancellazione.&lt;br /&gt;
Idealmente vorremmo degli schemi che non permettano ridondanza, ma quanto meno vogliamo poter identificare gli schemi che lo permettono:&lt;br /&gt;
valori null: questi non possono fornire una soluzione completa, ma possono aiutare. Questi valori possono essere utili per le anomalie da inserimento e cancellazione.&lt;br /&gt;
decomposizione, la ridondanza nasce quando uno schema relazionale forza una associazione tra attributi che non è naturale. Le dipendenze funzionali possono essere usate per identificare tali situazioni e per suggerire raffinamenti dello schema. Molti problemi che nascono dalla ridondanza possono essere risolti sostituendo una relazione con una collezione di relazioni “più piccolo”. Una decomposizione di uno schema di relazione r consiste nella sostituzione della schema di relazione con due(o più) schemi di relazione ciascuno dei quali contiene un sottoinsieme di attributi di R, e la cui unione include tutti tali attributi. Noi vogliamo memorizzare le informazioni in ogni data istanza di r memorizzandone le proiezioni. Se non si sta attenti con la decomposizione si possono creare più problemi di quanti se ne vogliano.&lt;br /&gt;
 la proprietà senza perdita(lossless join) ci permette di recuperare qualunque istanza di una relazione decomposta a partire dalle corrispondenti istanze delle relazioni componenti tramite operazioni di join;&lt;br /&gt;
la proprietà di  conservazione delle dipendenze ci consente di mantenere qualunque vincolo della relazione originaria semplicemente imponendo alcuni vincoli su ciascuna delle relazioni componenti. Ossia non abbiamo bisogno di effettuare join delle relazioni più piccolo per controllare se viene violato un vincolo della relazione originale.&lt;br /&gt;
La decomposizione  potrebbe migliorare le prestazioni, nel caso in cui la maggior parte delle interrogazioni degli aggiornamenti  esaminano solo una delle relazioni componenti, che è più piccola della relazione originale.&lt;br /&gt;
Dipendenze funzionali: DF è un tipo di VI che generalizza il concetto di chiave. Sia R uno schema di relazione e siano X e Y insiemi non vuoti di attributi di R, diciamo che un’istanza r di R soddisfa la DF X  Y (si  legge X determina funzionalmente Y, o X determina Y) se per ogni coppia di tuple t1 e t2 in r vale al seguente:&lt;br /&gt;
se t1.X  =  t2.X , allora  t1.Y = t2.Y&lt;br /&gt;
Una DF  X  Y essenzialmente dice che se due tuple coincidono sui valori dell’attributo X, devono anche avere lo stesso valore per l’attributo Y.&lt;br /&gt;
Un’istanza legale di una relazione soddisfare tutti i VI specificati. Quindi guardando l’istanza di una relazione, potremmo essere in grado di dire che una certa DF non è valida, però non possiamo mai dedurre che una DF è valida solo guardando una o più istanza di una relazione, perché una DF, diversamente da un VI, è un’affermazione su tutte le possibili istanze legali di una relazione.&lt;br /&gt;
La definizione di una DF non richiede che l’insieme X sia minimale: l’ulteriore condizione di minimalità deve essere soddisfatta perché X sia una chiave. Se vale X  Y, dove Y  è l’insieme di tutti gli attributi, ed esiste qualche sottoinsieme X di  tale che V  Y, allora X è una superchiave.&lt;br /&gt;
Diciamo che una DF f è implicata da un dato insieme F di DF se f vale su ogni istanza di relazione che soddisfa tutte le dipendenze in F, f vale ogni volta che tutte le DF valgono in F.  &lt;br /&gt;
Chiusura di un insieme di DF, l’insieme di tutte le DF implicate in un dato insieme F di DF è detto chiusura di F, denotato come F+. Come possiamo inferire(calcolare la chiusura di un dato insieme)?&lt;br /&gt;
Con gli Assiomi si Armstrong, i quali possono essere applicati per inferire tute le DF implicate da un insieme F di DF.&lt;br /&gt;
riflessività, se X  Y, allora X  Y;&lt;br /&gt;
aumento, se X  Y allora XZ  YZ per ogni Z;&lt;br /&gt;
transitività, se X  Y e Y  X, allora X  Z.&lt;br /&gt;
Teorema 1  gli assiomi di Armstrong sono corretti, nel senso che generano solo DF in F+ quando sono applicati a un insieme F di DF. Sono anche completi, nel senso che ripetute applicazioni di queste regole generano tutte le DF nella chiusura F+.&lt;br /&gt;
Quando si parla di F+ conviene usare alcune regole addizionali:&lt;br /&gt;
unione: se X  Y e X  Z, allora X  YZ;&lt;br /&gt;
decomposizione: se X  YZ, allora X  Y e X  Z.&lt;br /&gt;
in una DF banale, la parte destra contiene solo attributi che appaiono anche nella parte sinistra; tali dipendenze valgono sempre per via della riflessività. Usando questa possiamo generare tutte le dipendenze banali, che hanno la forma:&lt;br /&gt;
X  Y, dove Y  X, X  ABC e Y  ABC.&lt;br /&gt;
Dalla transitività otteniamo A  C. &lt;br /&gt;
Dall’aumento otteniamo le dipendenze non banali:&lt;br /&gt;
AC  BC, AB  AC, AB  CB.&lt;br /&gt;
Chiusura degli attributi, se volgiamo controllare se una data dipendenza, diciamo X  Y, è nella chiusura di un insieme F di DF, possiamo farlo in maniera efficiente senza calcolare la chiusura stessa.&lt;br /&gt;
Prima troviamo la chiusura degli attributi X+ rispetto a F, che è l’insieme degli attributi A tali che X  A può essere derivata usando gli Assiomi di Armstrong. Questo è l’algoritmo di calcolo:&lt;br /&gt;
		chiusura = X;&lt;br /&gt;
		ripeti fin quando non ci sono più cambiamenti: {&lt;br /&gt;
			se c’è una DF U  V in F tale che U  chiusura,&lt;br /&gt;
				allora chiusura = chiusura  V&lt;br /&gt;
			}&lt;br /&gt;
Teorema 2 l’algoritmo mostrato calcola la chiusura dell’insieme X di attributi rispetto all’insieme F delle DF.&lt;br /&gt;
Forme normali,  dato uno schema di relazione, abbiamo bisogno di decidere se esso sia un buon progetto o se c’è necessità di decomporlo in relazioni più piccole. Una tale decisione deve essere guidata dalla comprensione di quali problemi sono presenti nello schema corrente.&lt;br /&gt;
Le forme normali basate su DF sono la prima forma normale (1NF), la seconda(2NF), la terza(3NF) e la forma normale di Boyce-Codd(BCNF).&lt;br /&gt;
Una relazione è nella 1NF se ogni campo contiene solo valori atomici, cioè niente liste o insiemi. La 2NF ha un interesse storico. La 3NF e la BCNF sono importanti dal punto di vista della progettazione di una base di dati.&lt;br /&gt;
forma normale di Boyce-Codd, sia R uno schema di relazione, F sia l’insieme delle DF date su R, X sia un sottoinsieme degli attributi di R, e A un attributo di R. R è nella BCNF se per ogni DF X  A in F vale una delle seguenti asserzioni: &lt;br /&gt;
A  X, cioè è una DF banale,&lt;br /&gt;
X è una superchiave.&lt;br /&gt;
In una relazione in BCNF le sole dipendenze non banali sono   quelle in cui una chiave determina alcuni attributi. Perciò ogni tupla può essere vista come un’entità o relazione, identificata da una chiave e descritta dai restanti attributi. &lt;br /&gt;
La BCNF assicura che nessuna ridondanza può essere rilevata usando solo le informazioni delle DF. Quindi è la più desiderabile delle forme normali, se prendiamo in considerazione solo le informazioni delle DF.&lt;br /&gt;
Se X è una chiave, allora y1=y2, il che significa ce le due tuple sono identiche. Poiché una relazione è definita come un insieme di tuple, non possiamo avere due copie della stessa tupla.&lt;br /&gt;
Se una relazione è in BCNF, ogni campo di ciascuna tupla registra una parte d’informazione che non può essere dedotta dall’istanza della relazione.&lt;br /&gt;
terza forma normale, sia R uno schema di relazione, F l’insieme delle DF date su R, X un sottoinsieme degli attributi di R, e A un attributo di R. R è in 3NF se per ogni DF X  A in F vale:&lt;br /&gt;
A  X, cioè è una DF banale&lt;br /&gt;
X è una superchiave&lt;br /&gt;
A fa parte di una chiave di R.&lt;br /&gt;
Supponiamo che una dipendenza X  A provochi una violazione della 3NF, sono possibili due casi:&lt;br /&gt;
1)X è un  sottoinsieme proprio di qualche chiave K. Questa viene chiamata dipendenza parziale e viene memorizzato la coppia (X,A) in maniera ridondante.&lt;br /&gt;
2)X non è un sottoinsieme proprio di una chiave. Una tale dipendenza è a volte chiamata dipendenza transitiva, perché significa che abbiamo una catena di dipendenze K   X  A. Il problema è che non possiamo associare un valore X con un valore K a meno di associare anche un valore A con un valore X.&lt;br /&gt;
Nella 3NF è possibile qualche ridondanza. I problemi associati alle dipendenze parziali e transitive persistono se c’è una dipendenza non banale X  A e X non è una superchiave, anche se la relazione è nella forma 3NF perché A è parte di una chiave.&lt;br /&gt;
Proprietà delle decomposizioni;&lt;br /&gt;
- decomposizioni senza perdita, sia R uno schema di relazione e sia F un insieme di DF su R: una decomposizione di R in due schemi con insiemi di attributi X e Y si dice decomposizione senza perdita rispetto a F se per ogni istanza r di R che soddisfa le dipendenze in F, x(r) &amp;gt;&amp;lt; y ( r ) = r. Possiamo tornare alla relazione originale a partire dalle relazioni della decomposizione.&lt;br /&gt;
Tutte le decomposizioni usate per eliminare la ridondanza devono essere senza perdita d’informazione.&lt;br /&gt;
Teorema 3 sia R una relazione e F un insieme di DF che valgono su R. la decomposizione di R in due relazioni con insiemi di attributi R1 e R2 è senza perdita d’informazione se e solo se F+ contiene la DF R1R2 R1 oppure la DF R1R2 R2.   &lt;br /&gt;
- decomposizione con conservazione delle dipendenze, permette di applicare tutte le DF esaminando una singola istanza di relazione su ciascun inserimento o modifica di una tupla.&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&lt;br /&gt;
L’uso di comandi SQL in un programma scritto in un linguaggio ospite è chiamato SQL incapsulato, o embedded SQL. &lt;br /&gt;
I comandi SQL possono essere usati nel linguaggio ospite ovunque sia permesso. Ogni variabile del compilatore di quel linguaggio, usata per passare argomenti ad un comando SQL, deve essere dichiarata in SQL.&lt;br /&gt;
Devono essere dichiarate alcune variabili speciali del linguaggio ospite. Vi sono due complicazione di cui tener conto:&lt;br /&gt;
i tipi di dati riconosciuti da SQL potrebbero non essere riconosciuti dal linguaggio ospite, e viceversa,&lt;br /&gt;
SQL è orientato agli insiemi, quindi si passa all’uso dei cursori. I comandi operano su tabelle e producono tabelle, cioè insiemi.&lt;br /&gt;
I comandi possono far riferimento a variabili definite nel programma ospite, queste però devono essere precedute da due punti (:) nei comandi SQL, e devono essere dichiarate tra i comandi EXEC SQL BEGIN DECLARE SECTION ed EXEC SQL END DECLARE SECTION.&lt;br /&gt;
Si può pensare ad un cursore come se “puntasse” ad una riga nella collezione di risposte dell’interrogazione cui è associato. Quando un cursore viene aperto si posiziona appena prima della prima riga. Possiamo usare il comando FETCH per leggere la prima riga del cursore nelle variabili del linguaggio ospite. &lt;br /&gt;
Quando questo viene eseguito, il cursore viene posizionato per puntare alla riga successiva( che è la prima riga della tabella quando FETCH è eseguito per la prima volta dopo l’apertura del cursore) e i valori delle colonne nella riga sono copiarti nelle corrispondenti variabili ospiti. Eseguendo ripetutamente questo comando FETCH possiamo leggere tutte le righe calcolate dall’interrogazione, una alla volta.&lt;br /&gt;
Quando abbiamo finito col cursore usiamo il comando CLOSE.&lt;br /&gt;
Proprietà dei cursori, la forma generale della dichiarazione di un cursore è:&lt;br /&gt;
		DECLARE nome_cursore [INSENSITIVE] [SCROLL] CURSOR&lt;br /&gt;
		[WITH HOLD]&lt;br /&gt;
		FOR qualche interrogazione&lt;br /&gt;
		[ORDER BY lista-ordinamento]&lt;br /&gt;
		[FOR READ ONLY | FOR UPDATE]&lt;br /&gt;
Un cursore può essere dichiarato di sola lettura (FOR READ ONLY) oppure, se è definito su una relazione di base o una vista aggiornabile(FOR UPDATE).&lt;br /&gt;
Se è aggiornabile, semplici varianti dei comandi UPDATE e DELETE ci permettono di aggiornare o cancellare la riga su cui il cursore è posizionato&lt;br /&gt;
Un cursore è aggiornabile per default a meno che nella sua definizione sia stato specificato SCROLL e INSENSITIVE, nel qual caso è di sola lettura.&lt;br /&gt;
SCROLL;il cursore è scorrevole, quindi le varianti del comando FETCH possono essere usate per posizionarlo in maniera molto flessibile; altrimenti è consentito il solo comando FETCH di base, che sposta il cursore alla riga successiva.&lt;br /&gt;
INSENSITIVE;il cursore si comporta come se si muovesse su una copia privata della collezione di righe della risposta. Altrimenti per impostazione predefinita, le azioni di qualche altra transazione potrebbero modificare tali righe, creando comportamenti non prevedibili.&lt;br /&gt;
Un cursore mantenibile viene specificato con la clausola WITH HOLD, e non è chiuso quando la transazione termina. Se una qualunque transazione viene interrotta il sistema, potenzialmente, deve rifare parecchio lavoro. Quindi l’alternativa è spezzare la transazione in diverse transazioni, più piccole, ma ricordare la posizione nella tabella è complicato e soggetto a errori.&lt;br /&gt;
ORDER BY; può essere usata per specificare un ordinamento. La lista-ordinamento è una lista di voci di ordinamento(nome di colonna), eventualmente seguito da una delle parole chiave ASC e DESC. Ogni colonna menzionata nella clausola ORDER BY deve apparire anche nella lista-selezione dell’interrogazione associata al cursore; altrimenti non è chiaro su quali colonne effettuare l’ordinamento.&lt;br /&gt;
SQL dinamico; i due comandi principali sono PREPARE e EXECUTE:&lt;br /&gt;
	char c_stringaSQL[] =  {“DELETE FROM Velisti WHERE esperienza &amp;gt; 5”};&lt;br /&gt;
	EXEC SQL PREPARE pronto FROM: c_stringaSQL;&lt;br /&gt;
	EXE SQL EXECUTE pronto;&lt;br /&gt;
1)il primo comando dichiara la variabile C c_stringaSQL e ne imposta il valore ad una rappresentazione stringa di un comando di SQL.&lt;br /&gt;
2)la seconda istruzione fa sì che tale stringa venga esaminata e compilata come comando SQL, con l’eseguibile risultante legato alla variabile pronto&lt;br /&gt;
3)la terza istruzione esegue il comando.&lt;br /&gt;
La preparazione di un comando SQL dinamico avviene durante l’esecuzione, che ne risulta appesantita. I comandi dell’SQL interattivo e dell’SQL incapsulato possono essere preparati una volta per tutte al momento della compilazione, e poi ri-eseguiti quanto si vuole. Di fatti si deve limitare l’uso dell’SQL dinamico a quelle situazioni in cui è essenziale.&lt;br /&gt;
&lt;br /&gt;
==MIR SYSTEM==&lt;br /&gt;
&lt;br /&gt;
Lo scopo di questi sistemi è di permettere a qualsiasi utente di eseguire ricerche su tutta la musica esistente, attraverso interfacce con cui poter sottomettere al sistema descrizioni esaustive, nel modo più naturale possibile fornendo applicazioni utili a collegare e manipolare l’informazione ritornata dal sistema.&lt;br /&gt;
L’informazione musicale può essere descritta attraverso sette aspetti(Downie);&lt;br /&gt;
1.Pitch Facet; la qualità del suono percepita che è principalmente una funzione della sua frequenza fondamentale.&lt;br /&gt;
Rappresentazione del pitch:&lt;br /&gt;
note sul pentagramma,&lt;br /&gt;
nome A, B,C#,&lt;br /&gt;
pitch class number 0, 1, 2,&lt;br /&gt;
solfeggio do, re mi.&lt;br /&gt;
Intervallo: è la differenza tra due pitch espressa in semitoni o attraverso la sua caratteristica tonale determinata dalla posizione dei due pitch nella sintassi tradizionale.&lt;br /&gt;
Melodia: insieme di pitch o intervalli percepiti in modo sequenziale bel tempo.&lt;br /&gt;
Chiave: viene considerato come sub-aspetto del pitch. I due contorni melodici sono presi percettivamente equivalenti, nonostante il fatto che sia diverso il loro pitch assoluto.&lt;br /&gt;
Contorno melodico: il pattern degli intervalli.&lt;br /&gt;
2.Temporal Facet: informazione relativa alla durata degli eventi musicali che include:&lt;br /&gt;
i.Metrica&lt;br /&gt;
ii.Indicatori di tempo&lt;br /&gt;
iii.Durata del pitch&lt;br /&gt;
iv.Accenti&lt;br /&gt;
v.Durata armonica&lt;br /&gt;
Questi elementi costituiscono la parte ritmica del brano(questo può essere rappresentato in diversi modi, ognuno dei quali definisce uno stesso risultato)&lt;br /&gt;
Pause: possono essere considerate indicatori della durata degli eventi musicali che non contengono pitch.&lt;br /&gt;
Informazione temporale: può essere:&lt;br /&gt;
Assoluta ( metronomo ),&lt;br /&gt;
Generale ( adagio, forte ),&lt;br /&gt;
Relativo ( schneller, langsamer ),&lt;br /&gt;
Temporal distorsion ( rubato, rallentando ).&lt;br /&gt;
3.Harmonic Facet: quando due o più pitch suonano simultaneamente, definita anche come polifonia. Interazione tra pitch e aspetto temporale per creare la polifonia ( caratteristica fondamentale della musica occidentale).&lt;br /&gt;
Gli eventi armonici , sebbene presenti nella partitura, non solo sempre indicati esplicitamente. La mente umana può percepire un accordo, nonostante la presenza di note “extra”.&lt;br /&gt;
4.Timbral Facet: comprende tutti gli aspetti del colore del tono. La distinzione tra una nota suonata da un flauto ed un clarinetto è causata dalla differenza del timbro. Fanno parte di questo aspetto le informazioni sulla composizione dell’orchestra, e anche l’enumerazione degli strumenti.&lt;br /&gt;
5.Editorial Facet: istruzioni sull’esecuzione( diteggiatura, ornamenti, istruzioni dinamiche, etc…). Anche la musica stessa può essere inclusa.&lt;br /&gt;
6.Textual Facet: è l’aspetto più indipendente dalla melodia e dagli arrangiamenti associati. Un frammento di lirica in alcuni casi non è sufficiente per ritrovare il brano ricercato e viceversa.&lt;br /&gt;
7.Bibliographic Facet: sono informazioni relative a:&lt;br /&gt;
titolo&lt;br /&gt;
compositore&lt;br /&gt;
arrangiatore&lt;br /&gt;
editore&lt;br /&gt;
numero di catalogo&lt;br /&gt;
data pubblicazione&lt;br /&gt;
esecutori.&lt;br /&gt;
Uno degli obbiettivi principali del MIR è permettere l’organizzazione dei dati per recuperare tutta l’informazione disponibile riguardante un certo brano musicale.&lt;br /&gt;
Interrogazioni per contenuto: confronto tra i complessi contenuti musicali presenti nella base di dati e contenuti musicali meno complessi introdotti come criterio di ricerca.&lt;br /&gt;
Per la costruzione di un DB musicale vi son tre passi:&lt;br /&gt;
1.individuare lo scopo dei dati. In questa fase è necessario definire come le informazioni devono essere collezionate ed inserite nel DB, quali relazioni esistono tra loro e quali tipi di interrogazioni rendere disponibili all’utente finale.&lt;br /&gt;
2.elencare i dati necessari, considerando le sorgenti d’informazione disponibili. Le informazioni testuali sono solitamente più ricche e frequenti di quelle multimediali a causa delle problematiche legate al copy-right.&lt;br /&gt;
3.definire la miglior struttura per questo corpo. In pratica come le informazioni vengono classificate ed organizzate, o qual è il miglior standard con cui scrivere queste informazioni.&lt;br /&gt;
Senza una buona struttura l’uso e l’accesso del DB diventa inutile e complicato, la sua efficienza ne risente come la sua manutenzione.&lt;br /&gt;
Una volta definito il DB è necessario definire le interfacce e le tipologie d’interrogazione da fornire all’utente. Vi son tre tipi di ricerca:&lt;br /&gt;
Browsing: può essere un mezzo utile per cercare in un sistema ricco di collegamenti tra i dati ed i metadati, e permette di passare da un brano all’altro attraverso diversi collegamenti,&lt;br /&gt;
Textual search: indicizzazione di tutte le informazioni testuali accademiche( autore, titolo, …) e non accademiche( genere, frammenti delle liriche, …).&lt;br /&gt;
Search by content: interrogazioni basate sulla melodia o altri aspetti del contenuto audio.&lt;br /&gt;
Naturalmente si possono combinare le varie tipologie di ricerca per aumentare la potenza e l’efficienza del sistema.&lt;br /&gt;
La maniera di mostrare i risultati cambia l’utilità e le manipolazioni possibili dei dati restituiti dal sistema. I dati restituiti devono essere sufficienti a riconoscere quale brano nella lista dei risultati è quello ricercato, e una volta riconosciuto l’utente deve poter accedere a tutte le informazioni collegate, suddivise per tipologia( informazioni di catalogo e testuali, link ai meta-dati, link ad altri oggetti musicali).&lt;br /&gt;
Un altro aiuto nella ricerca sono le informazioni di catalogo che limitano la ricerca alla sola musica conosciuta. Uno dei più grandi e potenti descrittori usati dai consumatori di musica è il genere musicale, difatti due brani appartenenti allo stesso genere musicale hanno molti più elementi in comune rispetto a due brani non appartenenti allo stesso genere.&lt;br /&gt;
Generalmente gli strumenti musicali aiutano a definire il genere.&lt;br /&gt;
Catalog information: sono le informazioni che descrivono i brani musicali, non strettamente correlate al contenuto musicale. Descrivono chi ha preso parte alla realizzazione del brano, dove è stato registrato, informazioni sul supporto e sul copyright.&lt;br /&gt;
Multimedia characteristics: son metadadata che descrivono qualcosa di strettamente legato al contenuto musicale, e le informazioni associate col ricordo del frammento usato nella query-by-content.&lt;br /&gt;
Per valutare un sistema MIR si deve controllare che sia molto efficiente ed affidabile.&lt;br /&gt;
Per affidabilità intendiamo che il sistema deve permetter di trovare tutte e sole le informazioni richieste dall’utente. Queste devono essere sempre corrette( da verificare quando i dati sono elaborati automaticamente).&lt;br /&gt;
La complessità dei sistemi MIR è dovuta soprattutto all’enorme quantità di oggetti musicali.&lt;br /&gt;
Query by content: servono a trovare un brano di cui non si conoscono informazioni quali il titolo, l’autore, o altri metadata sufficienti per individuarlo. Usato anche per il copyright in modo da capire se un brano è molto simile ad un altro.&lt;br /&gt;
Verifica se un brano appena composto da un autore si frutto della creatività dell’artista e non influenzato da uno ascoltato in passato e poi dimenticato.&lt;br /&gt;
Il criterio su cui si basa la query-by-content è il frammento musicale, e di fatti vengono usati due tipi di DB: &lt;br /&gt;
a frammenti tematici: contengono frammenti che rappresentano i tempi musicali presenti nei brani. Il tema in questo caso viene considerato come una sequenza di note ripetuta diverse volte all’interno della composizione musicale. Una sequenza di note invece è considerata un tema se nella composizione esistono altre sequenze ottenute da questo attraverso qualche operatore musicale,&lt;br /&gt;
database di intere partiture: sono presenti tutte le melodie contenute in tutte le voci dell’intera partitura, perché un utente potrebbe ricordare un solo frammento del brano non appartenente al tema.&lt;br /&gt;
Query-by-humming, può risultare non accurata ed è per utenti non esperti.&lt;br /&gt;
L’approccio per questo metodo sono di due tipi: &lt;br /&gt;
DSP: elaborazione della forma d’onda o delle frequenze per trovare similarità tra i brani. Vi è una trasformazione in simbolico, dove vengono estrapolate le caratteristiche descriventi gli eventi musicali. Questo sistema risulta molo faticoso e complesso.&lt;br /&gt;
Simbolico: trasformazione dei brani in sequenze di stringhe di caratteri rappresentanti le sequenza melodiche contenute nei brani. Il frammento della query viene trasformato allo stesso modo e quindi confrontato con le stringhe nel DB.&lt;br /&gt;
Come criterio per le query-by-content viene usato l’audio( si definisce attraverso l’analisi delle frequenze esistenti nello spettro del segnale in ogni istante di tempo(discreto) il corrispondente pitch).&lt;br /&gt;
In input avremo un frammento audio(non strutturato per definizione) ed in output le caratteristiche capaci di definire i note-pattern.&lt;br /&gt;
Vi son dei problemi legati alla trascrizione da audio a simbolico:&lt;br /&gt;
Note segmentation: dove sono posizionate esattamente le note?Quanto durano?&lt;br /&gt;
Pitch variation della nota suonata: come individuare l’esatta altezza della nota suonata?&lt;br /&gt;
Note quantization: come posizionare le altezze sulle scale musicali?&lt;br /&gt;
Purtroppo viene difficile capire quale nota deve essere associata all’altezza del suono, infatti non esiste sempre una corrispondenza esatta.&lt;br /&gt;
Lo stesso discorso vale per la rappresentazione simbolica, infatti esistono molte tipologie del formato. Possiamo avere casi dove la stessa altezza viene rappresentata in più modi diversi o il nome della nota può rappresentare più altezze(di differenti ottave).&lt;br /&gt;
Sequenze di note: ogni elemento della sequenza è descritto da qualche parametro ( solitamente nome e durata della nota ).&lt;br /&gt;
Rappresentazione: &lt;br /&gt;
tutte le rappresentazioni della stessa nota vengono collassate in una sola,&lt;br /&gt;
l’alfabeto di 12 elementi, viene usato per rappresentare e dividere le altezze in semitoni,&lt;br /&gt;
questo però comporta una perdita d’informazione sul contorno melodico.&lt;br /&gt;
Trasposizione: gli algoritmi per calcolare la similarità vengono applicati 12 volte su ogni sequenza. Viene usato questo metodo nei sistemi dove l’elaborazione è limitata agli incipit&lt;br /&gt;
Sequenza d’intervalli: distanza tra due note adiacenti misurata in semitoni. La sequenza melodica è data dalla sequenza delle distanze tra un elemento e il suo successore. Come risultato si ha un perdita della nozione di nota come elemento d’ottava.&lt;br /&gt;
È anche dimostrato che l’uomo ascoltando un brano non ha l’esatta percezione dell’altezza delle note, ma ricorda più facilmente la sequenza degli intervalli.&lt;br /&gt;
Contorno melodico: si considera solo la direzione tra una nota ed il suo successore. È possibile rappresentare la sequenza melodica con solo 3 simboli: up, down, equal to.&lt;br /&gt;
Questo però permette di avere una trascrizione di query-by-humming corretta, e se la melodia è abbastanza lunga è possibili individuare univocamente il brano cercato.&lt;br /&gt;
La lunghezza media di un query fragment è pari a 7 note, significa ottenere centinaia di brani simili, impossibili ascoltarli tutti per trovare quello corretto.&lt;br /&gt;
Però questo sistema è utile come operazione di “pre-processing”, per scremare il contenuto del DB prima di usare un metodo più sofisticato.&lt;br /&gt;
Classi di equivalenza: ogni simbolo rappresenta n intervalli. &lt;br /&gt;
C1:ogni simbolo rappresenta un intervallo,&lt;br /&gt;
C3: ogni simbolo rappresenta 3 diversi intervalli adiacenti,&lt;br /&gt;
CU: tutti gli intervalli crescenti e decrescenti collassato in due differenti classi( contorno melodico ).&lt;br /&gt;
Rappresentazione Frame-based:&lt;br /&gt;
non si ha la segmentation, in pratica non si divide ogni singolo evento della melodia,&lt;br /&gt;
il tempo viene diviso in frame di ugual misura,&lt;br /&gt;
viene stimato il valore di un pitch per ogni frame,&lt;br /&gt;
le note non sono esplicitamente descritte,&lt;br /&gt;
in un unico valore sono rappresentabili le informazioni relative ad altezza e durata.&lt;br /&gt;
Svantaggio di questo metodo è che si perde l’informazione relativa al ritmo.&lt;br /&gt;
Music psychology: c’è un alta probabilità che qualche errore si presente nel frammento dell’interrogazione, di fatti anche utenti esperti possono non essere in grado di rappresentare in modo esatto la melodia del brano che stanno cercando.&lt;br /&gt;
L’interrogazione è distribuita su più voci:&lt;br /&gt;
non è sempre detto che il frammento della query rappresenti in modo esatto la melodia del brano che si sta cercando,&lt;br /&gt;
in punti adiacenti del brano, l’utente potrebbe ricordarsi la melodia di differenti parti, costruendo una nuova melodia.&lt;br /&gt;
Il concetto di similarità varia in funzione di:&lt;br /&gt;
memoria, che può essere a breve o lungo termine,&lt;br /&gt;
tipologia di utente, che va dal non esperto,al mediamente esperto e all’esperto.&lt;br /&gt;
Melodia: definire come una sequenza di note sia riconosciuta dall’uomo come una melodia di un brano polifonico.&lt;br /&gt;
String matching and melodic similarità: approccio tra i più utilizzati per risolvere il problema della similarità melodica. Una semplice formalizzazione del problema contestualizzato nell’ambito dello string matching potrebbe essere: sia f  la stringa di caratteri che rappresenta il frammento melodico criterio di un’interrogazione e s la stringa di caratteri che rappresenta la partitura di un brano presente nel DB:&lt;br /&gt;
 f è fattore di x?&lt;br /&gt;
se f non appare in x, quale sottoparte di f è presente in s?&lt;br /&gt;
quante volte un’approssimazione di f è presente in s?&lt;br /&gt;
Blast algorithm: Basic Local Alignment Search Tool: uno tra i metodi più efficaci utilizzati per l’elaborazione di database biologici. Permette d’individuare in due sequenze:&lt;br /&gt;
zone uguali o simili,&lt;br /&gt;
allineamenti globali.&lt;br /&gt;
Il grado di similarità tra le due sequenze mostra la correlazione. Questa può essere basata su:&lt;br /&gt;
Identità percentuale: numero di elementi uguali nello stesso ordine presenti nelle due sequenze rispetto al numero totale di elementi,&lt;br /&gt;
Conservazione: quando cambiando un elemento nella sequenza in una precisa posizione, le proprietà chimiche e fisiche restano invariate.&lt;br /&gt;
&lt;br /&gt;
[[categoria:appunti]]&lt;/div&gt;</summary>
		<author><name>SingInTime</name></author>
		
	</entry>
</feed>