Conception de la base de données sur le domaine de la base de données sur la base de données pour une application Web MVC

StackOverflow https://stackoverflow.com//questions/10684854

Question

Je développe / convertissant une application de formulaires Web existants en une application totalement nouvelle MVC. L'expansion est à la fois en termes de technologie ainsi que de cas d'utilisation commerciale. L'application héritée est une conception de base de données bien faite (DBDD). Donc, par ex. Si vous avez des types d'employés différents tels que l'opérateur, le superviseur, le gardien du magasin, etc. et vous devez ajouter un nouveau type, vous allez simplement ajouter des lignes dans quelques tables et voilà, votre UI a automatiquement tout pour ajouter / mettre à jour le nouveau type d'employé. Cependant, la séparation des couches n'est pas si bonne.

Le nouveau projet a deux objectifs principaux

  • Extensibilité (pour les exigences de pipeline actuellement et futures)
  • performance

    J'ai l'intention de créer le nouveau projet Remplacement de la conception basée sur la base de données (DBDD) avec une conception dirigée par un domaine (DDD) en tenant compte de l'exigence d'extensibilité. Toutefois, passer d'une conception pilotée par une base de données à la conception axée sur le domaine semble avoir une incidence inversement sur l'exigence de performance si je le comparais à la performance de l'application Legacy DBDD. Dans l'application héritée, tout appel de données de l'interface utilisateur interagirait directement avec la base de données et toutes les données seraient renvoyées sous forme de digne d'information ou (dans certains cas) un jeu de données.

    Maintenant avec un DDD strict en place, tout appel de données sera acheminé via la couche d'entreprise et la couche d'accès aux données. Cela signifierait que chaque appel initialiserait un objet métier et un objet d'accès aux données. Une seule page d'interface utilisateur peut avoir besoin de différents types de données, ce qui étant une application Web que chaque page pourrait être demandée par plusieurs utilisateurs. Aussi une application Web MVC étant apatride, chaque demande nécessiterait d'initialiser les objets d'entreprise et les objets d'accès aux données chaque fois. Il semble donc que la DBDD soit préférable à la DBDD de DDD pour la performance.

    ou une manière dans le DDD pour atteindre les deux, extensibilité que DDD fournit et performance que DBDD fournit?

Était-ce utile?

La solution

Avez-vous considéré comme une forme de séparation de la requête de commande où les mises à jour sont à l'aide du modèle de domaine, mais se lit comme DataReader?DDD soufflé complet n'est pas toujours approprié.

Autres conseils

"Maintenant, avec un DDD strict en place, tout appel de données sera acheminé via la couche d'entreprise et la couche d'accès aux données."

Je ne crois pas que cela soit vrai, et ce n'est certainement pas pratique. Je crois que cela devrait lire:

Maintenant avec Strict DDD en place, tout appel à une transaction sera acheminé via la couche d'entreprise et la couche d'accès aux données.

Il n'y a rien qui dit que vous ne pouvez pas appeler directement la couche d'accès aux données afin de récupérer les données à afficher à l'écran. Ce n'est que lorsque vous devez modifier les données que vous devez appeler votre modèle de domaine conçu en fonction de son comportement. À mon avis, il s'agit d'une distinction clé. Si vous parcourez tout dans votre modèle de domaine, vous aurez trois problèmes:

  1. temps - il vous mènera beaucoup plus longtemps pour mettre en œuvre des fonctionnalités, sans avantage.
  2. Modèle Design - Votre modèle de domaine sera plié de la forme afin de répondre aux besoins des besoins plutôt que du comportement.
  3. Performances - non pas à cause d'une couche supplémentaire, mais que vous ne pourrez pas obtenir les données agrégées de votre modèle aussi rapidement que possible directement d'une requête. I.e. Considérez la valeur totale de toutes les commandes passées à un client particulier - c'est beaucoup plus rapide pour écrire une requête pour cela que d'aller chercher toutes les entités de commande pour le client, itérer et résumer.

    Comme ChreeYre2000 a mentionné, les CQRS vise à résoudre ces problèmes exacts.

L'utilisation de DDD ne doit pas avoir d'implications de performance significatives dans votre scénario.Ce que vous craignez de ressembler davantage à un problème d'accès aux données.Vous vous référez comme

initialiser un objet métier et un objet d'accès aux données

Pourquoi "initialiser" est-il cher?Quels mécanismes d'accès aux données utilisez-vous?

DDD avec des objets de longue durée stockée dans une base de données relationnelle est généralement implémentée avec orm. si utilisé correctement , ORM aura très peu, le cas échéant, sur l'impact sur la performance de la plupart des applications.Et vous pouvez toujours récupérer les parties les plus sensibles à la performance de l'application à SQL cru s'il existe un goulot d'étranglement éprouvé.

Pour ce qu'il vaut, NHibernate n'a besoin que d'être initialisé une fois sur le démarrage de l'application, après cela, il utilise le même pool de connexions Ado.net comme lecteurs de données réguliers.Donc tout se résume à une cartographie appropriée, à récupérer la stratégie et à éviter les erreurs d'accès aux données classiques telles que 'N + 1 sélectionne'.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top