Salut mon premier temps avec DDD/CQRS. J'ai lu plusieurs sources de connaissances et je suis encore confus un peu, peut-être quelqu'un pourrait aider :)CQRS Lire les modèles dans un NoSql (Mongo DB)
Supposons le cas simple que nous avons des produits et des clients (éventuellement différents contextes délimités). Un client peut acheter un produit et il veut voir tous les produits qu'il a achetés.
Dans ce cas, je me rends compte que je besoin d'un UserPurchasesView modèle de vue avec:
- purchaseId (qui est une clé primaire mongo)
- userId,
- produit: {id, nom, son image , shortDescription, [peut-être quelques autres]}
- prix
- timestamp
Maintenant ... le problème est que Mon domaine génère un événement comme UserPurchasedProduct (userId, productId). Je pourrais enrichir un événement avec un prix, un nom de produit ou peut-être quelque chose d'autre mais pas tous les champs. J'arrive à un point où enrichir semble être faux.
En ce moment je me rends compte que je besoin de quelque chose comme ProductDetailsView:
- productId (clé primaire)
- prix
- Nom
- shortDescription
- logo
Ce point de vue est maintenu par des événements tels que: ProductCreated, ProductRenamed, ProductImageChanged
Et maintenant nous avons 2 options ...
- Regardez dans l'ProductDetailsView lorsque l'événement UserPurchasedProduct arrive, prendre tous les détails du produit nécessaires et enregistrez dans UserPurchasesView pour des lectures plus rapides. Cette solution ne semble pas si mauvaise mais elle introduit un peu de couplage supplémentaire et il me semble que ces vues ne peuvent pas être bien mises à l'échelle en cas de besoin. Les deux vues doivent également être reconstruites ensemble lors de la réponse à tous les événements du magasin d'événements (la reconstruction est également plus complexe dans ce cas).
- Conserver uniquement le productId dans UserPurchasesView et lire plusieurs vues lorsque l'utilisateur interroge ses achats. C'est un traitement supplémentaire qui devrait être fait quelque part. Dans le frontend, dans le contrôleur backend ou dans certaines API de haut niveau de modèle de lecture. MISE À JOUR: Je me suis également rendu compte que je devrais garder au moins le prix et peut-être le nom du produit dans UserPurchasesView (au cas où il changerait) mais parfois vous avez besoin de la valeur du moment de l'achat et parfois vous avez besoin de la valeur récente . Le scénario dépend d'une entreprise mais nous pouvons imaginer les deux.
Aucune de ces solutions ne me semble parfaite. Est-ce que j'ai tort, est-ce que je manque quelque chose ou est-ce juste la manière de le faire? Merci!
En fait, c'était ce que je pensais. Dans ma solution, j'ai une «projection» à l'écoute des événements d'achat et de produits. Mais cette projection de processus unique maintient 2 collections mongo - UserPurchases and Products. Actuellement, il gère également plus de collections pour différentes vues d'interface utilisateur, mais cela peut être facilement divisé en plusieurs projections lorsque cela est nécessaire. Néanmoins, ces 2 collections doivent toujours être proches et maintenues ensemble (également lors de la reconstruction de la projection avec tous les événements du magasin) – Mark
* Fondamentalement * c'est la première option mais avec plus de détails ajoutés. –