# XML/Relazione molti-molti

XML
Copertina Tutti i moduli · Sviluppo
PrefazioneXML/Prefazione
* IntroduzioneXML/Introduzione
* Entità singoleXML/Entità singole
* Strutture dati di baseXML/Strutture dati di base
* Relazione uno-moltiXML/Relazione uno-molti
* Relazione uno-unoXML/Relazione uno-uno
* Relazione molti-moltiXML/Relazione molti-molti
* Relazioni ricorsiveXML/Relazioni ricorsive
* Schemi di datiXML/Schemi di dati
* Document Type Definition (DTD)XML/DTD
* XHTMLXML/XHTML
* XPathXML/XPath
* XLinkXML/XLink
* CSSXML/CSS
* XSLT e fogli di stileXML/XSLT e fogli di stile
* CocoonXML/Cocoon
* Parsing di file XMLXML/Parsing di file XML
* XULXML/XUL
* Asynchronous JavaScript and XML (AJAX)XML/AJAX
* Web serviceXML/Web service
* XMLHttpRequestXML/XMLHttpRequest
* Database e XMLXML/Database e XML
* SVGXML/SVG
* VoiceXMLXML/VoiceXML
* DocBookXML/DocBook
* SMILXML/SMIL
* XBRLXML/XBRL
* WDDX
* RPCXML/RPC
* RDFXML/RDF - Resource Description Framework
* RSSXML/RSS
* NamespaceXML/Namespace
* Gestire XML con MySQL
* XML EncryptionXML/XML Encryption
* XQueryXML/XQuery
* XML e JDBC
* XFormsXML/XForms
* OpenOffice.org e l'OpenDocument FormatXML/OpenOffice.org e l'OpenDocument Format
* KML e Google EarthXML/KML
* Lo standard ACORD - XML nel settore delle assicurazioniXML/ACORD
Modifica il sommario
Obiettivi di apprendimento
* Imparare diversi metodi per rappresentare una relazione molti-a-molti, usando XML
* Creare schemi XML utilizzando i metodi "Eliminate" e "ID/IDREF" per strutturare i contenuti sulla base di una relazione molti-a-molti.
* Creare i documenti XML corrispondenti per i metodi "Eliminate" e "ID/IDREF".
* Imparare a utilizzare la funzione chiave in un foglio di stile XML per formattare i dati strutturati con il metodo "ID/IDREF".
* Creare un foglio di stile XML di base che incorpora la funzione chiave.
Nei capitoli precedenti avete imparato a usare l'XML per strutturare e formattare i dati sulla base di relazioni uno-a-uno e uno-a-molti. Poiché XML fornisce i mezzi per modellare i dati utilizzando relazioni gerarchiche genitore-figlio, le relazioni uno-a-uno e uno-a-molti sono relativamente semplici da rappresentare in XML. Tuttavia, questa struttura gerarchica genitore-figlio è difficile da usare per modellare il rapporto molti-a-molti, un rapporto comune tra entità in molte situazioni.
In questo capitolo, esploreremo i pro e i contro di alcuni metodi usati per modellare una relazione molti-a-molti in XML; questi metodi offrono compromessi nel superare i problemi che sorgono quando si applica questa relazione a XML. In particolare, vedremo esempi di come modellare la relazione molti-a-molti utilizzando due diversi metodi, "Eliminate" e "ID/IDREF". Inoltre, nel foglio di stile XML, impareremo come implementare la funzione chiave per visualizzare i dati che sono stati modellati utilizzando il metodo "ID/IDREF".

## Problemi: rapporto molti-a-molti

In XML, la relazione genitore-figlio è più comunemente usata per rappresentare una relazione. Questo può essere facilmente applicato a un rapporto uno-a-uno o a un rapporto uno-a-molti. Una relazione molti-a-molti non è supportata direttamente da XML; la relazione genitore-figlio non funzionerà perché ogni elemento può avere un solo elemento padre. Ci sono un paio di possibili soluzioni per aggirare questo problema.

## Soluzioni: rapporto molti-a-molti a molti
### Eliminate

Crea documenti XML che eliminano la necessità di una relazione molti-a-molti.
Limitando la portata delle informazioni che vengono trasmesse, è possibile aggirare la necessità di una relazione molti-a-molti. Invece di cercare di avere un unico documento XML che comprenda tutte le informazioni, separare le informazioni dove un documento descrive solo una delle entità che partecipa al rapporto molti-a-molti. Utilizzando la nostra relazione tourGuide, ad esempio, un modo per raggiungere questo obiettivo sarebbe quello di creare un documento XML separato per ogni hotel. Il rapporto con l'attrattiva potrebbe diventare una relazione uno-a-molti. Questo metodo è più adatto a situazioni in cui l'ambito di scambio dei dati può essere limitato a sottoinsiemi di dati. Tuttavia, utilizzando questo metodo per uno scambio di dati più ampio, è possibile ripetere i dati più volte, specialmente se ci sono molti attributi. Per evitare questa ridondanza, utilizzare il metodo ID/IDREF.

### ID/IDREF

Rappresentare il rapporto molti-a-molti a molti utilizzando identificatori unici.
Anche se non è il modo più facile per gestire questo problema, un modo per aggirare il rapporto molti-a-molti è quello di creare chiavi che identificano in modo univoco ogni entità. Per fare questo, un elemento con attributi-tipo ID o IDREF deve essere specificato all'interno dello schema XML. Per utilizzare un'analogia, ID è simile alla chiave primaria e IDREF è simile alla chiave esterna.

## Modello di dati di relazione molti-a-molti

Viene data la relazione: "un hotel può avere molti servizi, e un'attrattiva può esistere in molti alberghi".
Come noterete, per rappresentare una relazione molti-a-molti, sono state aggiunte due entità. L'entità centrale è necessaria perché il modello di dati rappresenti un'entità associativa che memorizza i dati sul rapporto tra hotel e servizi. Utilizzando l'esempio della nostra guida turistica, "Amenity" è stato aggiunto per rappresentare una lista di possibili servizi che un hotel può avere.
Gli esempi che seguono illustrano i metodi per rappresentare una relazione molti-a-molti in XML.

## Eliminare: soluzione campione

In questo esempio, il rapporto molti-a-molti è stato convertito in un rapporto uno a molti.

### Schema XML

Esempio 2: schema XML per il metodo "Eliminate".

### Documento XML

Esempio 3: documento XML per il metodo "Eliminate".

## ID/IDREF: esempio di soluzione

Per evitare ridondanza, creiamo un elemento separato, "amenity", che è incluso nella parte superiore dello schema insieme a "hotel". Ricordate che i tipi di dati ID e IDREF sono sinonimi rispettivamente di chiave primaria e chiave esterna. Per ogni chiave esterna (IDREF), deve esserci una chiave primaria (ID) corrispondente. Si noti che il tipo di dati IDREF deve essere una stringa alfanumerica.
L'esempio seguente illustra l'approccio ID/IDREF. Si noti che l'ID per il servizio della piscina è definito come "k1", e ogni hotel con una piscina ha come riferimento ai servizi "k1", utilizzando IDREF. Se l'IDREF non corrisponde ad alcun ID, il documento non verrà convalidato.

### Schema XML

Esempio 4: Schema XML per il metodo "ID/IDREF".

### Documento XML

Esempio 5: documento XML per il metodo "ID/IDREF".

### Funzione chiave: foglio di stile XML

Per impostare un foglio di stile XML utilizzando il metodo ID/IDREF per una relazione molti-a-molti, si dovrebbe usare la funzione chiave. Nel foglio di stile, l'elemento <xsl:key> specifica l'indice, che viene utilizzato per restituire un node-set dal documento XML.
Una chiave è costituita da quanto segue:
* il nodo che ha la chiave,
* il nome della chiave,
* il valore di una chiave
Il seguente foglio di stile XML illustra come utilizzare la funzione chiave per presentare contenuti strutturati in una relazione molti-a-molti.

### Foglio di stile XML

Esempio 6: Foglio di stile XML per il metodo "ID/IDREF".

## Riferimenti

* https://www.w3.org/TR/xslt/all/#key