Normalisation MongoDB, clé étrangère et jointure

Avant de plonger vraiment profondément dans MongoDB pendant des jours, j'ai pensé que je poserais une question assez basique pour savoir si je devrais y plonger du tout ou non. Je n'ai fondamentalement aucune expérience avec nosql.

J'ai lu un peu sur certains des avantages des bases de données de documents, et je pense que pour cette nouvelle application, ils seront vraiment super. Il est toujours difficile de faire des favoris, des commentaires, etc. pour de nombreux types d'objets (beaucoup de relations m-à-m) et de sous-classes, c'est une sorte de douleur à traiter avec.

J'ai aussi une structure qui sera difficile à définir en SQL car elle est extrêmement imbriquée et se traduit par un document beaucoup mieux que 15 tables différentes.

Mais je suis confus au sujet de quelques choses.

  1. Est-il souhaitable de garder votre base de données normalisée encore? Je ne veux vraiment pas mettre à jour plusieurs enregistrements. Est-ce encore la façon dont les gens abordent la conception de la base de données dans MongoDB?

  2. Que se passe-t-il lorsqu'un utilisateur privilégie un livre et cette sélection est toujours stockée dans un document utilisateur, mais le livre est supprimé? Comment la relation se détache-t-elle sans clés étrangères? Suis-je manuellement responsable de la suppression de tous les liens moi-même?

  3. Que se passe-t-il si un utilisateur a mis en favoris un livre qui n'existe plus et que je l'interroge (une sorte de jointure)? Dois-je faire une tolérance aux pannes ici?

62
demandé sur Community 2011-04-30 16:17:02

2 réponses

MongoDB ne prend pas en charge les relations de clés étrangères côté serveur, la normalisation est également déconseillée. Vous devez intégrer votre objet enfant dans les objets parents si possible, cela augmentera les performances et rendra les clés étrangères totalement inutiles. Cela dit, ce n'est pas toujours possible, il existe donc une construction spéciale appelée DBRef qui permet de référencer des objets dans une collection différente. Cela peut être alors pas si rapide car DB doit faire des requêtes supplémentaires pour lire des objets mais permet type de référence de clé étrangère.

Vous devrez toujours gérer vos références manuellement. Ce N'est qu'en recherchant votre DBRef que vous verrez s'il existe, la base de données ne parcourra pas tous les documents pour rechercher les références et les supprimer si la cible de la référence n'existe plus. Mais je pense que la suppression de toutes les références après la suppression du livre nécessiterait une seule requête par collection, pas plus, donc pas si difficile vraiment.

Si votre schéma est plus complexe alors vous devriez probablement choisir une base de données relationnelle et non nosql.

Il y a aussi un livre sur la conception de bases de données MongoDB: Document Design for MongoDB

UPDATE Le Livre ci-dessus n'est plus disponible, mais en raison de la popularité de MongoDB, il y en a beaucoup d'autres. Je ne les lierai pas tous, car ces liens sont susceptibles de changer, une simple recherche sur Amazon montre plusieurs pages, donc il ne devrait pas être un problème pour en trouver.

Voir le manuel MongoDB page pour 'références manuelles' et DBRefs pour plus de détails et d'exemples

63
répondu Tomasz Stanczak 2017-06-14 05:13:18

Ci-dessus, @ TomaaszStanczak déclare

MongoDB ne prend pas en charge les relations de clé étrangère côté serveur, la normalisation est également découragée. Vous devez intégrer votre objet enfant dans les objets parents si possible, cela augmentera les performances et rendre les clés étrangères totalement inutiles. Cela dit, il n'est pas toujours possible ...

La normalisation N'est pas découragée par Mongo. Pour être clair, nous parlons essentiellement deux types de relations deux les entités de données peuvent avoir. Dans un, une entité enfant est détenue exclusivement par un objet parent. Dans ce type de relation, la manière Mongo est d'intégrer.

Dans l'autre classe de relation, deux entités existent indépendamment-ont des durées de vie et des relations indépendantes. Mongo souhaite que ce type de relation n " a pas existé, et est frustrant silencieux sur précisément la façon de traiter avec elle. L'intégration n'est tout simplement pas une solution. La normalisation n'est pas découragée ou encouragée. Mongo juste vous donne deux mécanismes pour y faire face; refs manuels (analogue à une clé avec la contrainte de clé étrangère liant deux tables), et DBRef (une manière différente, légèrement plus structurée de faire la même chose). Dans ce cas D'utilisation, les bases de données SQL win.

17
répondu Francis M. Bacon 2015-01-16 09:34:29