Cette citation ne concerne pas l'utilisation de XML comme format de stockage en général (pour lequel cela convient, selon les exigences), mais pour le stockage de type base de données .
Lorsque les gens parlent de bases de données, ils désignent généralement des systèmes de stockage qui stockent d' énormes quantités de données, souvent de l'ordre du gigaoctet ou du téraoctet. Une base de données est potentiellement beaucoup plus grande que la quantité de RAM disponible sur le serveur qui la stocke. Étant donné que personne n'a jamais besoin de toutes les données d'une base de données à la fois, les bases de données doivent être optimisées pour une récupération rapide de sous-ensembles sélectifs de leurs données: c'est à cela que sert l' SELECT
instruction, et les bases de données relationnelles ainsi que les solutions NoSQL optimisent leur format de stockage interne pour une rapidité récupération de ces sous-ensembles.
XML, cependant, ne correspond pas vraiment à ces exigences. En raison de sa structure de balises imbriquées, il est impossible de déterminer où dans le fichier une certaine valeur est stockée (en termes de décalage d'octet dans un fichier) sans parcourir l'arborescence de document entière, au moins jusqu'à la correspondance. Une base de données relationnelle a des index, et la recherche d'une valeur dans un index, même avec une implémentation de recherche binaire primitive, est une simple recherche O (log n), puis atteindre les valeurs réelles n'est rien d'autre qu'une recherche de fichier (par exemple fseek(data_file_handle, row_index * row_size)
), qui est O (1). Dans un fichier XML, le moyen le plus efficace consiste à exécuter un analyseur SAX sur votre document, en effectuant énormément de lectures et de recherches avant d'accéder à vos données réelles; vous pouvez difficilement obtenir cela mieux que O (n), à moins que vous n'utilisiez des index, mais alors, vous devrez reconstruire l'intégralité de l'index pour chaque insertion (voir ci-dessous).
L'insertion est encore pire. Les bases de données relationnelles ne garantissent pas l'ordre des lignes, ce qui signifie qu'elles peuvent simplement ajouter de nouvelles lignes ou remplacer toutes les lignes marquées comme «supprimées». Ceci est extrêmement rapide: la base de données peut simplement conserver un pool d'emplacements accessibles en écriture; obtenir une entrée du pool est O (1) sauf si le pool est vide; dans le pire des cas, le pool est vide et une nouvelle page doit être créée, mais c'est aussi O (1). En revanche, une base de données XML devrait tout déplacer après le point d'insertion pour faire de la place; c'est O (n). Lorsque les index entrent en jeu, les choses deviennent encore plus intéressantes: les index de bases de données relationnelles typiques peuvent être mis à jour avec une complexité relativement faible, par exemple O (log n); mais si vous souhaitez indexer vos fichiers XML, chaque insertion modifie potentiellement l'emplacement sur disque de chaque valeur du document, vous devez doncreconstruisez l'intégralité de l'index . Cela vaut également pour les mises à jour, car la mise à jour, par exemple, du contenu textuel d'un élément, peut changer sa taille, ce qui signifie que le XML consécutif doit changer. Une base de données relationnelle n'a pas du tout besoin de toucher l'index si vous mettez à jour une colonne non indexée; une base de données XML devrait reconstruire l'intégralité de l'index pour chaque mise à jour qui modifie la taille du nœud XML mis à jour.
Ce sont les inconvénients les plus importants, mais il y en a plus. XML est très verbeux, ce qui est bon pour la communication de serveur à serveur, car il ajoute de la sécurité (le serveur récepteur peut effectuer toutes sortes de vérifications d'intégrité sur le XML, et si quelque chose s'est mal passé dans le transfert, le document est peu susceptible de valider ). Pour le stockage de masse, cependant, cela tue: il n'est pas rare d'avoir 100% ou plus de surcharge pour les données XML (il n'est pas rare de voir des ratios de surcharge dans la plage de 1000% pour des choses comme les messages SOAP), tandis que le stockage de base de données relationnelle typique les schémas n'ont qu'une surcharge constante pour les métadonnées de table, plus un tout petit peu par ligne; la plupart des frais généraux dans les bases de données relationnelles proviennent de largeurs de colonne fixes. Si vous avez un téraoctet de données, une surcharge de 500% est tout simplement inacceptable, pour de nombreuses raisons.