2012-02-23 6 views
19

En utilisant le DBREF datatype dans MongoDB, un document peut ressembler à celui illustré ci-dessous. Mais avoir le champ $ref dans chaque rangée se sent redondant car chaque rangée pointe évidemment vers la collection users.MongoDB - DBREF est-il nécessaire?

Existe-t-il un moyen de référencer d'autres documents sans avoir le $ref -field quelque peu redondant?

{ 
    $id: {$oid : "4f4603820e25f4c515000001"}, 
    title: "User group", 
    users: [ 
     {_id: {$ref: "users", $id: { $oid: "4f44af6a024342300e000002"}}, isAdmin: true } 
    ] 
], 
+4

Y at-il une raison spécifique pour laquelle vous n'utilisez pas la simple liaison directe/manuelle (en plaçant l'ObjectId comme suggéré ci-dessous)? –

Répondre

31

Dbref à mon avis devrait être évité lorsque vous travaillez avec mongodb, au moins si vous travaillez avec de grands systèmes qui nécessitent une évolutivité.

Comme je sais que tous les pilotes font une demande supplémentaire pour charger DBRef, donc ce n'est pas 'rejoindre' dans la base de données, il est très cher.

Existe-t-il un moyen de référencer d'autres documents sans avoir le $ ref-field quelque peu redondant?

Oui, garder les références dans l'esprit, créer des conventions de dénomination pour « clés étrangères » (quelque chose comme RefUserId ou juste UserId) et stocker simplement id document référencé. Chargez vous-même les documents référencés si nécessaire. Gardez également vos yeux ouverts pour toute dénormalisation, l'intégration que vous pouvez faire, car elle améliore généralement grandement les performances.

+3

Ce n'est pas vraiment un problème d'utiliser un DBRef ou simplement le _id mais comment les résoudre avec la sémantique des liens. Si vous avez des références non homogènes (à plusieurs collections), vous aurez besoin à la fois de la collection et du _id == DBRef. –

+1

Juste pour répéter Scott un peu: si vous faites référence à des objets dans la même collection, vous pouvez simplement utiliser un champ ObjectId –

+0

alors à l'avenir, la mise à jour coûte plus cher? parce que la mise à jour n'est pas nécessaire pour mettre à jour toute la collection hmm? –

6

Sauf si vous utilisez des méthodes spécifiques du pilote pour accéder dbref, il devrait être inutile.

Dans les cas où vous gérez la jointure manuellement (c'est-à-dire que vous connaissez l'autre collection à "joindre" à), il suffit de stocker uniquement l'objet ObjectId.

2

De l'docs:

Manual references sont une alternative, et the docs say références manuelles sont préférables à DBREFS (though I'm not sure why). Les DBREF sont utiles lorsque l'objet référencé réside dans une autre base de données ou lorsque le nom de la collection ne serait pas évident.

La dénormalisation/intégration est préférable à tout type de liaison car vous obtenez alors des mises à jour atomiques et n'avez pas besoin de re-interroger les données associées.

Questions connexes