Au lieu d'une base de données, je sérialise simplement mes données sur JSON, les enregistre et les charge sur le disque si nécessaire. Toute la gestion des données est faite sur le programme lui-même, ce qui est plus rapide ET plus facile que d'utiliser des requêtes SQL. Pour cette raison, je n'ai jamais compris pourquoi des bases de données sont nécessaires.
Pourquoi utiliser une base de données au lieu de simplement enregistrer les données sur disque?
Réponses:
En bref, vous bénéficiez d'un large éventail de technologies éprouvées et bien connues développées au cours de nombreuses années par une grande variété de personnes très intelligentes.
Si vous craignez que votre base de données ne soit trop lourde, consultez SQLite.
la source
Bien que je sois d’accord avec tout ce que Robert a dit, il ne vous a pas indiqué quand vous devriez utiliser une base de données, par opposition à la simple sauvegarde des données sur disque.
Ajoutez donc cela à ce que Robert a dit sur l'évolutivité, la fiabilité, la tolérance aux pannes, etc.
Voici quelques points à considérer pour savoir quand utiliser un SGBDR:
Quant à quand utiliser un NoSQL
Enfin, quand utiliser des fichiers
la source
Une chose que personne ne semble avoir mentionnée est l'indexation des enregistrements. Votre approche est satisfaisante pour le moment et je suppose que vous disposez d'un très petit ensemble de données et que très peu de personnes y ont accès.
Au fur et à mesure que vous devenez plus complexe, vous créez une base de données. Quoi que vous souhaitiez l'appeler, une base de données n'est qu'un ensemble d'enregistrements stockés sur le disque. Que vous créiez le fichier, MySQL , SQLite ou tout ce qui crée le (s) fichier (s), ce sont deux bases de données.
Ce qui vous manque, c'est la fonctionnalité complexe intégrée aux systèmes de base de données pour faciliter leur utilisation.
La principale chose qui me vient à l’esprit est l’indexation. OK, vous pouvez donc stocker 10, 20, voire 100 ou 1 000 enregistrements dans un tableau sérialisé ou une chaîne JSON, extraire le fichier de votre fichier et le parcourir de manière relativement rapide.
Maintenant, imaginez que vous ayez 10 000, 100 000 ou même 1 000 000 enregistrements. Lorsque quelqu'un essaie de se connecter, il va falloir ouvrir un fichier de plusieurs centaines de mégaoctets, le charger en mémoire dans votre programme, extraire un tableau d'informations de même taille puis itérer des centaines de milliers d'enregistrements juste pour trouvez l'enregistrement auquel vous souhaitez accéder.
Une base de données appropriée vous permettra de configurer des index sur certains champs d’enregistrements, ce qui vous permettra d’interroger la base de données et de recevoir une réponse très rapidement, même avec d’énormes ensembles de données. Combinez cela avec quelque chose comme Memcached ou même avec un système de cache maison (par exemple, enregistrez les résultats d'une recherche dans un tableau séparé pendant 10 minutes et chargez-les au cas où quelqu'un chercherait la même chose peu de temps après), et vous aurez des requêtes extrêmement rapides, ce que vous ne obtiendrez pas avec un ensemble de données aussi volumineux lorsque vous lisez / écrivez manuellement dans des fichiers.
Une autre chose qui est vaguement liée à l'indexation est le transfert d'informations. Comme je l'ai dit plus haut, lorsque vous avez des fichiers de centaines ou de milliers de mégaoctets, vous devez charger toutes ces informations en mémoire, répétez-les manuellement (probablement sur le même fil), puis manipulez vos données.
Avec un système de base de données, il s'exécutera sur ses propres threads, voire sur son propre serveur. Tout ce qui est transmis entre votre programme et le serveur de base de données est une requête SQL et tout ce qui est transmis est les données auxquelles vous souhaitez accéder. Vous ne chargez pas l'intégralité du jeu de données en mémoire - tout ce que vous envoyez et recevez ne représente qu'une infime fraction de votre ensemble de données total.
la source
Lorsque vous avez des données simples, comme une liste de choses que vous décrivez dans les commentaires de votre question, une base de données SQL ne vous en donnera pas beaucoup. Beaucoup de gens les utilisent encore, car ils savent que leurs données peuvent devenir de plus en plus compliquées avec le temps. De nombreuses bibliothèques rendent le travail avec les bases de données trivial.
Mais même avec une simple liste que vous chargez, gardez en mémoire, puis écrivez si nécessaire, peut souffrir de nombreux problèmes:
Une fin de programme anormale peut perdre des données, ou lors de l'écriture de données sur un disque, quelque chose ne va pas et vous pouvez finir par tuer tout le fichier. Vous pouvez utiliser vos propres mécanismes pour gérer cela, mais les bases de données le traitent pour vous en utilisant des techniques éprouvées.
Si vos données commencent à devenir trop volumineuses et à se mettre à jour trop souvent, la sérialisation de toutes vos données et leur enregistrement vont devenir une grosse ressource et tout ralentir. Vous devez commencer à travailler à la partition, afin que cela ne soit pas si coûteux. Les bases de données sont optimisées pour enregistrer uniquement les éléments modifiés sur le disque de manière tolérante aux pannes. En outre, ils sont conçus pour vous permettre de charger rapidement les petites données dont vous avez besoin à tout moment.
De plus, vous n'avez pas besoin d'utiliser des bases de données SQL. Vous pouvez utiliser des "bases de données" NoSQL comme beaucoup, il suffit d'utiliser JSON pour stocker les données. Mais cela se fait de manière tolérante aux pannes et de manière à ce que les données puissent être intelligemment divisées, interrogées et réparties intelligemment sur plusieurs ordinateurs.
En outre, certaines personnes mélangent les choses. Ils peuvent utiliser un magasin de données NoSQL comme Redis pour stocker les informations de connexion. Ensuite, utilisez des bases de données relationnelles pour stocker des données plus complexes où elles doivent effectuer des requêtes plus intéressantes.
la source
Je vois que beaucoup de réponses se concentrent sur le problème de la simultanéité et de la fiabilité. Les bases de données offrent d'autres avantages que la concurrence, la fiabilité et les performances. Ils permettent de ne pas gêner la représentation des octets et des caractères dans la mémoire. En d'autres termes, les bases de données permettent au programmeur de se concentrer sur "quoi" plutôt que sur "comment".
Une des réponses mentionne des requêtes. "Poser une question à une base de données SQL" s'adapte bien à la complexité d'une question. Au fur et à mesure que le code évolue au cours du développement, des requêtes simples telles que "tout extraire" peuvent facilement être étendues à "tout extraire où propriété1 est égale à cette valeur, puis trier par propriété2" sans que le programmeur se préoccupe d'optimiser la structure de données pour une telle requête. Les performances de la plupart des requêtes peuvent être accélérées en créant un index pour une propriété donnée.
Les autres avantages sont les relations. Avec les requêtes, il est plus facile de référencer des données de différents ensembles de données, puis d'avoir des boucles imbriquées. Par exemple, la recherche de toutes les publications du forum à partir d'utilisateurs ayant moins de 3 publications dans un système où utilisateurs et publications sont des ensembles de données différents (ou des tables de base de données ou des objets JSON) peut être effectuée avec une seule requête sans compromettre la lisibilité.
Globalement, les bases de données SQL sont meilleures que les tableaux simples si le volume de données peut être important (plus de 1 000 objets), l’accès aux données dans des parties non triviales et différentes de l’accès de code à différents sous-ensembles de données.
la source
TLDR
On dirait que vous avez pris une décision technique de magasin de données à court terme, essentiellement valable, pour votre application: vous avez choisi d'écrire un outil de gestion de magasin de données personnalisé.
Vous êtes assis sur un continuum, avec des options pour aller dans les deux sens.
À long terme, vous rencontrerez probablement des problèmes (presque, mais pas à 100% certainement) et il sera peut-être préférable de passer à l'utilisation de solutions de stockage de données existantes. Vous devrez résoudre des problèmes de performances spécifiques, très fréquents et prévisibles, et il vaut mieux utiliser les outils existants au lieu de les résoudre vous-même.
On dirait que vous avez écrit une (petite) base de données personnalisée, intégrée et directement utilisée par votre application. Je suppose que vous utilisez un système d’exploitation et un système de fichiers pour gérer l’écriture et la lecture du disque, et vous traitez la combinaison comme un magasin de données.
Quand faire ce que tu as fait
Vous êtes assis à un endroit idéal pour le stockage des données. Un magasin de données de système d’exploitation et de système de fichiers est extrêmement pratique, accessible et portable sur plusieurs plates-formes. La combinaison existe depuis si longtemps que vous êtes certain d'être pris en charge et de faire fonctionner votre application dans presque toutes les configurations de déploiement standard.
C'est aussi une combinaison facile pour écrire du code - l' API est assez simple et basique, et il faut relativement peu de lignes de code pour le faire fonctionner.
Généralement, il est idéal de faire ce que vous avez fait quand:
Des alternatives
Vous êtes sur un continuum d'options, et il y a deux "directions" que vous pouvez suivre, ce que je considère comme "bas" et "haut":
Vers le bas
C'est l'option la moins probable à appliquer, mais c'est par souci de complétude:
Vous pouvez, si vous le souhaitez, descendre , c'est-à-dire contourner complètement le système d'exploitation et le système de fichiers et réellement écrire et lire directement à partir du disque. Ce choix n’est généralement pertinent que dans les cas où une efficacité extrême est requise - par exemple, un lecteur MP3 minuscule / minime , ne disposant pas de suffisamment de RAM pour un système d’exploitation entièrement fonctionnel, ou de quelque chose comme la Wayback Machine , qui nécessite une masse incroyablement efficace. opérations d'écriture de données (la plupart des magasins de données compensent les écritures plus lentes pour des lectures plus rapides, car c'est le cas d'utilisation extrêmement répandu pour presque toutes les applications).
Up
Il y a plusieurs sous-catégories ici - celles-ci ne sont pas exactement exclusives, cependant. Certains outils couvrent les deux, fournissant des fonctionnalités dans chacun d’eux, certains peuvent basculer complètement d’un mode à l’autre, et certains peuvent être superposés, offrant des fonctionnalités différentes aux différentes parties de votre application.
Des magasins de données plus puissants
Vous devrez peut-être stocker des volumes de données de plus en plus importants tout en vous fiant à votre propre application pour gérer la complexité de la manipulation des données. Toute une gamme de magasins de valeurs-clés sont à votre disposition, avec différents degrés de prise en charge des fonctions associées. Les outils NoSQL entrent dans cette catégorie, ainsi que d’autres.
C’est le chemin évident à suivre lorsque les éléments suivants décrivent votre application:
Il y a une certaine marge de manœuvre ici - vous pouvez forcer une meilleure cohérence de lecture, pour des lectures plus lentes. Divers outils et options fournissent des apis pour la manipulation de données, l'indexation et d'autres options, qui peuvent être plus ou moins adaptées pour écrire facilement votre application spécifique. Ainsi, si les points ci-dessus décrivent presque complètement votre application, vous serez peut-être "suffisamment proche" pour utiliser une solution de stockage de données plus puissante.
Exemples connus: CouchDB , MongoDB , Redis , des solutions de stockage dans le cloud telles que Azure de Microsoft , Google App Data Store et Amazon ECE.
Des moteurs de manipulation de données plus complexes
La famille "SQL" d'applications de stockage de données, ainsi que de nombreuses autres, sont mieux décrites comme des outils de manipulation de données que des moteurs de stockage purs. Ils offrent un large éventail de fonctionnalités supplémentaires, allant au-delà du stockage de données et allant souvent au-delà de ce qui est disponible dans le magasin de clés-valeurs. Vous voudrez prendre ce chemin quand:
C’est la manière la plus «traditionnelle» de penser une base de données ou un magasin de données, et elle existe depuis bien plus longtemps. C’est pourquoi beaucoup de choses sont disponibles ici, et il ya souvent beaucoup de complexité à gérer. Il est possible, bien que cela demande un peu d’expertise et de connaissances, et de construire des solutions simples / d’éviter une grande partie de la complexité. Vous finirez probablement par utiliser des outils et des bibliothèques tiers pour gérer la plupart de ceux-ci pour vous.
Des exemples bien connus sont MySQL , SQL Server , Oracle's Database et DB2 .
Externaliser le travail
Il existe plusieurs outils et bibliothèques tiers modernes, qui s'interposent entre vos outils de stockage de données et votre application, pour vous aider à gérer la complexité.
Ils tentent au départ d’enlever la plupart ou la totalité du travail de gestion et de manipulation des magasins de données et, idéalement, de vous permettre de passer en douceur à la complexité uniquement lorsque et si cela est nécessaire. Il s’agit d’un domaine actif d’entrepreneuriat et de recherche, avec quelques résultats récents qui sont immédiatement accessibles et utilisables.
Des exemples bien connus sont les outils MVC ( Django , Yii ), Ruby on Rails et Datomic . Il est difficile d'être juste ici, car il existe des dizaines d'outils et de bibliothèques qui encapsulent les API de divers magasins de données.
PS: si vous préférez les vidéos au texte, vous pouvez visionner certaines des vidéos de Rich Hickey relatives à la base de données; il élucide la plupart des réflexions nécessaires pour choisir, concevoir et utiliser un magasin de données.
la source
Un système de fichiers correspond à la description d'une base de données NoSQL. Je dirais donc que vous devriez absolument envisager de l'utiliser lorsque vous décidez comment stocker vos données et non pas simplement le rejeter au profit du SGBDR, comme certaines réponses semblent le suggérer ici.
Un problème avec les systèmes de fichiers (et NoSQL en général) est la gestion des relations entre les données. Si ce n’est pas un bloqueur majeur ici, alors je dirais de sauter le SGBDR pour le moment. N'oubliez pas non plus les avantages de l'utilisation d'un système de fichiers en tant que stockage:
( source )
la source
Les systèmes de fichiers sont un type de base de données. Peut-être pas un SGBDR comme tout le monde en parle, mais certainement une base de données au sens strict. Vous fournissez des clés (nom de fichier) pour rechercher des données (contenu du fichier) contenant un stockage abstrait et une API par laquelle votre programme communique.
Donc, vous utilisez une base de données. Les autres posts peuvent discuter des vertus de différents types de bases de données ...
la source
Une base de données est nécessaire si plusieurs processus (utilisateurs / serveurs) modifient les données. Ensuite, la base de données les empêche de s’écraser les modifications apportées.
Vous avez également besoin d'une base de données lorsque vos données sont plus volumineuses que la mémoire. De nos jours, avec la mémoire dont nous disposons, cela rend en effet l'utilisation de bases de données dans de nombreuses applications obsolètes.
Votre approche est définitivement meilleure que le non-sens des "bases de données en mémoire". Qui sont essentiellement votre approche, mais avec beaucoup de frais généraux ajoutés.
la source
Vous devriez toujours vous demander si une application particulière a besoin d'un SGBDR. Trop d'applications sont construites avec un processus de conception qui suppose automatiquement tous les outils et frameworks requis au départ. Les bases de données relationnelles sont si courantes et de nombreux développeurs ont déjà travaillé sur des applications similaires et sont automatiquement inclus avant le démarrage du projet. De nombreux projets peuvent s'en tirer, alors ne jugez pas trop sévèrement.
Vous avez commencé votre projet sans un, et ça marche. Il était plus facile pour vous de le faire fonctionner sans attendre votre code SQL. Il n'y a rien de mal à cela.
À mesure que ce projet se développe et que les exigences deviennent plus complexes, certaines choses vont devenir difficiles à construire. Jusqu'à ce que vous recherchiez et testiez d'autres méthodes, comment savoir quelle est la meilleure? Vous pouvez poser des questions aux programmeurs et éliminer les mauvaises herbes à travers les flammes et «ça dépend» de répondre à cette question. Une fois que vous l’apprenez, vous pouvez considérer le nombre de lignes de code que vous êtes prêt à écrire dans votre langue pour gérer certains des avantages d’une base de données. À un moment donné, vous réinventez la roue.
Facile est souvent relatif. Certains frameworks peuvent créer une page Web et connecter un formulaire à une table de base de données sans demander à l'utilisateur d'écrire du code. Je suppose que si vous luttez avec la souris, cela pourrait être un problème. Tout le monde sait que ce n'est ni évolutif ni flexible, car, Dieu nous en préserve, tout est étroitement couplé à l'interface graphique. Un non-programmeur vient de construire un prototype; beaucoup de YAGNI se trouve ici.
Si vous préférez apprendre un ORM manipulé par la langue de votre choix plutôt que par SQL, essayez-le, mais essayez d'installer, de créer une table et d'extraire des données d'une base de données populaire avec SQL (Select * De; non trucs époustouflants). C'est facile à faire. C'est pourquoi quelqu'un les a créés en premier lieu. Cela ne semble pas être un investissement énorme pour prendre une décision éclairée. Vous pourriez probablement aussi faire un test de performance.
la source
Sauvegarde des données sur le disque IS en train d' écrire à une base de données, en particulier si vous mettez chaque objet dans son propre fichier avec le nom du fichier étant la clé de l'enregistrement. Et pour réduire les temps de recherche lors de la lecture du fichier, créez des sous-répertoires basés sur les premiers caractères de la clé.
Par exemple, key = ghostwriter irait dans g / ho / stwriter.json ou g / h / o / stwriter.json ou g / ho / ghostwriter.json ou g / h / o / ghostwriter.json. Choisissez votre schéma de nommage basé sur la distribution de vos clés. Si ce sont des numéros de séquence, alors 5/4/3 / 12345.json est meilleur que l’inverse.
C'est une base de données et si elle fait tout ce dont vous avez besoin, faites-le ainsi. De nos jours, cela s'appellerait une base de données NoSQL comme GDBM ou Berkeley db. Tant de choix. Déterminez d’abord ce dont vous avez besoin, puis créez une bibliothèque d’interface pour traiter les détails, peut-être une interface get / set telle que memcached ou une interface CRUD, puis vous pourrez échanger des bibliothèques si vous devez modifier le format de la base de données pour une seule. avec des caractéristiques différentes.
Notez que certaines bases de données SQL telles que PostgreSQL et Apache Derby DB vous permettront d'effectuer des requêtes SQL par-dessus de nombreux formats NoSQL, notamment vos propres bases de données internes. Pas sûr de MyBatis mais c'est peut-être similaire.
Évitez le battage médiatique NoSQL. Lisez à propos des fonctionnalités, testez les performances et les fonctionnalités, puis choisissez en fonction de la pertinence des fonctionnalités de votre application.
http://www.hdfgroup.org/HDF5/ est un autre format de banque de données intéressant et largement utilisé que les utilisateurs ne considèrent pas souvent.
la source
Dès que les données sont mises à jour simultanément, l'approche utilisant une base de données (il pourrait s'agir d'une base de données en mémoire) sera probablement plus correcte et plus performante, tandis que votre code reste facile, car vous n'avez tout simplement pas se préoccuper des mises à jour simultanées, des transactions, de la mise en cache, des E / S asynchrones et de tout cela.
la source
Vous avez besoin d’une base de données pour stocker / récupérer les QA comme ceux que nous publions ici! Un fichier simple est incapable d'organiser des données liées à différents sujets.
la source