Premièrement, je tiens à dire que cela semble être une question ou un domaine négligé. Si cette question doit être améliorée, aidez-moi à faire de cette question une excellente question qui pourra profiter à d’autres! Je cherche des conseils et de l'aide auprès de personnes qui ont mis en place des solutions pour résoudre ce problème, pas seulement des idées à essayer.
D'après mon expérience, il existe deux côtés d'une application - le côté "tâche", qui est largement dirigé par un domaine et où les utilisateurs interagissent de manière riche avec le modèle de domaine (le "moteur" de l'application) et le côté rapport, où les utilisateurs obtenir des données en fonction de ce qui se passe du côté de la tâche.
Du côté des tâches, il est clair qu'une application avec un modèle de domaine riche doit avoir une logique métier dans le modèle de domaine et que la base de données doit être principalement utilisée pour la persistance. Séparation des préoccupations, chaque livre est écrit à ce sujet, nous savons quoi faire, génial.
Qu'en est-il du côté des rapports? Les entrepôts de données sont-ils acceptables ou sont-ils de mauvaise conception car ils intègrent la logique métier dans la base de données et les données elles-mêmes? Pour agréger les données de la base de données en données d'entrepôt de données, vous devez avoir appliqué une logique et des règles commerciales aux données, et cette logique et ces règles ne proviennent pas de votre modèle de domaine, mais de vos processus d'agrégation de données. Est-ce faux?
Je travaille sur de grandes applications financières et de gestion de projet où la logique métier est très développée. Lors de la génération de rapports sur ces données, j'aurai souvent beaucoup d'agrégations à effectuer pour extraire les informations requises pour le rapport / tableau de bord, et les agrégations contiennent beaucoup de logique métier. Pour des raisons de performances, je le faisais avec des tables hautement agrégées et des procédures stockées.
Par exemple, supposons qu'un rapport / tableau de bord soit nécessaire pour afficher une liste des projets actifs (imaginez 10 000 projets). Chaque projet nécessitera un ensemble de métriques, par exemple:
- budget total
- effort à ce jour
- taux de combustion
- date d'épuisement du budget au taux de combustion actuel
- etc.
Chacune de celles-ci implique beaucoup de logique métier. Et je ne parle pas seulement de la multiplication de nombres ou d'une simple logique. Je parle pour obtenir le budget, vous devez appliquer une feuille de taux avec 500 taux différents, un pour le temps de chaque employé (sur certains projets, d'autres ont un multiplicateur), l'application des dépenses et toute majoration appropriée, etc. la logique est vaste. Il a fallu beaucoup d’agrégation et d’ajustement des requêtes pour obtenir ces données dans un délai raisonnable pour le client.
Est-ce que cela devrait être exécuté en premier dans le domaine? Qu'en est-il de la performance? Même avec des requêtes SQL directes, ces données me parviennent à peine assez rapidement pour que le client puisse les afficher dans un délai raisonnable. Je ne peux pas imaginer essayer de transmettre ces données au client assez rapidement si je réhydrate tous ces objets de domaine, puis je mélange, compare et agrège leurs données dans la couche d'application ou essaie d'agréger les données dans l'application.
Dans ces cas, il semble que SQL soit efficace pour traiter des données, et pourquoi ne pas l'utiliser. Mais alors vous avez une logique métier en dehors de votre modèle de domaine. Toute modification de la logique applicative devra être modifiée dans votre modèle de domaine et vos schémas d'agrégation de rapports.
Je ne sais vraiment pas comment concevoir la partie rapport / tableau de bord de toute application en ce qui concerne la conception axée sur les domaines et les bonnes pratiques.
J'ai ajouté la balise MVC car MVC est la variante de conception du jour et je l'utilise dans ma conception actuelle, mais je ne peux pas comprendre comment les données de rapport s'intègrent dans ce type d'application.
Je cherche de l'aide dans ce domaine - livres, modèles de conception, mots clés de Google, articles, etc. Je ne trouve aucune information sur ce sujet.
EDIT ET UN AUTRE EXEMPLE
Un autre exemple parfait que j'ai rencontré aujourd'hui. Le client veut un rapport pour son équipe de vente. Ils veulent ce qui semble être une simple métrique:
Quelles sont leurs ventes annuelles pour chaque vendeur?
Mais c'est compliqué. Chaque vendeur a participé à plusieurs opportunités de vente. Certains ont gagné, d'autres non. Dans chaque opportunité de vente, plusieurs vendeurs se voient attribuer chacun un pourcentage de crédit pour la vente par rôle et participation. Imaginez maintenant que vous parcouriez le domaine pour cela ... la quantité de réhydratation d'objets que vous auriez à faire pour extraire ces données de la base de données pour chaque vendeur:
Obtenez tous les
SalesPeople
->
Pour chaque obtenir leurSalesOpportunities
->
Pour chaque obtenir leur pourcentage de la vente et calculer leur montant des ventes
puis additionnez tout leurSalesOpportunity
montant des ventes.
Et c'est une métrique. Ou vous pouvez écrire une requête SQL qui peut le faire rapidement et efficacement et l’accorder pour qu’elle soit rapide.
EDIT 2 - Pattern CQRS
J'ai lu sur le modèle CQRS et, bien que très intriguant, même Martin Fowler a déclaré qu'il n'était pas testé. Alors, comment ce problème a-t-il été résolu dans le passé? Tout le monde a dû faire face à cela à un moment ou à un autre. Qu'est-ce qu'une approche établie ou bien utilisée avec un historique de succès?
Edition 3 - Systèmes de reporting / Outils
Une autre chose à considérer dans ce contexte concerne les outils de reporting. Reporting Services / Crystal Reports, Analysis Services et Cognoscenti, etc. attendent tous des données SQL / base de données. Je doute que vos données soient transmises ultérieurement à votre entreprise. Et pourtant, eux et d’autres comme eux jouent un rôle essentiel dans la génération de rapports dans de nombreux systèmes de grande taille. Comment les données de ces systèmes sont-elles correctement gérées s'il existe même une logique métier dans la source de données de ces systèmes et éventuellement dans les rapports eux-mêmes?