web-dev-qa-db-fra.com

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

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?

13
akomada

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 de la mise en cluster 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.

Qu'en est-il des 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 jointures sont éliminées. 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 .

19
ced-b

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.

2
Mike Nakis

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 partie comments d'un document correspondant à un utilisateur. Cela s'appelle dénormalisation : au lieu d'avoir deux ensembles avec une jointure, vous avez un document et tout ce dont vous avez besoin est à l'intérieur du document. Une requête, pas de jointures, meilleures performances .

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

0
Arseni Mourzenko