MongoDB est une base de données NoSQL que j'ai trouvée assez facile à utiliser. Récemment, j'ai dû développer une application simple qui devait collecter des données à l'aide de requêtes HTTP et stocker des résultats après avoir traité les données, et j'ai essayé d'utiliser MongoDB.
De cette expérience, je l'ai trouvé beaucoup plus agréable à utiliser que les bases de données relationnelles traditionnelles et comme je suis développeur et non DBA, mon travail a été grandement simplifié.
Pourtant, parfois je ne sais pas quand devrais-je utiliser MongoDB au lieu d'une base de données relationnelle traditionnelle, comme SQL Server ou MySQL.
Dans ce cas, quand pouvons-nous utiliser MongoDB au lieu des bases de données relationnelles? Y a-t-il vraiment gros mise en garde à propos de MongoDB qui le rend inapproprié pour certaines situations?
Fondamentalement:
Si vous pouvez représenter vos données sous la forme d'un tas de documents, MongoDB pourrait être un bon choix.
Si vous préférez imaginer vos données comme un tas de tables interconnectées, MongoDB n'est peut-être pas un bon choix.
Voici deux exemples que je trouve illustratifs:
Il y a quelques années, j'ai créé un moteur de blog. Son but est d'héberger des articles de blog, et pour chaque article, de stocker les différentes versions, des métadonnées, des statistiques de visites, etc.
Cela pourrait être stocké sous forme de groupe de tables, mais lorsque vous essayez de créer un modèle, il se développe très rapidement pour une douzaine de tables, sinon plus. Certaines requêtes SQL peuvent devenir laides avec beaucoup de join
s, et ... eh bien, vous obtenez l'image.
Le problème ici est qu'il y a une chose centrale - un article de blog - et il y a tout ce genre de choses autour de l'article, ce qui le rend bien adapté à une base de données documentaire. Avec MongoDB, la modélisation de la base de données a été extrêmement facile: une collection contient les articles du blog, et une deuxième petite collection contient la liste des utilisateurs autorisés à écrire des articles. Chaque document de la première collection contiendrait toutes les informations dont j'ai besoin pour afficher un article, serait-ce le nom de l'auteur ou les tags.
Imaginez maintenant un projet très différent. Certains utilisateurs peuvent écrire des trucs et partager des trucs écrits par d'autres utilisateurs. Sur une page d'un utilisateur, vous vous attendriez à trouver à la fois ce que cet utilisateur a écrit et ce qu'elle a partagé. Il y a une contrainte: quand quelqu'un édite ce qu'il a écrit dans le passé, le changement apparaît partout où le texte original a été partagé.
Avec une approche basée sur des documents, il est difficile de trouver quel serait le document. Un utilisateur peut-être? Eh bien, c'est un bon début. Un document utilisateur contiendrait tout ce que cet utilisateur a écrit. Mais qu'en est-il des choses qu'elle a partagées?
Une façon possible est de mettre ces choses dans le même document. Le problème avec cette approche est que si quelqu'un modifie une entrée, l'application doit parcourir chaque document utilisateur de la base de données afin de modifier chaque occurrence de l'ancienne entrée. Sans compter la duplication des données.
Une alternative serait de conserver dans le document utilisateur uniquement la liste des entrées partagées par cet utilisateur (avec l'ID de l'utilisateur référé et l'entrée). Mais maintenant, un problème différent se produirait: si un utilisateur partageait des milliers d'entrées de milliers d'utilisateurs, il lui faudrait ouvrir des milliers de documents pour obtenir ces entrées.
Ou nous pouvons modéliser notre collection autour des entrées elles-mêmes, chaque entrée faisant référence à son auteur et ayant une liste d'utilisateurs qui l'ont partagée. Là encore, les problèmes de performances peuvent devenir perceptibles lorsque vous devrez parcourir tous les documents afin d'afficher ceux publiés par un utilisateur donné.
Maintenant, de combien de tables auriez-vous besoin si vous utilisiez une base de données relationnelle? Bon, trois. Il serait simple à modéliser, et aussi simple à utiliser.
Chaque technologie a ses avantages.
Les avantages des bases de données relationnelles sont que le SGBDR fait certaines choses pour vous, comme:
Tout cela se résume au fait que vous devez écrire moins de code parce que le SGBDR applique les choses pour vous.
De plus, l'indépendance des données: souvent, si vous utilisez des structures SQL standard et pas de structures spécifiques au fournisseur, vous pouvez migrer vos données d'un SGBDR vers un autre avec un minimum de tracas, tandis que les bases de données NOSQL ne sont pas du tout normalisées.
D'un autre côté, l'un des avantages des bases de données NOSQL est qu'elles évoluent mieux en maintenant les performances de millions de lignes. Ils sont mieux adaptés au stockage basé sur des documents, c'est-à-dire des données non structurées. Mais la plupart des applications n'ont pas besoin de ces fonctionnalités.
Pour votre cas particulier, MongoDB semble être un bon choix, mais il existe de nombreux scénarios (probablement la plupart d'entre eux) où ce ne serait pas le meilleur choix.
MongoDB est plus adapté dans les scénarios qui nécessitent la lecture/écriture beaucoup de données, sans trop mettre l'accent sur la sécurité des transactions (si certaines données sont occasionnellement perdues lors d'un crash de serveur, ce n'est pas un gros problème), attendez-vous à à grande échelle, et n'ont pas vraiment un schéma stable.
MongoDB est pas adapté aux scénarios qui nécessitent:
MongoDB est plus rapide et vous permettra d'augmenter les performances du système en éliminant beaucoup de choses que le SGBDR applique par défaut, comme les contrôles d'intégrité (notez que vous pouvez également modifier le SGBDR à de telles fins, de toute façon), mais la vérité est, dans la plupart des scénarios, ce n'est tout simplement pas nécessaire. De plus, le compromis est la fiabilité et la flexibilité (vous aurez des problèmes si, plus tard, vous décidez que vous devez effectuer des opérations plus complexes avec les données existantes).
Tout dépend des besoins de l'application que vous créez. Est-ce la vitesse et la disponibilité, ou la sécurité, la fiabilité et la flexibilité. Vous devez savoir où dans vos données (et dans les connexions de vos données) se trouve plus de valeur. Si vous ne le savez pas encore, il est probablement préférable de choisir quelque chose qui ne vous peindra pas dans le futur et vous permettra d'ajouter les fonctionnalités et d'effectuer les opérations dont votre application a besoin.
MongoDB est idéal lorsque vous pouvez représenter vos données sous forme de "packages" d'informations indépendants. Vous avez des codes postaux google maps, intégrés dans le code postal sont des entreprises et à l'intérieur des entreprises sont des employés. Tous les codes postaux sont indépendants les uns des autres et vous pouvez obtenir toutes les informations d'une manière simple, jolie et rapide. C'est un bon scénario pour une solution nonSQL.
Une fois dit cela, je suis totalement en désaccord avec la tendance actuelle que je recherche qui implique que MongoDB est une sorte de solution post et supérieure à RDBMS et noSQL doit être votre solution par défaut. Tout cela est absurde. MongoDB est une base de données de niche et 90% des projets sont relationnels et nécessitent une option SGBDR parce que vous voulez une solution de requête puissante comme SQL pour générer vos rapports et rechercher des données dispersées: les "jointures" sont un pro, pas un con. En outre, les SGBDR modernes prennent en charge les collections BSON et l'intégration géospatiale, alors peut-être que le créneau de noSQL est encore plus étroit.
MongoDB est utile pour stocker toutes les données structurées nécessaires à la construction d'une instance donnée d'une page Web. Vous pouvez récupérer les données d'une page donnée, les transmettre à votre application cliente qui pourra ensuite les restituer.
Dans un tel contexte, MongoDB est très rapide et fiable. Mais n'oubliez jamais que vous n'avez pas d'informations relationnelles dans votre base de données. Ce qui signifie que si vous modifiez quelque chose dans la structure de votre page Web, vous ne pourrez peut-être pas combler les trous dans vos pages déjà stockées car vous ne disposez pas des données nécessaires pour le faire. Plus d'informations à ce sujet ici: http://www.sarahmei.com/blog/2013/11/11/why-you-should-never-use-mongodb/