Questa citazione non riguarda l'uso dell'XML come formato di archiviazione in generale (per il quale va bene, a seconda dei requisiti), ma per l' archiviazione di tipo database .
Quando le persone parlano di database, di solito significano sistemi di archiviazione che archiviano enormi quantità di dati, spesso nell'intervallo di gigabyte o terabyte. Un database è potenzialmente molto più grande della quantità di RAM disponibile sul server che lo memorizza. Dal momento che nessuno ha mai bisogno di tutti i dati in un database contemporaneamente, i database dovrebbero essere ottimizzati per il recupero rapido di sottoinsiemi selettivi dei loro dati: questo è l' SELECT
istruzione per questo, e i database relazionali e le soluzioni NoSQL ottimizzano il loro formato di archiviazione interno per una rapida recupero di tali sottoinsiemi.
XML, tuttavia, non soddisfa davvero questi requisiti. A causa della sua struttura di tag nidificata, è impossibile determinare dove nel file è memorizzato un certo valore (in termini di offset di byte in un file) senza percorrere l'intero albero del documento, almeno fino alla corrispondenza. Un database relazionale ha indici e cercare un valore in un indice, anche con un'implementazione di ricerca binaria primitiva, è una singola ricerca O (log n), e poi raggiungere i valori effettivi non è altro che una ricerca di file (ad es. fseek(data_file_handle, row_index * row_size)
), che è O (1). In un file XML, il modo più efficiente è quello di eseguire un parser SAX sul tuo documento, facendo moltissime letture e ricerche prima di arrivare ai tuoi dati reali; difficilmente puoi ottenerlo meglio di O (n), a meno che tu non usi gli indici, ma poi, dovresti ricostruire l'intero indice per ogni inserimento (vedi sotto).
L'inserimento è anche peggio. I database relazionali non garantiscono l'ordine delle righe, il che significa che possono semplicemente aggiungere nuove righe o sovrascrivere le righe contrassegnate come "eliminate". Questo è estremamente veloce: il DB può semplicemente mantenere un pool di posizioni scrivibili; ottenere una voce dal pool è O (1) a meno che il pool non sia vuoto; nel peggiore dei casi, il pool è vuoto e deve essere creata una nuova pagina, ma anche questo è O (1). Al contrario, un database basato su XML dovrebbe spostare tutto dopo il punto di inserimento per fare spazio; questo è O (n). Quando gli indici entrano in gioco, le cose diventano ancora più interessanti: gli indici tipici del database relazionale possono essere aggiornati con una complessità relativamente bassa, diciamo O (log n); ma se vuoi indicizzare i tuoi file XML, ogni inserimento potenzialmente modifica la posizione su disco di ogni valore nel documento, quindi deviricostruire l'intero indice . Questo vale anche per gli aggiornamenti, poiché l'aggiornamento, diciamo, del contenuto testuale di un elemento, può cambiare la sua dimensione, il che significa che l'XML consecutivo deve cambiare. Un database relazionale non deve assolutamente toccare l'indice se si aggiorna una colonna non indicizzata; un database XML dovrebbe ricostruire l'intero indice per ogni aggiornamento che modifica la dimensione del nodo XML aggiornato.
Questi sono gli aspetti negativi più importanti, ma ce ne sono altri. XML è molto dettagliato, il che è utile per le comunicazioni da server a server, perché aggiunge sicurezza (il server ricevente può eseguire tutti i tipi di controlli di integrità sull'XML e se qualcosa è andato storto nel trasferimento, è improbabile che il documento venga convalidato ). Per l'archiviazione di massa, tuttavia, questo sta uccidendo: non è raro avere un overhead del 100% o più per i dati XML (non è raro vedere rapporti di overhead nell'intervallo del 1000% per cose come i messaggi SOAP), mentre un tipico archivio DB relazionale gli schemi hanno solo un sovraccarico costante per i metadati della tabella, più un piccolo bit per riga; la maggior parte dell'overhead nei database relazionali proviene da larghezze di colonna fisse. Se hai un terabyte di dati, un overhead del 500% è semplicemente inaccettabile, per molte ragioni.