<?xml version="1.0"?>

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
     "http://docbook.org/xml/4.1.2/docbookx.dtd" [
<!ENTITY MANIFEST SYSTEM "../MANIFEST">
]>

<article lang="it"><title>Progetto di un database MySQL</title>

<articleinfo><author><firstname>Emanuele</firstname><surname>Zangarini</surname></author>
	<biblioid class="uri"><ulink url="http://echowebspace.altervista.org/docs/essays/mysql_theworks.pdf">Indirizzo dell'ultima versione aggiornata di questo documento.</ulink></biblioid>
	<!--<pubdate>2005</pubdate>-->
	<revhistory>
		<revision><revnumber>1.0</revnumber>
			<date>Febbraio 2005</date> 
			<authorinitials>EZ</authorinitials>
			<revremark>Prima stesura.</revremark>
		</revision>
		<revision><revnumber>1.1</revnumber>
			<date>Febbraio 2005</date> 
			<authorinitials>EZ</authorinitials>
			<revremark>Formattazione fronte-retro. Aggiunta nota array PHP. Immagine schema in SVG.</revremark>
		</revision>
	</revhistory>
<legalnotice><para></para></legalnotice>
</articleinfo>

<abstract><para>Presentazione di un progetto di database MySQL per il corso di Basi di Dati.</para></abstract>

<note><para>L'ultima versione di questo documento è reperibile a questo <ulink url="http://echowebspace.altervista.org/docs/essays/mysql_theworks.pdf">indirizzo</ulink>.</para></note>
<section><title>Il database <literal>theworks</literal></title>
<section>
  <title>Struttura del database</title>
  <para>Il database si struttura in quattro entità (person, language, work, transwork) e 7 relazioni di cui 3 (author, translator, quote) vengono convertite in altrettante tabelle, seguendo il principio per cui le relazioni M:N sono le uniche a necessitare obbligatoriamente la costituzione di entità comprendenti le chiavi primarie delle entità che mettono in relazione e gli attributi della relazione stessa.</para>
  <mediaobject>
  <imageobject>
    <imagedata fileref="../ER/theworks.svg" format="SVG" />
    <!--non c'è bisogno di ridimensionarla. La scalo già nel file SVG tramite gli attributi della radice.-->
  <!--scalefit="1" width="?px"-->
  </imageobject>
  <textobject>
    <phrase>Schema E/R del database 'theworks'.</phrase>
  </textobject>
  <caption>
    <para>Schema E/R del database 'theworks', disegnato con <ulink url="http://www.gnome.org/projects/dia/"><application>Dia</application></ulink> 0.94 di Alexander Larsson.</para>
  </caption>
</mediaobject>
</section>
<section>
  <title>Il DBMS MySQL</title>
  <para>Per questo progetto è stata utilizzata la versione 4.0.20 di MySQL su una piattaforma GNU/Linux.</para>
  <para>Come storage engine la scelta è caduta su InnoDB, data l'incapacità della versione installata di garantire l'integrità referenziale per le tradizionali tabelle MyISAM (le foreign key erano difatti <quote>parsed but ignored</quote> come recita il manuale di MySQL al par. 13.8.2).</para>
 <para>Sempre per le limitazioni della versione utilizzata, i campi chiave esterna vanno esplicitamente indicizzati tramite <userinput>INDEX(campo)</userinput>, in modo da velocizzare il recupero dei dati.</para>
<note><para></para><para>Nelle future versioni pianificate di MySQL verrà implementata l'integrità referenziale anche per MyISAM e l'indicizzazione dei campi chiave esterna avverrà in modo automatico.</para></note>
</section>
<section>
  <title>L'archivio bibliografico</title>
  <para>In vista della tesi di laurea, la necessità è quella di memorizzare agilmente le informazioni su scritti di diversa natura, ponendo particolare attenzione alla distinzione fra testi in lingua originale e testi tradotti.</para>
  <para>Per ridurre la complessità del modello, si ignorano volutamente alcune entità come le case editrici ed i luoghi di edizione.</para>
  <para>Altri limiti sono la possibilità per le sole opere in lingua originale di citare altre opere in lingua originale e non le sue traduzioni. La citazione di un lavoro tradotto in una data opera dovrà essere dunque sempre rappresentata dalla citazione dell'opera in lingua originale.</para>
</section>
<section><title>Esportazione in XML/DTD del database: lo script PHP</title>
<para>Dato il database, riempito di dati, si rendeva necessario da consegna esportare gli stessi nel formato XML. Ho scelto di utilizzare a questo scopo il linguaggio di scripting server-side PHP (ver. 4.3.7), data la sua particolare facilità d'uso nella connessione ai database.</para>
<para>Lo script riproduce le singole tuple di tutte le tabelle del database generate dall'esecuzione, ripetuta per ogni tabella, della query SQL <userinput>SELECT * FROM <varname>$tablename[$j]</varname>;</userinput> dove l'argomento della query è un riferimento all'array PHP che contiene i nomi delle tabelle.</para>
<para>Parallelamente l'array <varname>$attr_field</varname> contiene i nomi dei campi che si vogliono utilizzare come attributi del tag contenitore della tabella e non come sottotag. Si assume che questi siano solo campi chiave. Vengono considerate chiavi primarie quelle comprese fra l'elemento 1 e il valore indicato nel primo elemento dell'array, estremi inclusi.</para>
<para>Se non vi è alcun campo chiave nella rispettiva tabella, <varname>$attr_field</varname> dovrà contenere all'indice corrispondente un array vuoto.</para>
<note><para>Gli array vengono generati automaticamente effettuando una query <userinput>DESCRIBE</userinput> sulla struttura di ogni singola tabella e controllando il valore del campo <varname>Key</varname>. <returnvalue>PRI</returnvalue> contrassegna una chiave primaria e <returnvalue>MUL</returnvalue> una chiave esterna.</para>
</note>
<para>Lo script genera pure un file descrittore DTD per ogni file XML. I tipi relativi agli attributi sono rispettivamente <userinput>ID</userinput> per le chiavi primarie e <userinput>IDREF</userinput> per le chiavi esterne. Tutte le chiavi sono contrassegnate come <userinput>#REQUIRED</userinput>.</para>
<para>La codifica di output per i file è Unicode (UTF-8).</para>
<para>I file vengono memorizzati in una directory con lo stesso nome del database all'interno della directory <computeroutput>mysql2xml</computeroutput>, creata all'interno della directory di esecuzione dello script.</para>
</section>
<section><title>Il foglio di stile XSL</title>
<para>L'interpretazione dei file XML precedentemente esportati è affidata a poche ed essenziali istruzioni XSL. Queste creano per ogni tag corrispondente ad un record una TABLE in HTML con il contenuto dei campi e degli attributi di cui sono composti ed i relativi nomi.</para>
<para>Gli attributi chiave vengono evidenziati graficamente.</para>
<note><para>Per discernere fra chiavi primarie ed esterne sarebbe necessario controllare la DTD del documento tramite codice XSL od aggiungere allo scopo un attributo addizionale ad ogni record esportato in XML.</para></note>
</section>
</section>
<appendix><title>MANIFEST: file del progetto</title>
<programlisting>&MANIFEST;</programlisting>
</appendix>
</article>
