web-dev-qa-db-fra.com

Xml ou Sqlite, quand supprimer Xml pour une base de données?

J'aime vraiment Xml pour enregistrer des données, mais quand sqlite/database devient-il la meilleure option? par exemple, lorsque le xml contient plus de x éléments ou est supérieur à y Mo?

Je code un lecteur rss et je pense avoir fait le mauvais choix en utilisant xml sur une base de données sqlite pour stocker un cache de all les éléments du flux. Il existe certains flux qui ont un fichier xml de ~ 1 Mo après un mois, un autre a plus de 700 éléments, tandis que la plupart n'ont que ~ 30 éléments et ont une taille de ~ 50 Ko après un plusieurs mois.

Je n'ai actuellement pas l'intention de mettre en place un plafond parce que j'aime pouvoir parcourir tout.

Donc, mes questions sont:

  1. Quand la surcharge de sqlite/bases de données est-elle justifiée par rapport à l'utilisation de xml?
  2. La justification quelques gros fichiers xml suffit-elle pour la base de données quand il y en a beaucoup de petits, même si les plus petits vont croître avec le temps? (une longue longue fois)

mis à jour (plus d'informations)

Chaque fois qu'un flux est sélectionné dans l'interface graphique, je recharge tous les éléments de ce fichier XML.

J'ai également besoin de modifier l'état de lecture/non lu qui semble vraiment hacky lorsque je fais une boucle à travers tous les nœuds du xml pour trouver l'élément, puis le définir en lecture/non lu.

49
sieben

Je suis essentiellement d'accord avec Mitchel , que cela peut être très spécifique en fonction de ce que vous allez faire avec XML/sqlite. Pour votre cas (cache), il me semble que l'utilisation de sqlite (ou d'autres dbs intégrés) a plus de sens.

Tout d'abord, je ne pense pas vraiment que sqlite aura besoin de plus de surcharge que XML. Et je veux dire à la fois le temps de développement et le temps d'exécution. Le seul problème est que vous dépendez de la bibliothèque sqlite. Mais comme vous auriez besoin d'une bibliothèque pour XML, cela n'a pas d'importance (je suppose que le projet est en C/C++).

Avantages de sqlite sur xml:

  • tout dans un seul fichier,
  • la perte de performances est inférieure à XML car le cache s'agrandit,
  • vous pouvez garder les métadonnées de flux distinctes du cache lui-même (autre table), mais accessibles de la même manière,
  • SQL est probablement plus facile à utiliser que XPath pour la plupart des gens.

Inconvénients de sqlite:

  • peut être problématique avec plusieurs processus accédant à la même base de données (probablement pas votre cas),
  • vous devez connaître au moins le SQL de base. À moins qu'il y ait des centaines de milliers d'éléments dans le cache, je ne pense pas que vous ayez besoin de l'optimiser beaucoup,
  • peut-être d'une certaine manière, cela peut être plus dangereux du point de vue de la sécurité (injection SQL). D'un autre côté, vous ne codez pas d'application Web, cela ne devrait donc pas se produire.

D'autres choses sont probablement comparables pour les deux solutions.

Pour résumer, réponses à vos questions respectivement:

  1. Vous ne le saurez pas, sauf si vous testez votre application spécifique avec les deux backends. Sinon, c'est toujours juste une supposition. La prise en charge de base des deux caches ne devrait pas être un problème pour coder. Ensuite, comparez et comparez.

  2. En raison de la façon dont les fichiers XML sont organisés, les recherches sqlite devraient toujours être plus rapides (sauf dans certains cas d'angle où cela n'a pas d'importance de toute façon parce que c'est extrêmement rapide). Accélérer les recherches en XML nécessiterait de toute façon une base de données d'index, dans votre cas cela signifierait avoir du cache pour le cache, ce n'est pas une très bonne idée. Mais avec sqlite, vous pouvez avoir l'indexation dans le cadre de la base de données.

21
Stan

Homme ai-je une expérience avec cela. Je travaille sur un projet où nous avons initialement stocké toutes nos données à l'aide de XML, puis déplacé vers sqlite. Il existe de nombreux avantages et inconvénients pour chaque technologie, mais ce sont les performances qui ont provoqué le basculement. Voici ce que nous avons observé.

Pour les petites bases de données (quelques mégaoctets ou moins), XML était beaucoup plus rapide et plus facile à gérer. Nos données étaient naturellement sous forme d'arborescence, ce qui rendait XML beaucoup plus attrayant, et XPATH nous a permis de faire de nombreuses requêtes en une seule ligne plutôt que d'avoir à parcourir un arbre d'ascendance.

Nous programmions dans un environnement Win32 et utilisions la bibliothèque Microsoft DOM standard. Nous chargerions toutes les données en mémoire, les analyserions dans un arbre dom et chercherions, ajouterions, modifierions sur la copie en mémoire. Nous sauvegardions périodiquement les données et devions faire pivoter les copies au cas où la machine tomberait en panne au milieu d'une écriture.

Nous avions également besoin de construire des "index" à la main en utilisant des cartes d'arborescence C++. Bien sûr, cela serait trivial à faire avec sql.

Notez que la taille des données sur le système de fichiers était un facteur de 2 à 4 plus petit que l'arborescence dom "en mémoire".

Au moment où les données ont atteint la taille 10M-100M, nous avons commencé à avoir de vrais problèmes. Chose intéressante, à toutes les tailles de données, le traitement XML a été beaucoup plus rapide que sqlite s'est avéré l'être (car il était en mémoire, pas sur le disque dur)! Le problème était en fait double: d'abord, le temps de chargement commençait vraiment à s'allonger. Il faudrait attendre environ une minute avant que les données soient en mémoire et que les cartes soient construites. Bien sûr, une fois chargé, le programme était très rapide. Le deuxième problème était que toute cette mémoire était liée tout le temps. Les systèmes avec seulement quelques centaines de mégaoctets ne répondraient pas dans d'autres applications même si nous fonctionnions très rapidement.

Nous cherchons actuellement à utiliser une base de données XML basée sur un système de fichiers. Il existe quelques versions de bases de données xml open source, nous les avons essayées. Je n'ai jamais essayé d'utiliser une base de données XML commerciale, je ne peux donc pas les commenter. Malheureusement, nous n'avons jamais pu faire fonctionner correctement les bases de données XML. Même le fait de remplir la base de données avec des centaines de mégas de xml a pris des heures ... Peut-être que nous l'utilisions incorrectement. Un autre problème était que ces bases de données étaient assez lourdes. Ils avaient besoin de Java et avaient une architecture client-serveur complète. Nous avons abandonné cette idée.

Nous avons alors trouvé sqlite. Cela a résolu nos problèmes, mais à un prix. Lorsque nous avons initialement branché sqlite, les problèmes de mémoire et de temps de chargement avaient disparu. Malheureusement, étant donné que tout le traitement était désormais effectué sur le disque dur, la charge de traitement en arrière-plan augmentait considérablement. Alors qu'auparavant, nous n'avions même jamais remarqué la charge du processeur, maintenant l'utilisation du processeur était en hausse. Nous avions besoin d'optimiser le code, et nous devions toujours conserver certaines données en mémoire. Nous avons également dû réécrire de nombreuses requêtes XPATH simples en tant qu'algorithmes multiquery complexes.

Voici donc un résumé de ce que nous avons appris.

  1. Pour les données d'arborescence, XML est beaucoup plus facile à interroger et à modifier à l'aide de XPATH.

  2. Pour les petits ensembles de données (moins de 10 Mo), XML a fait exploser sqlite en termes de performances.

  3. Pour les grands ensembles de données (supérieurs à 10M-100M), le temps de chargement XML et l'utilisation de la mémoire sont devenus un gros problème, au point que certains ordinateurs deviennent inutilisables.

  4. Nous n'avons pu obtenir aucune base de données XML open source pour résoudre les problèmes associés aux grands ensembles de données.

  5. SQLITE n'a pas les problèmes de mémoire de XML dom, mais il est généralement plus lent dans le traitement des données (il se trouve sur le disque dur, pas en mémoire). (note - les tables sqlite peuvent être stockées en mémoire, peut-être que ce serait aussi rapide ... Nous n'avons pas essayé cela parce que nous voulions obtenir les données de la mémoire.)

  6. Le stockage et l'interrogation de données d'arbre dans une table ne sont pas agréables. Cependant, la gestion des transactions et l'indexation compensent en partie.

38
Jim

N'oubliez pas que vous avez une excellente base de données à portée de main: le système de fichiers!

Beaucoup de programmeurs oublient qu'une structure de fichier de répertoire décente est/a:

  1. C'est rapide comme l'enfer
  2. C'est portable
  3. Il a une petite empreinte d'exécution

Les gens parlent de diviser les fichiers XML en plusieurs fichiers XML ... J'envisagerais de diviser votre XML en plusieurs répertoires et plusieurs fichiers en texte brut.

Essayez. C'est d'une rapidité rafraîchissante.

12
Oli
  1. Utilisez XML pour les données que l'application doit connaître - configuration, journalisation et autres.
  2. Utiliser des bases de données (Oracle, SQL Server, etc.) pour les données avec lesquelles l'utilisateur interagit directement ou indirectement - des données réelles
  3. Utilisez SQLite si les données utilisateur sont davantage une collection sérialisée - comme une énorme liste de fichiers et leur contenu ou une collection d'éléments de courrier électronique, etc. SQLite est bon à cela.

Dépend du type et de la taille des données.

6
Vin

Je n'utiliserais pas XML pour stocker des éléments RSS. Un lecteur de flux effectue des mises à jour constantes lorsqu'il reçoit des données.

Avec XML, vous devez d'abord charger les données du fichier, les analyser, puis les stocker pour une recherche/récupération/mise à jour facile. Cela ressemble à une base de données ...

De plus, que se passe-t-il si votre application se bloque? si vous utilisez XML, quel est l'état des données dans le fichier XML par rapport aux données en mémoire. Au moins avec SQLite, vous obtenez l'atomicité, vous êtes donc assuré que votre application démarrera avec le même état que lorsque la dernière écriture de la base de données a été effectuée.

5
typicalrunt

XML est mieux utilisé comme format d'échange lorsque vous devez déplacer des données de votre application vers un autre endroit ou partager des informations entre des applications. Une base de données devrait être la méthode de stockage préférée pour presque toutes les applications de taille.

5
Bradley Harris

Quand XML doit-il être utilisé pour la persistance des données au lieu d'une base de données? Presque jamais. XML est un langage de transport de données. Il est lent à analyser et difficile à interroger. Analysez le XML (ne le déchiquetez pas!) Et convertissez les données résultantes en objets de domaine. Ensuite, persistez les objets de domaine. Un avantage majeur d'une base de données pour la persistance est SQL, ce qui signifie des requêtes non structurées et l'accès à des outils communs et à des techniques d'optimisation.

4
David Medinets

J'ai fait le passage à SQLite et je me sens beaucoup mieux en sachant que c'est dans une base de données.

Il y a beaucoup d'autres avantages à cela:

  • L'ajout de nouveaux éléments est vraiment simple
  • Tri par plusieurs colonnes
  • Suppression des doublons avec un index unique

J'ai créé 2 vues, une pour les éléments non lus et une pour tous les éléments, je ne sais pas si c'est la meilleure utilisation des vues, mais je voulais vraiment essayer de les utiliser.

J'ai également testé le xml par rapport à sqlite en utilisant la classe StopWatch, et le sqlite est plus rapide, bien qu'il se pourrait que ma façon d'analyser les fichiers xml n'était pas la méthode la plus rapide .

  1. Petits # articles et taille (25 articles, 30 ko)
    • ~ 1,5 ms sqlite
    • ~ 8,0 ms xml
  2. Grand nombre d'articles (700 articles, 350 ko)
    • ~ 20 ms sqlite
    • ~ 25 ms xml
  3. Grande taille de fichier (850 éléments, 1024 Ko)
    • ~ 45 ms sqlite
    • ~ 60 ms xml
2
sieben

Si vous devez évoluer à tout moment, utilisez des bases de données.

2
Mostlyharmless

Pour moi, cela dépend vraiment de ce que vous faites avec eux, du nombre d'utilisateurs/processus qui doivent y accéder en même temps, etc.

Je travaille tout le temps avec de gros fichiers XML, mais ce sont des processus uniques, des éléments de style d'importation, multi-utilisateurs ou des performances qui ne sont pas vraiment nécessaires.

C'est vraiment un équilibre.

2
Mitchel Sellers

XML est bon pour stocker des données qui ne sont pas complètement structurées et vous souhaitez généralement les échanger avec une autre application. Je préfère utiliser une base de données SQL pour les données. XML est sujet aux erreurs car vous pouvez provoquer des erreurs subtiles en raison de fautes de frappe ou d'omissions dans les données elles-mêmes. Certains frameworks d'application open source utilisent trop de fichiers xml pour la configuration, les données, etc. Je préfère l'avoir en SQL.

Puisque vous demandez une règle de base, je dirais que vous devez utiliser les données d'application, la configuration, etc. basées sur XML si vous allez le configurer une fois et ne pas y accéder/le rechercher beaucoup. Pour les recherches et les mises à jour actives, il est préférable d'utiliser SQL.

Par exemple, un serveur Web stocke les données d'application dans un fichier XML et vous n'avez pas vraiment besoin d'effectuer une recherche complexe, de mettre à jour le fichier. Le serveur Web démarre, lit le fichier xml et c'est tout. XML est donc parfait ici. Supposons que vous utilisez un framework comme Struts. Vous devez utiliser XML et les configurations d'action ne changent pas beaucoup une fois l'application développée et déployée. Encore une fois, le fichier XML est un bon moyen. Maintenant, si votre application développée Struts permet des recherches et des mises à jour étendues, des suppressions, alors SQL est le moyen optimal.

Bien sûr, vous rencontrerez sûrement un ou deux développeurs de votre organisation qui ne chanteront que XML ou SQL et proclameront XML ou SQL comme la seule voie à suivre. Méfiez-vous de ces personnes et faites ce qui vous semble approprié pour votre application. Ne suivez pas simplement une "religion technologique".

Pensez à des choses comme la fréquence à laquelle vous devez mettre à jour les données, la fréquence à laquelle vous devez rechercher les données. Ensuite, vous aurez votre réponse sur ce qu'il faut utiliser - XML ​​ou SQL.

2
echarcha

Je suis d'accord avec @Bradley.

XML est très lent et n'est pas particulièrement utile comme format de stockage. Pourquoi s'embêter? Allez-vous modifier les données à la main à l'aide d'un éditeur de texte? Si c'est le cas, XML toujours n'est pas un format très pratique par rapport à quelque chose comme YAML. Avec quelque chose comme SQlite, les requêtes sont plus faciles à écrire et il existe une API bien définie pour entrer et sortir vos données.

XML est très bien si vous devez envoyer des données entre les programmes. Mais au nom de l'efficacité, vous devriez probablement produire le XML au moment de l'envoi, et l'analyser en "données réelles" au moment de la réception.

Tout ce qui précède signifie que votre question sur "quand les frais généraux d'une base de données sont justifiés" est en quelque sorte sans objet. XML a une surcharge beaucoup plus élevée, tout le temps, que SQlite. (Les bases de données complètes comme MSSQL sont plus lourdes, en particulier dans les frais généraux administratifs, mais c'est une question totalement différente.)

1
apenwarr

XML peut être stocké sous forme de texte et sous forme de fichier binaire.

Si votre objectif principal est de laisser un ordinateur lire/écrire un format de fichier de manière efficace, vous devez travailler avec un format de fichier binaire.

Les bases de données sont un moyen facile à utiliser de stocker et de maintenir des données. Ils ne sont pas le moyen le plus rapide de stocker des données au format de fichier binaire.

Ce qui peut accélérer les choses, c'est l'utilisation d'une base de données/type de base de données en mémoire. Sqlite a cette option.

Et cela semble être la meilleure façon de le faire pour vous.

1
Mischa Kroon

Mon opinion est que vous devez utiliser SQLite (ou une autre base de données intégrée appropriée) chaque fois que vous n'avez pas besoin d'un format de fichier en texte pur. Remarque, il s'agit d'une exception assez importante. De nombreux scénarios nécessitent ou bénéficient de formats de fichiers en texte pur.

En ce qui concerne les frais généraux, SQLite compile quelque chose comme 250 k avec des indicateurs normaux. De nombreuses bibliothèques d'analyse XML sont plus grandes que SQLite. Vous n'obtenez aucun gain de concurrence en utilisant XML. Le format de fichier binaire SQLite va prendre en charge des écritures beaucoup plus efficaces (principalement parce que vous ne pouvez pas ajouter à la fin d'un fichier XML bien formaté). Et même la lecture de données, dont la plupart, je suppose, est un accès assez aléatoire, va être plus rapide en utilisant SQLite.

Et pour couronner le tout, vous avez accès aux avantages de SQL comme les transactions et les index.

Edit: oublié de mentionner. Un avantage de SQLite (par opposition à de nombreuses bases de données) est qu'il autorise tout type dans n'importe quelle ligne dans n'importe quelle colonne. Fondamentalement, avec SQLite, vous obtenez la même liberté que vous avez avec XML en termes de types de données. Cela signifie également que vous n'avez pas à vous soucier de limiter les colonnes de texte.

1
Jay Stramel

Une base de données est excellente dans le cadre de votre programme. Si interroger les données fait partie de votre logique métier. XML est le meilleur format de fichier, surtout si votre format de données est:

1, Hiérarchale
2, susceptible de changer à l'avenir d'une manière que vous ne pouvez pas deviner
3, les données vont vivre plus longtemps que le programme

1
Martin Beckett

Vous devez noter que de nombreuses grandes bases de données relationnelles (Oracle et SQLServer) ont des types de données XML pour stocker des données dans une base de données et utiliser XPath dans l'instruction SQL pour accéder à ces données.

En outre, il existe des bases de données XML natives qui fonctionnent très bien comme SQLite dans le sens où elles sont un fichier binaire contenant une collection de documents (qui pourrait être à peu près une table), vous pouvez alors soit XPath/XQuery sur un seul document ou la collection entière. Ainsi, avec une base de données XML, vous pouvez faire des choses comme stocker les données des jours en tant que document XML séparé dans la collection ... il vous suffit donc d'utiliser ce seul document lorsque vous traitez les données d'aujourd'hui. Mais écrivez un XQuery pour comprendre les données historiques sur la collecte de documents pour cette personne. Nappe.

J'ai utilisé Berkeley XMLDB (maintenant soutenu par Oracle). Il y en a d'autres si vous recherchez sur Google "Base de données XML native". Je n'ai pas vu de problème de performances avec le stockage/la récupération de données de cette manière.

XQuery est une bête différente (mais mérite d'être apprise), mais vous pouvez peut-être simplement utiliser les XPaths que vous utilisez actuellement avec de légères modifications.

1
Nika

Je dis que ce n'est pas une question de taille de données, mais de type de données. Si vos données sont structurées, utilisez une base de données relationnelle. Si vos données sont semi-structurées, utilisez XML ou - si les quantités de données deviennent vraiment trop importantes - une base de données XML.

0
Sebastian Redl

Si votre recherche va avec un db. Vous pouvez diviser les fichiers xml en répertoires pour faciliter la recherche, mais la surcharge de gestion devient facilement assez lourde. Vous obtenez également bien plus que des performances avec une base de données sql ...

0
Andrew Taylor