Quand devrions-nous utiliser MongoDB?

17

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 le traitement des 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 dois-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 une grosse mise en garde à propos de MongoDB qui le rend inapproprié dans certaines situations?

user1620696
la source
8
Utilisez MongoDB chaque fois que vous ne vous souciez pas de petits détails sans importance comme l'intégrité référentielle (pour garantir que les données ne sont pas corrompues), des schémas (pour vous assurer que les données contiennent réellement ce que vous pensez qu'elles contiennent), la cohérence (une garantie que les données que vous insérez sera réellement enregistré ,) ou la possibilité d'écrire des requêtes non triviales sur votre jeu de données (afin que vous puissiez réellement faire des choses utiles et créatives avec les données.)
Mason Wheeler
2
@MasonWheeler a accepté. Dans ce contexte, "simple et agréable à utiliser" signifie "plus facile à utiliser lors de l'écriture de bogues et de la corruption de données";)
Andres F.

Réponses:

17

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 construire 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 joins, 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 basée sur des documents. 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 et de l'entrée référés). 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.

Arseni Mourzenko
la source
Cette réponse nécessite une mise à jour car MongoDB depuis la version 4.0 prétend appliquer ACID, bien que Python et Java API pour les transactions multiples mongodb.com/blog/post/…
Carmine
@Carmine: Je n'ai pas suffisamment de connaissances pour fournir une réponse mise à jour. Pourriez-vous (1) poster la vôtre comme réponse ci-dessous et (2) ajouter un commentaire ici une fois que vous l'avez fait, alors j'ajoute un avertissement à ma réponse avec un lien vers la vôtre, disant que ce n'est plus valable à partir de MongoDB 4?
Arseni Mourzenko
9

Chaque technologie a ses avantages.

Les avantages des bases de données relationnelles sont que le SGBDR fait certaines choses pour vous, comme:

  • Application de l'intégrité référentielle (ne pas autoriser l'insertion d'un détail de facture si la facture à laquelle il appartient n'existe pas)
  • Évitez la redondance: les choses ne sont stockées qu'une seule fois.
  • Les requêtes complexes peuvent être effectuées avec un langage déclaratif (SQL) qui est mature, éprouvé et largement répandu.

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 aucune structure spécifique 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.

Tulains Córdova
la source
5
MongoDB manquant de transactions est un énorme inconvénient. Avoir à se soucier des conditions de course tout le temps est une telle douleur dans le cul.
CodesInChaos
1
Remarque: MongoDB prend désormais en charge les transactions ACID.
Milan Velebit
5

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 de lire / écrire beaucoup de données, sans trop mettre l'accent sur la sécurité des transactions (si certaines données sont occasionnellement perdues lors d'une panne de serveur, ce n'est pas un problème), attendez-vous à une grande échelle et ne le faites pas '' t vraiment un schéma stable.

MongoDB n'est pas adapté aux scénarios qui nécessitent:

  1. Fortes garanties ACID: MongoDB permet de stocker des données en double, des lectures incohérentes et même une perte de données. Ces choses sont très bien dans certaines applications, mais pas dans la plupart.
  2. Transactions multi-objets: MongoDB prend en charge les transactions ACID, mais uniquement pour un seul objet / document. Cela ne suffira pas pour les opérations plus complexes comme les virements bancaires, la réservation, etc.
  3. BI traditionnelle: il existe de nombreux outils de BI qui ne fonctionnent bien qu'avec le SQL traditionnel.
  4. SQL: MongoDB a un langage de requête très spécifique, alors que SQL est très bien connu par beaucoup de gens (peut être un aspect important à considérer), peut faire beaucoup de choses complexes (alors qu'avec MongoDB vous auriez du mal à effectuer un simple rejoindre) et est transférable à travers de nombreuses implémentations.

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.

snickro
la source
3

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 RDBMS car 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.

aarkerio
la source
2

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/

Alexis Dufrenoy
la source