web-dev-qa-db-fra.com

meilleures pratiques pour la conception de bases de données NoSQL

Je viens de commencer à utiliser une base de données basée sur des documents NoSQL (MongoDB) et je suis curieux de connaître les meilleures pratiques pour la conception de bases de données.

Je suppose que l'architecture doit être différente des bases de données relationnelles? Dois-je toujours viser une base de données normalisée?

Par exemple, j'ai un cas d'utilisation particulier;

J'ai un utilisateur avec un historique de location (tableau d'adresses) ce tableau doit-il être un tableau sur l'utilisateur ou en tant que collection distincte avec une clé partagée?

37
Tom Squires

L'approche appropriée pour la conception de bases de données NoSQL est un [~ # ~] ddd [~ # ~] ( Domain Driven Design ). Pour certaines personnes qui avaient l'habitude de concevoir un SGBDR, NoSql ressemble aux anti-modèles Sql et cela a plus de sens lorsqu'il est considéré dans le cadre d'un DDD.

Selon l'utilisation des adresses, vous pouvez le définir comme un objet de valeur dans votre modèle/entité d'historique de location.

Voici quelques références qui pourraient éclairer les réflexions sur la conception avec NoSQL:

24
Yusubov

TL; DR

La normalisation dans RDBMS vous permet de tirer parti des points forts du paradigme relationnel.

La dénormalisation dans NoSQL vous permet de tirer parti des atouts du paradigme NoSQL.

Longue réponse

Les SGBDR sont excellents car ils vous permettent de modéliser des entités structurées uniques (mutables ou non) et leurs relations les unes avec les autres. Cela signifie qu'il est très facile de travailler au niveau de l'entité, de mettre à jour leurs propriétés, d'en insérer une autre, de la supprimer, etc. Le SGBDR vous donne des outils pour faciliter tout cela. Il se joindra à vous, il gérera les changements atomiques entre les entités pour vous, etc.

Les bases de données NoSQL sont excellentes car elles vous permettent de modéliser des agrégats semi/non structurés et des entités dynamiques. Cela signifie qu'il est très facile de modéliser des entités en constante évolution, des entités qui ne partagent pas toutes les mêmes attributs et des agrégats hiérarchiques.

Pour modéliser NoSql, vous devez penser en termes de hiérarchie et d'agrégats plutôt qu'en termes d'entités et de relations. Vous n'avez donc pas de personne, d'adresse de location et de relation entre eux. Vous avez des dossiers de location qui regroupent pour chaque personne les adresses de location qu'elle a eues.

Vous devez demander quelles données dois-je modifier ensemble. Quelles données regroupent logiquement les autres données. Dans votre cas, une personne sonne comme un bon agrégat. Quel est le point d'entrée logique vers le reste des données.

NoSQL, disons, stockons une chose qui a d'autres choses qui ont leurs propres choses. Rends-moi toute la hiérarchie des choses. Permettez-moi de le changer à ma guise, remplacez maintenant toute la hiérarchie des choses par ma nouvelle. C'est à peu près tout ce que cela vous donne. Pourquoi est-ce utile? Si vous avez une hiérarchie de choses avec laquelle vous interagissez toujours dans son ensemble. Ou si vous avez besoin d'une mise à l'échelle massive.

Tout ce que le RDBMS vous donne d'autre, vous devrez l'implémenter manuellement dans le code et dans votre schéma. Vous devrez vous joindre au code si vous avez besoin d'un agrégat d'agrégats. Vous devrez analyser si vous n'avez besoin que d'une partie d'un agrégat. Vous devrez vérifier vous-même l'unicité si vous ne voulez pas de doublons. Vous devrez implémenter votre propre logique transactionnelle lorsque vous travaillez sur des agrégats, etc.

Donc, avoir une grande table avec tout ce dont vous avez besoin est la voie à suivre dans NoSql. Puisque l'atomicité est garantie à ce niveau seulement, et les performances aussi. Il est important de déterminer vos relations tôt. Voilà ce qu'est la dénormalisation.

Dans RDBMS, la dénormalisation paralyse efficacement votre base de données en une base NoSQL. Donc, normalement, vous voulez le contraire, c'est-à-dire la normalisation. Si vous ne le faites pas, vous devriez plutôt utiliser une base de données NoSQL. Sauf si vous avez besoin d'un peu des deux.

21
Didier A.