2010-08-14 5 views
2

Je ne suis pas sûr comment je peux concevoir le problème suivant dans CouchDB. J'ai une application Web enregistreur qui garde la trace du nombre d'articles dans un entrepôt. Pour simplifier le problème, nous avons juste besoin de connaître le nombre total d'articles actuellement dans l'entrepôt et combien de temps chaque article reste dans l'entrepôt avant son expédition. Disons que l'entrepôt n'a que des chaussures, mais chaque chaussure a un identifiant différent et a besoin de garder une trace par ID.Comment convertir le schéma MySQL suivant en CouchDB?

MySQL schema looks like this 

    id  name  date-in  data-out 
    1  shoe  08/0/2010  null 
    2  shoe  07/20/2010  08/01/2010 


The output will be 
    Number of shoe in warehouse: 1 
    Average time in warehouse: 14 days 

Merci

Répondre

2

jhs est grande, mais je voulais juste ajouter quelque chose:

Pour utiliser l'accumulation de réduire la fonction pour le calcul de avg (_stats dans votre cas), vous devez utiliser deux vues « séparées » . Mais si votre fonction map est exactement la même, CouchDB détectera cela et ne générera pas un nouvel index pour cette seconde vue. De cette façon, vous pouvez avoir une fonction de carte alimentant plusieurs fonctions de réduction.

+0

Je suis nouveau à CouchDB et aimerais vraiment comprendre ce que vous venez de dire. Pourriez-vous expliquer plus peut-être ajouter un petit exemple. –

+0

Je vais essayer d'expliquer :) Chaque vue dans CouchDB se compose d'une fonction de carte et d'une fonction facultative de réduction. Ils sont spécifiés dans les documents de conception (documents avec le préfixe "_design /"). Chaque document de conception peut spécifier plusieurs vues qui seront traitées en tant que groupe. Maintenant, si vous spécifiez deux vues dans le même document de conception avec des fonctions de carte identiques aux octets, mais des fonctions de réduction différentes, CouchDB n'exécutera la phase de carte qu'une seule fois. – tisba

1

Si chaque chaussure est un document, avec un date_in et date_out, votre fonction sera de réduire +1 si le date_out est nul, et 0 (pas de changement) si date_out n'est pas nul. Cela vous donnera le nombre total de chaussures dans l'entrepôt.

Pour calculer la durée moyenne, pour chaque chaussure, vous connaissez l'heure dans l'entrepôt. Ainsi, la fonction de réduction accumule simplement la moyenne. Puisque les fonctions de réduction doivent être commutatives et associatives, vous utilisez un algorithme moyen différent. Le plus simple est de réduire à un tableau [sum, count], où sum est un accumulateur de tous les temps pour toutes les chaussures, et count est un compteur pour le nombre de chaussures comptées. Ensuite, le client divise simplement sum/count pour calculer la moyenne finale.

Je pense que vous pourriez combiner les deux en une seule grande réduction si vous voulez, peut-être construire un type d'objet {"shoes in warehouse": 1, "average time in warehouse": [253, 15]}. Cependant, si vous pouvez accepter deux vues différentes pour ces données, il existe un raccourci pour la moyenne. Sur la carte, emit(null, time)time est le temps passé dans l'entrepôt. Dans la réduction, définissez la valeur de réduction entière sur _stats (voir Built-in reduce functions). La sortie de la vue sera un objet avec le sum et count déjà calculé. La réponse de