2017-10-16 5 views
0

L'association de données de manière 'sql-esque' est possible dans MapReduce comme mentionné dans de nombreux endroits - tels que these Standford course notes et this MSc thesis, et un plagiarized copy of that thesis publié par http://ijniet.org: p.Est-ce qu'une jointure multi-voies est possible du tout en utilisant les vues CouchDB?

J'ai 3 entités:

  1. A
  2. B
  3. C

A et B peuvent être réunis sur la colonne ab et BC peuvent être réunis sur la colonne bc. Je pense que je peux y parvenir en cascade des tâches MapReduce. Mais que je ne peux pas faire cela dans CouchDB en aucune façon, que ce soit avec les fonctions de carte, réduire les fonctions, les fonctions de liste (qui utilisent une vue MapReduce), ou une combinaison de ces ...

Dans CouchDB vous pourriez documents de sortie de différentes entités avec la même clé de jointure. Mais autant que je sache, il n'y a pas de fonction de carte possible qui permet de grouper plusieurs entités soit par la même clé, soit par une plage de touches?

Ceci est spécifiquement pour JOINS où les colonnes de clé étrangère sont différentes pour chaque jointure.

Répondre

1

Vous ne pouvez pas faire de jointures en cascade dans CouchDB.

Les seules jointures que vous pouvez faire sont des jointures un-à-plusieurs.

Il se compose d'une vue qui émet les documents liés en tant que valeur:

function(doc){ 
    emit([doc._id,0]); 
    emit([doc.ab,1],{_id:doc.ab}); 
} 

Alors vous interrogez avec ?include_docs=true

Vous obtiendrez quelque chose comme ceci:

{rows:[ 
    {key:["my_main_doc_id",0],doc:{my main document...}}, 
    {key:["my_main_doc_id",1],doc:{child doc...}} 
]} 

Voir ceci documentation

+0

Cela ressemble à créer votre relation d'entité dans le document lui-même. Vous pouvez également approximer les jointures en émettant des documents de différents types d'entité avec la même clé, puis en récupérant un index de carte groupé. Mais je me rends compte que vous ne pouvez pas faire la jointure réelle dans la fonction de réduction puisque vous devez autoriser rereduce = true –