Quels sont les avantages de stocker du xml dans une base de données relationnelle?


23

Je fouillais la base de données AdventureWorks aujourd'hui et j'ai remarqué qu'un certain nombre de tables ( HumanResources.JobCandidateet Sales.Individualpar exemple) ont une colonne qui stocke des données xml.

Ce que je voudrais savoir, quel est l'avantage de stocker essentiellement la valeur d'une ligne d'une table de base de données dans la colonne d'une autre table? Cela ne rend-il pas difficile d'interroger ces informations? Ou est-ce l'hypothèse selon laquelle les données n'auront pas besoin d'être interrogées et doivent simplement être stockées?

Réponses:


30

Parce que toutes les données ne doivent pas être stockées de manière relationnelle et que l'écriture de code pour traiter les données que vous avez passées en XML pour le stockage relationnel prend du temps (et est très très fastidieuse). Cela est particulièrement vrai lorsque de nombreuses données XML proviennent de systèmes qui lancent de grandes réponses génériques.

J'ai souvent vu des situations où un message est reçu d'un autre système et nous ne nous soucions pas de 98% de ce qu'il contient. Nous l'analysons donc pour répartir les 2% dont nous nous soucions, stockons cela de manière relationnelle, puis stockons tout le message au cas où nous aurions besoin des 98% restants plus tard.

Et SQL Server vous donne des outils et une syntaxe OK pour travailler avec XML dans T-SQL, donc ce n'est pas comme si c'était totalement hors de portée pour les requêtes ad hoc de la même manière que si vous stockiez, disons, le contenu d'un CSV.

Et cela exclut la possibilité que ce que vous voulez réellement stocker soit XML (par exemple à des fins de support et de débogage) ...


10
+1, "en manger maintenant, en conserver pour plus tard". Ce qui était une misérable campagne de marketing pour les bonbons, mais cela fonctionne dans ce cas pour le stockage XML.
Dan Rosenstark

11

Si le format des données est volatile et est susceptible d'être modifié, vous souhaiterez peut-être le regrouper sous forme de XML et le mettre dans la base de données sous cette forme, évitant ainsi de futurs changements de schéma de base de données.

Sur la même tangente, si les données sont fournies par un système externe et consommées par lui à nouveau, et qu'ils ne sont pas en mesure de vous fournir un format permanent, c'est ce que vous feriez.

Cela ne rend-il pas difficile d'interroger ces informations?

SQL Server peut interroger des champs et des variables XML. Pas forcément difficile, mais plus de travail, oui. Mais faisable.


+1 pour découpler les données du schéma de base de données. Vous pouvez également mentionner explicitement les requêtes XPath.
Gary Rowe

Je pense que vous venez de le faire. :)

5

D'après mon expérience, les données XML sont généralement stockées et rarement interrogées, mais souvent extraites lorsque cela est nécessaire, généralement lorsqu'un autre système a besoin d'une représentation XML de certaines données qui peuvent être difficiles ou impossibles à générer à la volée à partir de données relationnelles. Les données XML peuvent être préremplies par un autre processus.


3

Si vous pouvez imaginer stocker vos données dans un flux binaire dans un blob, alors j'imagine que vous pouvez imaginer stocker vos données au format xml dans un blob.

Bien sûr, il vaut mieux laisser beaucoup de choses dans l'imagination de l'imaginateur.

Disons, les dossiers médicaux électroniques par exemple:

Puisque vous stockeriez probablement l'ASCII HL7 V2.x dans un champ d'une base de données. Vous seriez probablement en mesure de stocker HL7 V3.0 dans un champ d'une base de données.

L'avantage est donc la commodité.


2

Je travaille actuellement sur un projet qui fait cela. Nous avons des données qui doivent être traitées plusieurs fois, stockées de manière relationnelle. Cependant, le traitement se fait en Java, et il est plus facile de travailler avec XML là-bas. Ainsi, nous effectuons un passage unique dans les données relationnelles et les stockons au format XML dans une table. Ensuite, nous pouvons traiter ces données en Java avec une requête de non-jonction plutôt que de récupérer les données à chaque fois, et traiter les mêmes données encore et encore pour le contenu de notre cœur. C'est beaucoup plus simple et plus efficace.


2

Un bon exemple de stockage XML est lorsque vous souhaitez conserver les états d'interface utilisateur dans la base de données. L'état de toutes les vues d'application est sérialisé et stocké dans la base de données et il n'est pas nécessaire d'interroger le XML. Par état d'interface, je veux dire, l'ordre de tri, la taille des fenêtres, etc.


1

Souvent, vous obtenez des données mixtes à la fois XML et relationnelles. (Un bel exemple de ceci est un magasin de documents où chaque document peut avoir des champs de métadonnées comme le titre, la date de création, le propriétaire, etc.)

À ce stade, vous devez choisir parmi trois options:

  1. Stockez tout dans une base de données relationnelle.
  2. Stockez tout dans une base de données XML native.
  3. Stockez les données dans deux bases de données distinctes, XML en XML natif et métadonnées en relationnel.

L'option 3 est probablement la plus propre mais aussi la plus chère et la plus difficile à mettre en œuvre, et vous ne voulez pas nécessairement des transactions distribuées dans un système pas très grand. L'option 2 n'est pas très bonne car les bases de données XML natives sont généralement extrêmement médiocres pour gérer les données relationnelles (que vous êtes plus susceptibles d'utiliser dans les recherches) et la technologie est globalement moins mature que la base de données relationnelle.

Cela vous laisse donc avec l'option 1 comme certainement pas la meilleure solution mais peut-être la moins mauvaise.


1

D'après mon expérience, l'utilisation de XML dans une base de données finit par être parce que c'est ainsi que la source des données les stocke, ou que vous les ajoutez à une base de données existante pour étendre les fonctionnalités d'une manière qui ne nécessitera pas beaucoup de programmation de base de données pour prendre en charge .

Si vous allez rechercher fréquemment les nouvelles données, il peut être judicieux de diviser le XML en ses composants. Sinon, cela peut être un moyen utile d'enregistrer des données modifiées rarement.

J'espère que cela vous aide, Jeff


1

Les banques de données orientées document (aka NoSql) sont très populaires de nos jours:

http://en.wikipedia.org/wiki/Document-oriented_database

Il n'y a aucune raison pour laquelle vous ne pouvez pas utiliser un schéma orienté document dans une base de données relationnelle. Vous n'obtiendrez peut-être pas tous les mêmes avantages par rapport à quelque chose comme Mongo, mais vous n'aurez pas non plus les inconvénients.

Pendant longtemps, si vous vouliez utiliser le stockage orienté document, votre seul choix était de placer des données structurées (comme XML) dans une grande colonne. Les bases de données relationnelles ont ajouté des fonctionnalités telles que l'indexation et la correspondance pour prendre en charge cela.

Comparez cela avec Mongo, où ils ne contiennent que des documents dans la base de données. Mais c'est un autre sujet.

EDIT: l'idée centrale de l'orientation documentaire est la suivante: vous extrayez les données, les manipulez et les repoussez en entier. Parfois, comme lorsque vous transmettez le document au client, vous voulez simplement envoyer le tout en tant qu'objet blob et le laisser s'en occuper. L'avantage (et l'inconvénient) est la flexibilité. La validation et l'exactitude du document se font en dehors de la base de données.

EDIT EDIT: Un autre contraste. Imaginez enregistrer des images JPG ou des documents Word dans une colonne de base de données.


0

Quels sont les avantages de stocker un arbre (XML) dans une liste de tuples (une table de base de données)?

Il n'y a aucune raison pour que le XML ne soit pas interrogeable depuis votre SGBD en utilisant par exemple XPath ou SPARQL.

Selon moi, ce ne sont que deux structures de données différentes. Et il n'y a aucune raison pour qu'ils ne soient pas intégrés les uns aux autres.

Vous pouvez rechercher les raisons pour lesquelles le type de données JSON a été ajouté dans PostgreSQL. Je pense que bon nombre des mêmes arguments s'appliquent. Sauf qu'avec XML / XSD, encore plus de validation est possible.


-1

Eh bien, XML (ou JSON) est assez bon pour stocker des métadonnées avec une hiérarchie. Quelles sont les alternatives? Une table de métadonnées avec refid / clé / valeur / profondeur peut-être? C'est un peu lourd (mais probablement meilleur pour interroger si vous avez besoin de le faire). Le stockage de certaines données xml sur un document (une ligne dans un tableau de documents) est assez pratique lorsque vous souhaitez stocker des informations hiérarchiques sans avoir à vous fier à une table externe ou à ajouter 1 colonne par "type" d'informations.


1
cela ne semble pas ajouter quoi que ce soit de substantiel par rapport à ce qui a déjà été publié dans les réponses précédentes 11
GNAT

-2

Je dirais que c'était une mauvaise pratique car vous obstruez un stockage autrement efficace avec des balises inefficaces qui n'ont pas besoin d'être là si vous faites l'effort d'analyser les informations. XML a une surcharge de stockage hideuse par rapport aux données qu'il décrit, car vous avez besoin d'une balise pour chaque colonne pour chaque ligne. Par comparaison, les données analysées et stockées au format relationnel ont leur nom de colonne stocké UNE FOIS. Pour une douzaine de lignes sur un dev. boîte, gros problème, mais j'ai vu des développeurs faire l'hypothèse que cela est évolutif à des millions de lignes. Cela peut représenter des centaines de Go de surcharge pour quelques dizaines de Go de données, ce qui crée des défis opérationnels. Vous vous abdiquez fondamentalement et poussez sur les gens qui doivent supporter la merde que vous avez écrite.

Alors, pourquoi ne pas le stocker LOIN des données opérationnelles, dans sa propre base de données? Ou comme prévu - dans des fichiers plats? Il ne sera probablement jamais réexaminé, alors pourquoi ne pas le supprimer des performances d'un système opérationnel? N'oubliez pas que XML est UNIQUEMENT là pour fournir une description du schéma de données qui autrement ne serait pas apparente en raison des différences de protocole de stockage entre les systèmes. C'est tout son point, il n'y a rien d'intelligent à ce sujet. Stocker 10 fois la quantité de frais généraux pour une quantité donnée de données indique simplement que vous êtes un développeur bâclé qui n'a pas réfléchi et ne peut pas être incité à traiter les données que vous consommez dans un format sensible, efficace et rapide à interroger. Arrêtez de pousser vos efforts vers le support opérationnel et réfléchissez à la façon dont vous pouvez mieux gérer les données après vous ' ai reçu ce serait mon appel. Il n'y a aucune défense pour stocker des données au format XML après leur réception, car elles ont rempli leur fonction.


1
Mais vous supposez ici que les données du fragment XML sont des données relationnelles. Ce n'est généralement pas le cas - XML ​​est très utile pour les données hiérarchiques, ce qui est très difficile à représenter dans une base de données relationnelle. Un document XML idiomatique (par exemple en faisant bon usage des attributs) aura également assez peu de surcharge d'espace, le principal problème serait le coût de l'analyse du fragment à chaque accès.
amon

Les données peuvent ne pas être traitées dans un format de requête rapide (et vous pourriez ne pas avoir besoin de les interroger). Imaginez un schéma XML où il y a des centaines de champs facultatifs dont peut-être une poignée est remplie à la fois. Si vous insistez pour modéliser cela de manière relationnelle, vous vous retrouverez soit avec de vastes tables remplies de NULL ou avec la monstruosité qu'est l'EAV.
Julia Hayward
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.