Esta citação não se refere ao uso de XML como formato de armazenamento em geral (para o qual é bom, dependendo dos requisitos), mas para armazenamento do tipo banco de dados .
Quando as pessoas falam sobre bancos de dados, geralmente significam sistemas de armazenamento que armazenam grandes quantidades de dados, geralmente na faixa de gigabytes ou terabytes. Um banco de dados é potencialmente muito maior que a quantidade de RAM disponível no servidor que o armazena. Como ninguém precisa de todos os dados de um banco de dados de uma só vez, os bancos de dados devem ser otimizados para recuperação rápida de subconjuntos seletivos de dados: é para isso que SELECT
servem as declarações, e os bancos de dados relacionais e as soluções NoSQL otimizam seu formato de armazenamento interno rapidamente recuperação de tais subconjuntos.
XML, no entanto, realmente não se encaixa nesses requisitos. Devido à sua estrutura de marca aninhada, é impossível determinar onde um determinado valor é armazenado no arquivo (em termos de deslocamento de bytes em um arquivo) sem percorrer toda a árvore de documentos, pelo menos até a correspondência. Um banco de dados relacional tem índices, e procurar um valor em um índice, mesmo com uma implementação primitiva de pesquisa binária, é uma única pesquisa de O (log n) e, em seguida, obter os valores reais não passa de uma busca de arquivo (por exemplo, fseek(data_file_handle, row_index * row_size)
), que é O (1). Em um arquivo XML, a maneira mais eficiente é executar um analisador SAX no seu documento, fazendo muitas leituras e pesquisas antes de você chegar aos dados reais; dificilmente você conseguirá isso melhor que O (n), a menos que use índices, mas precisará reconstruir o índice inteiro para cada inserção (veja abaixo).
A inserção é ainda pior. Os bancos de dados relacionais não garantem a ordem das linhas, o que significa que eles podem apenas acrescentar novas linhas ou substituir quaisquer linhas marcadas como 'excluídas'. Isso é extremamente rápido: o banco de dados pode manter apenas um conjunto de locais graváveis; obter uma entrada do pool é O (1), a menos que o pool esteja vazio; Na pior das hipóteses, o pool está vazio e uma nova página deve ser criada, mas também é O (1). Por outro lado, um banco de dados baseado em XML teria que mover tudo após o ponto de inserção para liberar espaço; isso é O (n). Quando os índices entram em jogo, as coisas se tornam ainda mais interessantes: índices típicos de bancos de dados relacionais podem ser atualizados com uma complexidade relativamente baixa, digamos O (log n); mas se você deseja indexar seus arquivos XML, todas as inserções potencialmente alteram o local em disco de todos os valores do documento, portanto, é necessárioreconstruir o índice inteiro . Isso também vale para atualizações, porque a atualização, digamos, do conteúdo de texto de um elemento, pode mudar seu tamanho, o que significa que o XML consecutivo precisa ser alterado. Um banco de dados relacional não precisa tocar no índice, se você atualizar uma coluna não indexada; um banco de dados XML precisaria reconstruir o índice inteiro para cada atualização que altera o tamanho do nó XML atualizado.
Essas são as desvantagens mais importantes, mas existem mais. O XML é muito detalhado, o que é bom para a comunicação servidor a servidor, porque adiciona segurança (o servidor de recebimento pode executar todos os tipos de verificações de integridade no XML e, se algo der errado na transferência, é improvável que o documento valide ) Para armazenamento em massa, no entanto, isso é impressionante: não é incomum ter 100% ou mais de sobrecarga para dados XML (não é incomum ver taxas de sobrecarga no intervalo de 1000% para coisas como mensagens SOAP), enquanto o armazenamento de banco de dados relacional típico os esquemas têm apenas uma sobrecarga constante para os metadados da tabela, mais um pouquinho por linha; a maior parte da sobrecarga nos bancos de dados relacionais vem de larguras fixas de colunas. Se você possui um terabyte de dados, uma sobrecarga de 500% é simplesmente inaceitável, por vários motivos.