Comment choisir entre les formats de stockage et quels sont les exemples d'utilisation pour certains d'entre eux?


10

Nous avons différentes façons de stocker les données du programme (enregistrer des fichiers dans les jeux, les bases de données des employés, la configuration du programme, etc.):

  • Texte brut (pensez .iniet .conf)
  • XML
  • Bases de données (MySQL, SQLite ...)
  • .zip et similaires contenant plusieurs fichiers (avec différents formats)
  • Fichiers binaires (pensez, .docetc., par exemple créés par un outil de sérialisation)

Quels sont les différents cas d'utilisation des formats listés ci-dessus, et quels sont leurs avantages contre inconvénients (pensez vitesse, flexibilité, taille de fichier, facilité d'utilisation ...)? Comment décider entre eux pour différentes tâches?

À propos du format de fermeture éclair: il est juste utilisé pour contenir d'autres fichiers. Il pourrait également s'agir d'un autre format de compression. Cela permet une structure de plusieurs fichiers, y compris des fichiers image, des fichiers son et des fichiers texte. Par exemple, supposons que vous ayez un format de stockage pour les messages, qui peut contenir des fichiers. Vous pouvez avoir les fichiers suivants dans un fichier compressé:

message.txt (containing the message)
attachments (folder containing attachments)
  audio.wav
  picture.jpg

par rapport au binaire, pensez à Google Protocol Buffer. La capacité de désérialisation paresseuse est impressionnante, et vous avez toujours la possibilité de l'extraire et de la réenregistrer sous forme de texte formaté (en plusieurs langues C ++ / Java / Python).
Matthieu M.

Réponses:


6

J'utilise comme suit:

Texte brut

Pour la configuration - généralement en utilisant YAML ou .ini. Déconseillé par moi pour la plupart des utilisations, sauf lorsqu'un fichier texte est le résultat souhaité (par exemple, imprimer au texte, enregistrer au texte, etc.)

XML

Pour la configuration et le transport des données; Ex: Exportation, format via XSLT etc. Bon comme format de fichier portable (ex: SVG). Excellents outils de manipulation et filtres.

Bases de données

Stockage des données principales depuis l'application / l'application Web. Utilisez-le tout le temps comme stockage de choix. C'est fiable, robuste et vous obtenez beaucoup de choses intégrées (transactions, intégrité référentielle, suppression / mise à jour en cascade, index, vitesse). Mieux utilisé avec une couche ou ORM (IMO).

Archive de fichier unique (par exemple .zip)

Convient pour stocker de manière compacte plusieurs flux binaires associés, par exemple des images ROM pour un émulateur. Idéal pour les choses qui ne doivent pas souvent ou jamais être mises à jour. Il est lourd, lent et difficile à manipuler;

Binaire

Uniquement lorsqu'aucune base de données n'est disponible pour le stockage des données d'application. Plus simple avec la sérialisation (C ++). Un format binaire hautement réglé surpassera tout le reste en termes de vitesse et de taille.


4

Il n'y a pas de solution miracle. Dans mon expérience:

Le texte brut comme support de stockage est un non automatique. Les quelques cas que je considérerais même seraient mieux couverts par un fichier .config où j'ai un schéma et une sécurité de type. Il semble que le besoin de sécurité de type et d'extraction de données se manifeste presque toujours. Le texte brut fait de ce processus un cauchemar.

XML : sécurité de type, validation des données, faible volume, et dans certains cas, je l'utilise parce que .NET a un puissant support intégré pour la sérialisation XML des objets.

Bases de données : ma valeur par défaut. Tapez sécurité, vitesse, transactions, bien dignes de confiance et difficiles à blâmer pour avoir choisi une base de données comme support de stockage si quelque chose ne se passe pas comme prévu.

.zip est un format de compression, vous ne savez pas comment cela s'inscrit dans la persistance ..?

Binaire : J'utilise uniquement le binaire lorsque j'ai besoin de créer un flux de mémoire temporaire. Le binaire n'ajoute pas de valeur en termes de capacité de requête par rapport à une base de données ou XML où mes données sont organisées avec un schéma.

La facilité d'utilisation est relative et dépend de ce que vous souhaitez spécifiquement accomplir. La vitesse est similaire en dehors de ce que j'ai dit ci-dessus concernant le volume. Si la taille du fichier est un problème et qu'une normalisation appropriée est appliquée, je le compresserai via zip ou un autre format de compression, mais c'est un processus séparé.


3

Je les utilise comme suit:

Texte brut

Si cette catégorie comprend des formats légèrement plus élaborés, comme YAML ou des fichiers de propriétés, c'est la meilleure option pour tout ce que vous attendez des gens à lire et à modifier à la main. Un autre avantage énorme est la simplicité de sa modification via un petit script (par exemple sed).

Rien ne vaut la simplicité et la facilité d'utilisation. Lorsque l'équipe d'assistance doit configurer quelque chose sur une machine distante (par exemple, résoudre le problème d'un client) ou que le service informatique doit reconfigurer un groupe de serveurs qui exécutent votre logiciel, elle vous remerciera d'avoir choisi ce format. Cela vous évitera également d'écrire un logiciel unique qui le fera pour eux.

XML

Je suis d'accord avec @Ingo ici - contrairement au texte brut, XML est plus difficile à traiter via des scripts et un cauchemar à modifier à la main imo.

Pourtant, si vous avez des données avec une structure élaborée où YAML devient indéchiffrable et que vous voulez toujours qu'elles soient lisibles par l'homme et modifiables, alors XML est probablement le meilleur choix.

Base de données relationnelle

Un excellent choix lorsque vous avez beaucoup de données (ce qui rendrait le texte brut et XML encombrant) que vous souhaiterez peut-être autoriser à des tiers à modifier manuellement - via des commandes SQL et même des interfaces graphiques.

Un autre avantage est que votre code qui gère le contenu est très lisible. @ Richard-Harrison a donné une bonne liste d'autres avantages dans son excellente réponse.

Base de données NoSQL

Un avantage par rapport au SGBDR est l'évolutivité grâce à la distribution, qui n'est probablement pas très pertinente pour votre question. Les avantages qui sont probablement les plus pertinents sont la simplicité d'un magasin de valeurs-clés et la flexibilité de la schemalessness (est-ce un mot?). Lorsque vous vous trouvez en train de briser le paradigme relationnel: il suffit de stocker des objets blob dans la base de données, d'y accéder par clé et de les traiter via du code, alors envisagez cette option. Certains choix (par exemple CouchDB) sont très portables, ont un faible encombrement et peuvent également évoluer afin qu'ils offrent une bonne alternative non relationnelle à MySQL et SQLite.

Binaire

L'avantage du binaire est qu'il est rapide et compact. Lorsque la seule chose qui doit lire et modifier votre fichier est un programme et que les données ne correspondent pas au paradigme relationnel ou que la vitesse est vraiment importante, cela peut être un bon choix. Probablement la meilleure solution pour les fichiers multimédias.

Je dois cependant souligner que je n'ai pas encore rencontré de cas où un simple accès aux données du programme n'est pas requis à un moment donné pour des raisons qui n'ont pas été prises en compte lors de la conception initiale. De nos jours, je préfère personnellement l'option de base de données pour tout autre que les fichiers qui ont des formats standard et doivent être encodés / décodés par d'autres logiciels (par exemple audio, vidéo).

Remarque: il y a une idée fausse commune selon laquelle le binaire est opaque et donc en quelque sorte plus sûr. Sans protection supplémentaire, ce n'est pas le cas - si quelqu'un veut pirater votre logiciel, simplement stocker vos configurations ou quoi que ce soit en binaire ne les arrêtera pas.

Archive compressée

Pas vraiment une alternative à ce qui précède, mais plutôt une mesure supplémentaire.

Avantageux lorsque vous avez besoin de transmettre des choses sur le réseau, ou lorsque vous stockez beaucoup, beaucoup de données et que vous souhaitez économiser de l'espace. Notez que l'espace de stockage est généralement abondant de nos jours, alors pensez à votre plate-forme cible.

Fonctionne très rapidement sur presque n'importe quoi aujourd'hui (la loi de Moore en action, bébé), donc la seule raison de ne pas l'utiliser est qu'elle ajoute de la complexité à votre code. Pas beaucoup de complexité, mais toujours une violation du principe KISS. Particulièrement lourd pour les fichiers de configuration qui doivent être modifiés manuellement ou via des scripts - et si vous avez vraiment besoin d'y économiser de l'espace, vous devriez probablement utiliser l'option de base de données.


2

Je les utiliserais comme suit:

  • Texte brut : l'application a une petite taille de données simplement structurées (paires de valeurs de nom par exemple). Les données ne sont pas modifiées simultanément par plusieurs utilisateurs.
  • XML : petite taille de données structurées qui ne sont pas modifiées simultanément ou fréquemment.
  • Base de données : de grandes données structurées ou un accès simultané sont nécessaires. Le besoin d'interroger et de rechercher est indispensable dans l'application.
  • Données binaires : je les utiliserais uniquement pour diffuser des objets.
  • le zippage est une compression qui peut être ajoutée comme autre processus pour n'importe lequel des éléments ci-dessus, à l'exception des bases de données sur les serveurs.

1

J'ai entendu dire que XML combine les pires caractéristiques du texte (difficile / lent à traiter) et binaire (illisible).


Pas une réponse complète
Anto
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.