2013-07-04 5 views
1

Je souhaite mettre en place une fonction de réduction de produit dans RavenDB.Comment travailler avec des réductions dans RavenDB

produit doc:

{ 
    "RegularPrice": 10.00, 
    "ReferencePrice": 0.0, 
    "Categories": [ 
    "A", 
    "B", 
    "C" 
    ] 
} 

Maintenant, par exemple, je voudrais donner un rabais pour tous les produits dans la catégorie "A". Donc, je la carte catégorie sur le taux d'actualisation dans un rabais tel document:

{ 
    "ProductDiscount": { 
    "A": 20.0 
    } 
} 

La question est de savoir comment puis-je calculer la ReferencePrice et de stocker ou mettre à jour lorsque:

  • Un nouveau produit est ajouté?
  • Le prix régulier est mis à jour?
  • Le document sur les remises est-il mis à jour?

Il semble que je devrais gérer cela avec un déclencheur. Mais je ne suis pas sur!

Répondre

1

Je ne suis pas sûr que ce modèle tiendra le coup. Comment allez-vous associer le produit à la réduction? Ils sont liés par catégories, mais avec ce modèle, c'est une relation plusieurs-à-plusieurs. Est-ce ce que vous vouliez? Si oui, comment allez-vous faire face à plusieurs rabais qui pourraient s'appliquer au même produit?

Si vous deviez le laisser comme ceci, une stratégie que vous pourriez envisager serait multi-carte/réduire pour calculer le prix, et le Indexed Properties Bundle pour écrire le résultat dans le document. Mais c'est une configuration assez compliquée.

Vous pourriez probablement rendre cela plus facile en ayant une seule réduction par catégorie, et en définissant la réduction dans le cadre du document de catégorie. Ensuite, vous pouvez utiliser LoadDocument pour tirer le rabais pour les catégories tout en indexant.

Vous devrez expérimenter avec un modèle qui correspond à vos besoins et que vous pouvez gérer.

Autres idées:

  • Oui, vous pouvez utiliser un trigger, mais courraient côté serveur comme un plug-in. Cela peut être difficile à maintenir.

  • Vous pouvez envoyer manuellement un scripted patch request chaque fois qu'une réduction de catégorie est appliquée. Les nouveaux documents et les modifications apportées aux documents existants doivent être effectués manuellement dans votre propre code.

  • Vous pourriez laisser le prix calculé du produit complètement. Chaque fois que vous chargez un produit, vous devez inclure les remises et calculer le prix à la volée.

Il y en a d'autres, j'en suis sûr. Cela dépend vraiment de ce qui fonctionne dans votre application particulière.

+0

merci pour votre réponse. En effet, un produit est lié à plusieurs catégories. En cas de remises multiples, le prix calculé le plus bas sera défini. Bonnes suggestions et idées, mais certaines d'entre elles ne sont pas utiles dans mon contexte.L'utilisation de LoadDocument pendant que l'indexation ne met pas à jour les documents - Trigger est une option, mais la maintenance sera un problème (de plus, je n'ai aucune idée de la façon de réaliser la solution avec un trigger) - La requête de patch scriptée est une option aussi, mais je préfère un mécanisme qui évite le travail manuel. - Il n'est pas souhaitable de calculer le prix au moment de l'exécution ... – MED

+0

Il reste donc une option sur; Ensemble de propriétés indexées. Je l'ai essayé ce qui suit: L'indice qui calcule le (escompte) prix: 'Carte = produits => de p dans les produits de c dans p.Categories sélectionner de nouveaux { ProductId = p.Id, ReferencePrice = p.RegularPrice * ((100 - LoadDocument ("Discount /" + c) .Amount)/100) }; ' ... – MED

+0

Et un document qui mApps les champs d'index sur les propriétés du document produit – MED