Quando utilizzare XML in un database?

Bella domanda.

Visto che la CTP di Sql Server 2005 è finalmente feature complete, e che quindi è possibile cominciare a fare dello sviluppo "serio", è ora di cominciare anche ad aprire il vaso di Pandora delle nuove e contestate feature di Sql Server 2005. Una delle più interessanti è senza dubbio il nuovo tipo di dato xml.

Lasciando stare le risposte derivanti da fondamentalismi (passatemi il termine un pò forte ) circa convizioni più o meno religiose sullo uso di XML all'interno di un db, veniamo all'atto pratico: xml serve davvero? se si, in quali casi?

La prima risposta che dò a questa domanda è: NO, xml all'interno di un database normalmente non serve. C'è solo un caso che, ora come ora, mi viene in mente per giustificare (anzi, consigliare) l'uso di xml all'interno di un db. Diciamo quindi che nel 99.99% delle volte xml (come tipo di dato, intendo) può tranquillamente essere lasciato dove sta, ossia nel cassetto.

Il caso in cui vedo molto bene xml (sapendo e decidendo consciamente che sto andado palesemente a violare qualsivoglia regola di normalizzazione e quindi dovrò poi farne i conti a livello di codice) è relativo alla memorizzazione di dati strutturalmente diversi ma con la stessa logica di base.

In questo caso si devono memorizzare informazioni che hanno la stessa struttura ma che a priori non se ne conosce la quantità ed il tipo. Mi spiego meglio: supponiamo di dover memorizzare le informazioni per contattare i nostri clienti. Semplificando, possiamo immaginare di avere una tabella Clienti, una tabella Contatti ed una tabella di categorizzazione TipiContatti:

il campo Dettaglio deve contenere le informazioni per poter contattare il cliente. Ovviamente a seconda del tipo di contatto il modo e le informazioni per contattare il cliente cambiano.
Posso quindi pensare che in questo caso il tipo di dato xml possa essere di aiuto in quanto mi eviterà di dover creare o una colonna molto generica (per assurdo un sqlvariant) in modo da poter memorizzare indirizzi e-mail e cap all'interno della stessa, oppure mi aiuterà ad evitare di dover creare tante tabelle, una per ogni tipo di contatto, in modo da memorizzare in modo corretto le varie informazioni. Quest'ultimo approcio, benchè sia quello formalmente più corretto, è poco flessibile in quanto se un domani esce una nuovo tipo di contatto (es. Messenger), viene necessariamente richiesto l'intervento dello sviluppatore in modo da modificare e quindi creare una nuova tabella di supporto a questo nuovo tipo di contatto.

Un altro esempio molto più pratico lo si più facilmente immaginare applicando tale filosofia ad un sito eCommerce. Tipicamente le richieste di tali sistemi sono legate ad un forte semplificazione di sistemi di back-office: deve essere possibile da parte di chiunque (autorizzazioni permettendo) poter aggiungere prodotti con una maschera user-friedly e inoltre deve essere possibile aggiungere al volo nuove tipologie di prodotti.

Ovviamente ogni prodotto di diversa tipologia ha una differente scheda tecnica (un monitor al plasma avrà i pollici, il numero di pixel ecc ecc, mentre un rasoio od un orologio avranno ben altre caratteristiche tecniche) che in qualche modo deve essere memorizzata e sfruttata nella funziolità di ricerca (es: voglio cercare tutti i lettori mp3 che leggono anche i file .wma). Idealmente e semplicisticamente il database potrebbe essere fatto in questo modo:

In questo caso mi sembra assolumentate interessante sfruttare a fondo xml (visto anche che con Sql Server 2005 è possibile fare query sul documento xml) per memorizzare la scheda tecnica utilizzando tale formato.
Per la cronaca, e tanto per non fare solo accademia, tale soluzione è stata implementa utilizzando Sql Server 2000 (che fatica!) in un importante progetto, tuttora attivissimo con ottimi risultati.

In conclusione quindi, che dire? Che XML in database normalmente non serve, ma in casi molto sporadici può essere estramente utile per rendere molto flessibile un'applicazione, riducendo allo stesso tempo in modo notevole i tempi di sviluppo. Tutto questo, però, a patto che sia usato solo se effettivamente serve, altrimenti quanto appena detto non è più vero, ed, anzi, l'utilizzo diventa invece deleterio.

Avere il supporto xml in un database significa avere parecchia potenza tra le proprie mani...ma, parafrasando una nota pubblicità, direi che questa è nulla senza un'adeguata conoscenza dei pro e dei contro.

Bene, ho detto la mia...a questo punto passo la palla a voi per sapere che ne pensate.

Print | posted on martedì 19 aprile 2005 16.29

Feedback

# Quando utilizzare XML in un database?

Left by .NET Tools Blog at 19/04/2005 16.49
Gravatar

# re: Quando utilizzare XML in un database?

Left by Simone Chiaretta at 19/04/2005 16.58
Gravatar Io non sono un sostenitore di XML ovunque, ma devo ammettere di aver usato XML in un DB già parecchie volte.
Soprattutto in situazioni dove i dati da gestire sono tanti e soprattutto non sono necessarie alle ricerche, ma solo per compilare delle schede di dettaglio, oppure dove le specifiche cambiavano spesso.
Ma l'utilità maggiore sta dove poi non è necessario andare a leggere i nodi dell'XML, ma per produrre l'output basta un xslt.
La cosa che non capisco (non ho ancora installato April CTP SQL 2005) xè non basta un campo NTEXT, ma è necessario un campo di tipo xml.

# re: Quando utilizzare XML in un database?

Left by Davide Mauri at 19/04/2005 17.05
Gravatar Ciao Simone
è stato introdotto il nuovo tipo di dato xml al posto di ntext per diversi motivi. Su tutti la possibilità di fare xquery sul campo e la possibilità di indicizzare (!!!) gli elementi dell'xml.

# re: Quando utilizzare XML in un database?

Left by Marco Caruso at 19/04/2005 17.38
Gravatar Ciao Davide,
io sono un amante di xml ma chiaramente non lo uso dovunque la prima cosa che mi viene in mente è magari utilizzarlo per memorizzare documenti in formato xml, dove ormai quasi tutti office per primo danno la possibilità di salvare in formato xml e quindi fare anche ricerche più veloci. Magari può essere utile anche per la serializzazione xml, che ne pensi?

# re: Quando utilizzare XML in un database?

Left by Maccari Claudio at 19/04/2005 18.39
Gravatar Io sto già usando yukon per sviluppare da alcui mesi (lo so che un po' rischioso ma a dei buoni vantaggi anche in beta soprattutto per fare Business Intelligence).
Mi è capiato di usare dei campi xml i due diversi modi:

1° una tabella che fa coda di messaggi in attesa di capire meglio il service broker.Cosa fa: dalla mia applicazione serializzo/deserializzo interi oggetti e li metto nel db senza preoccuparmi di quante proprietà ha l'oggetto e di che tipo siano.

2° una tabella che fa da backup di file xml scambiati con altre applicazioni. Cosa fa: in questa tabella ci metto tutti in file xml che produco/scarico con la mia applicazione per interagire con altri sistemi. E' comodo come archivio, e comodo per fare query su tutti il file senza dover cercare in n cartelle i file che ho scaricato

Che dire.Una gran bella nuova feature.
Claudio

# re: Quando utilizzare XML in un database?

Left by Simone Chiaretta at 20/04/2005 9.25
Gravatar Interessantissime le nuove funzioni!!!
XQuery sull'xml direttamente da sql è molto interessante!!!

# re: Quando utilizzare XML in un database?

Left by Davide Mauri at 20/04/2005 10.40
Gravatar Ciao Marco
l'idea di memorizzare interi documenti in formato xml (al posto dei classici .doc o .pdf e simili) non è sicuramente male, vista anche la presenza di programmi come InfoPath, similmente a quanto accade con Sharepoint (che non conosco approfonditamente, quindi non mi sbilancio troppo per non dire stupidate).

# re: Scrittura di XML su database, tempi e modi

Left by PhilloPuntoIt at 09/08/2007 14.19
Gravatar

# re: Quando utilizzare XML in un database?

Left by francesco at 20/07/2008 20.00
Gravatar Ciao giro da parecchi giorni molti siti per capire il funzionamento di questo linguaggio, e devo dire che ho trovato pochissimo e molto difficile da capire. Io ho un piccolo problema dovrei integrare dei dati xml in un cms ma fino ad oggi non ho trovato nessuno ne che mi spiega come fare, e ne che mi dica di saperlo fare.. se qualcuno mi vorra' aiutare sono disposto anche a pagare il disturbo. Spero che qualcuno mi aiuti.

ciao e complimenti per il sito.
Fra.
Comments have been closed on this topic.

Copyright © Davide Mauri

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski