7

J'ai appliqué des règles métier à la fois dans mon niveau d'application (modèles) et dans mon niveau de base de données (procédures stockées qui génèrent des erreurs).Les règles métier doivent-elles être appliquées à la fois au niveau application et au niveau base de données, ou seulement à l'un des deux?

J'ai double emploi avec mes validations dans les deux endroits pour quelques raisons:

  1. Si les conditions changent entre quand ils sont contrôlés dans le code d'application et quand ils sont vérifiés dans la base de données, les contrôles de règles métier dans la base de données permettront d'économiser la journée. La base de données me permet également de verrouiller divers enregistrements d'une manière plus simple que dans mon code d'application, il semble donc naturel de le faire ici.
  2. Si nous avons faire des données par lots insertions/mises à jour de la base de données directement, si je voie toutes ces opérations par mes procédures/fonctions stockées qui faites la règle de gestion de validation, il n'y a aucune chance de moi mettre dans les mauvaises données même si je n'ai pas les protections que j'obtiendrais si je faisais une seule entrée à travers l'application.
  3. Alors que l'application de ces choses que dans la base aurait le même effet sur les données réelles, il semble inconvenant de simplement jeter des données à la base de données avant d'abord une bonne effort pour valider sa conformité à contraintes et règles métier.

Quel est le bon équilibre?

Répondre

6

Vous devez appliquer au niveau des données pour garantir l'intégrité des données. C'est votre dernière ligne de défense, et c'est le travail des DB, pour aider à renforcer sa vision du monde des données. Cela dit, lancer des données indésirables sur le DB pour la validation est une technique grossière. Typiquement, les erreurs sont conçues pour être lisibles par l'homme plutôt que lisibles par une machine, il est donc inefficace pour le programme de traiter l'erreur à partir de la base de données et d'en faire sortir les têtes ou les queues.

Les procédures stockées sont différentes. À l'époque, les procédures stockées étaient la façon de gérer les règles métier sur les niveaux de données, etc.

Mais aujourd'hui, avec les environnements de serveurs d'applications modernes, ils sont devenus, en général, un meilleur endroit pour mettre cette logique. Ils offrent plusieurs façons d'accéder aux données et de les exposer (le Web, les services Web, les protocoles distants, les API, etc.). En outre, si vos règles sont lourdes pour le processeur (la plupart ne le sont probablement pas), il est plus facile de faire évoluer les serveurs d'applications que les serveurs de base de données. La grande variété de fonctionnalités au sein des serveurs d'application leur donne une flexibilité au-delà de ce que les serveurs de base de données peuvent faire, et donc une grande partie de ce qui a été réinjecté dans les DB est retirée. persistance bête ". Cela dit, il y a certainement des avantages de performance en utilisant Stored Procs et autres, mais maintenant c'est un réglage où la question devient "vaut-il la peine de perdre la capacité du serveur d'applications pour le gain que nous obtenons au serveur DB ".

et par serveur d'applications, je ne suis pas simplement parler de Java, mais .NET et même PHP etc.

+0

Quelle est la différence entre l'application de la logique métier et l'application de l'intégrité des données? Supposons que j'ai une règle d'entreprise qui dit au plus 3 personnes peuvent être assignées à un superviseur. Lorsque je vais insérer la personne n ° 4, est-ce un échec, car il s'agit d'une erreur d'intégrité des données de plus de trois personnes par superviseur ou s'agit-il d'une violation des règles métier? Sans verrouiller l'enregistrement du superviseur avant la vérification qu'il y a au plus 2 personnes sous un superviseur lors d'une insertion, comment le code de l'application peut-il être sûr à 100% que cette règle ne sera pas brisée? –

+0

@Rednerln - taux de variation. Les règles d'intégrité de la base de données sont susceptibles d'être vraies pendant beaucoup plus longtemps que les règles métier. Votre exemple de personnes à un superviseur, j'aurais du mal à justifier de faire une contrainte de base de données, si je le faisais, cela devrait être basé sur des données (udf basé sur un paramètre de configuration). Et si la règle change, il faut se demander ce qu'il faut faire à propos des données qui violent ce principe. Généralement, vous voulez des règles de base de données qui ne sont que relaxées, pas resserrées ou modifiées qualitativement. –

+0

@Rednerln - dans des situations multimodales, vous voulez que les gens puissent toucher votre couche d'accès DB (vues, peut-être) avec leurs outils de BI ou autre et sachez que leurs hypothèses sont valides, que la base de données est cohérente et intègre périmètre. –

2

Votre logique métier peut asseoir dans ces deux endroits, mais ne devrait pas être dans les deux. La logique ne doit pas être dupliquée car il est facile de faire une erreur en essayant de garder les deux synchronisés. Si vous le mettez dans le modèle, vous souhaiterez que tous les accès aux données passent par vos modèles, y compris les mises à jour par lots.

Il y aura des compromis pour le mettre dans la base de données contre les modèles d'application (voici quelques-unes des haut de ma tête):

  • bases de données peuvent être plus difficiles à maintenir et mettre à jour que les applications
  • il est plus facile de répartir la charge si elle est dans le niveau d'application
  • multiples, disparates peuvent dbs exiger des règles commerciales de séparation (qui peut ne pas être possible)
3

Si la règle doit être imposée à tout moment, peu importe d'où proviennent les données ou comment elles ont été mises à jour, la base de données est là où elle doit être. Rappelez-vous que les bases de données sont affectées par l'interrogation directe pour apporter des modifications qui affectent de nombreux enregistrements ou pour faire quelque chose que l'application ne ferait pas normalement. Ce sont des choses comme la fixation d'un groupe d'enregistrements lorsqu'un client est racheté par un autre client et qu'ils veulent changer toutes les données historiques, l'application de nouveaux taux d'imposition aux commandes non encore traitées, la fixation d'un mauvais intrants. Ils sont également affectés parfois par d'autres applications qui n'utilisent pas votre couche de données. Ils peuvent également être affectés par des importations exécutées via des programmes ETL qui ne peuvent pas non plus utiliser votre couche de données. Donc, si la règle doit dans tous les cas être respectée, elle doit figurer dans la base de données.

Si la règle s'applique uniquement à des cas particuliers concernant le fonctionnement de cette page d'entrée particulière, elle doit figurer dans l'application. Donc, si un responsable des ventes n'a que des choses spécifiques à faire depuis son interface utilisateur, ces choses peuvent être spécifiées dans l'application.

Quelque chose qu'il est utile de faire dans les deux endroits. Par exemple, il est stupide de permettre à un utilisateur de mettre une non-date dans une boîte de saisie qui se rapportera à un champ de date. Le type de données dans la base de données doit toujours être un type datetime, mais il est préférable de vérifier certaines de ces données avant de les envoyer.