Quand utiliser une base de données nosql telle que mongodb sur mysql?

13

Je suis nouveau dans le concept des bases de données nosql et je ne l'ai jamais utilisé. Sur la base de ce que j'ai lu et du peu que j'ai compris, je ne vois toujours pas comment ils peuvent être particulièrement utiles si vous ne pouvez pas faire de références entre les données, s'il n'y a pas de concept de clé étrangère.

Comment pourrais-je par exemple interroger quelque chose de simple comme 'trouver tous les commentaires postés par cet utilisateur', 'trouver toutes les photos qui appartiennent à une entité d'album' etc.

Les systèmes nosql s'éloignent-ils du modèle de données relationnel statique tout en vous permettant de garder une trace de ces références, existe-t-il quelque chose d'analogue aux clés étrangères que vous pouvez utiliser dans les requêtes?

akomada
la source

Réponses:

19

Utilisations générales

  • Si vous avez des structures de données qui ne sont pas clairement définies au moment où vous créez le système. J'ai tendance à conserver les paramètres utilisateur dans nosql, par exemple. Un autre exemple était un système où les utilisateurs devaient pouvoir ajouter des champs au moment de l'exécution - très douloureux dans un SGBDR et un jeu d'enfant dans NoSQL.

  • Si la structure de votre modèle est largement centrée sur un ou quelques objets de modèle et que la plupart des relations sont en fait des objets enfants des objets de modèle principaux. Dans ce cas, vous constaterez que vous aurez assez peu besoin de jointures réelles. J'ai trouvé que le système de gestion des contacts peut être implémenté assez bien dans nosql par exemple. Une personne peut avoir plusieurs adresses, téléphones et e-mails. Au lieu de les mettre chacun dans une table séparée, ils font tous partie du même modèle et vous avez un objet personne.

  • Si vous souhaitez bénéficier du clustering de vos données sur plusieurs serveurs plutôt que d'avoir un serveur monolithique, ce qui est généralement requis par le SGBDR.

  • Mise en cache. Même si vous souhaitez vous en tenir à un SGBDR comme base de données principale, il peut être utile d'utiliser une base de données NoSQL pour mettre en cache les résultats des requêtes ou conserver des données, telles que des compteurs.

  • Stockage de documents. Si vous souhaitez stocker des documents cohérents, dans une base de données, certaines des bases de données NoSQL (telles que MongoDB) sont en fait spécialisées dans leur stockage.

Et les jointures?

Honnêtement, la chose sans jointure me semblait aussi assez effrayante au début. Mais l'astuce consiste à arrêter de penser en SQL. Vous devez réellement penser à l'objet que vous avez en mémoire lorsque vous exécutez votre application. Celles-ci devraient plus ou moins être simplement enregistrées dans la base de données NoSQL au fur et à mesure de leur superficie.

Parce que vous pouvez stocker votre graphique d'objet complet, avec des objets enfants, la plupart des besoins de jointures sont éliminés. Et si vous trouvez que vous en avez besoin, vous devrez mordre la balle et récupérer les deux objets et joindre votre code d'application.

Heureusement, la plupart des pilotes peuvent effectuer la jointure pour vous, si vous configurez correctement votre schéma.

Pour plus de lecture, je recommande réellement Martin Fowler .

ced-b
la source
2

J'utiliserais certainement une telle base de données pendant les étapes de planification d'un projet (avant le développement, avant même la conception) pour enregistrer des données dont la structure, les relations et les caractéristiques ne sont pas encore connues et sujettes à analyse. J'essaierais de faire en sorte que tout rentre dans un modèle relationnel après cela.

Mike Nakis
la source
2
Quelle? ... Pourquoi? ...
Robert Harvey
Donc, on pourrait, en pratique, utiliser un modèle de relation pour des données dont on sait qu'elles ne changeront pas vraiment grand-chose telles que les informations utilisateur, avec le nom typique, l'e-mail, etc., par exemple mysql. Ensuite, utilisez-le en conjonction avec une base de données nosql pour gérer des données non structurées et irrégulières telles que les journaux d'activité des utilisateurs. Sorte de responsabilité partagée. ? Ou proposiez-vous de commencer avec une base de données nosql et d'effectuer une migration complète vers un modèle relationnel une fois que tout est défini?
akomada
Dans un scénario où vous disposez déjà de données avant même le début de l'analyse (par exemple, vous êtes appelé à réécrire le logiciel qui contrôle une usine existante, où les capteurs crachent déjà des données), je commencerais immédiatement à capturer les données dans une base de données nosql, puis j'essaierais, si possible, de l'intégrer dans un modèle relationnel. Si ce n'est pas possible, je continuerais avec nosql.
Mike Nakis
0

Dans certains cas, vous n'aurez pas besoin de clés étrangères. Par exemple:

Retrouvez tous les commentaires postés par cet utilisateur

peut être aussi simple que de charger la commentspartie d'un document correspondant à un utilisateur. C'est ce qu'on appelle la dénormalisation : au lieu d'avoir deux ensembles avec une jointure, vous avez un document et tout ce dont vous avez besoin se trouve à l'intérieur du document. Une requête, pas de jointures, de meilleures performances .

Mais dans certaines circonstances, cela peut entraîner une duplication des données , donc la liaison d'un document à un autre peut être appropriée. Dans ce cas, vous pouvez être intéressé par la normalisation MongoDB, la clé étrangère et la jointure , la page Références de base de données et en particulier la fonction DBRefs.

Arseni Mourzenko
la source