Est la création d'un « enregistrement fictif » à la force des données de base Obey la logique métier, une bonne idée ou un sourd-muet?

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

Question

Dans certains projets, je vois qu'il faut un enregistrement fictif pour créer dans Db afin de garder le feu de la logique métier sans briser les contraintes Db.

Jusqu'à présent, je l'ai vu son utilisation de 2 façons:

  • En ajoutant un champ comme IsDummy
  • En ajoutant un champ quelque chose appelé TypeObjet qui indique un type: Dummy

Ok, il est utile sur ce qui doit être atteint.

Mais ce qui me fait sentir alerte sur ces solutions est parfois vous devez garder à l'esprit que certains enregistrements fictifs existent dans l'application qui doit être traitée dans certains processus. Sinon, vous faites face à des problèmes jusqu'à ce que vous vous rendez compte de leur existence ou jusqu'à ce que quelqu'un dans l'équipe vous dit « Aha! Vous avez oublié les dossiers fictifs. Vous devez également faire ... »

La question est: Est-ce une bonne idée de créer des enregistrements fictifs pour maintenir la logique métier car il est sans se plaindre Db? Si oui, quelle est la meilleure pratique pour empêcher les développeurs de sauter leur existence? Sinon, qu'est-ce que vous faites pour vous empêcher de tomber dans une situation où vous vous retrouvez avec une seule option de création d'un enregistrement factice?

Merci!

Était-ce utile?

La solution

Utilisation des enregistrements fictifs est inférieur à obtenir les contraintes à droite.

Il y a souvent une tentation de les utiliser parce que l'utilisation des enregistrements fictifs peut sembler le meilleur moyen de fournir une nouvelle fonctionnalité (et peut-être il est parfois), mais ils ne font jamais partie d'un bon conception, parce qu'ils se cachent des différences entre votre logique de domaine et le modèle de données.

Autres conseils

enregistrements fictifs ne sont nécessaires que lorsque le modélisateur ne peut pas facilement changer la définition de base de données, ce qui signifie que la définition et / ou le modèle de données est assez mauvaise. On ne devrait jamais se retrouver dans une situation où il doit y avoir un code spécial dans la couche d'application pour traiter les cas particuliers dans la base de données. C'est un cauchemar d'entretien garanti.

Toute bonne définition ou modèle permettra des changements facilement, sans « affecter le code existant ».

Toutes la logique métier [qui est défini dans la base de données] devrait être mis en œuvre en utilisant des contraintes ANSI SQL, contrôles et règles. (Bien sûr, les structures de niveau inférieur sont déjà limités par Domaines / types de données, etc., mais je ne les classer comme des « règles métier ».) Je me assure que je ne finis pas avoir à mettre en œuvre des mannequins, simplement en faisant cela.

Si cela ne peut se faire, le modélisateur manque de connaissances et d'expérience. Ou les exigences de niveau supérieur telles que la normalisation, ont été brisées, et qui présente des obstacles à la mise en œuvre des contraintes qui en dépendent; ce qui signifie aussi le modeleur a échoué.

J'ai jamais eu besoin de briser ces contraintes, ou ajouter des enregistrements factices (et je travaille sur un très grand nombre de bases de données). J'ai enlevé dummy dossiers (et les doublons) quand je l'ai retravaillé les bases de données créées par d'autres.

Je ne l'ai jamais courir à travers avoir à faire. Si vous avez besoin de le faire, il y a quelque chose de mal avec votre structure de données, et il va causer des problèmes plus bas dans la ligne de rapports ...

Utilisation Dummies est muet.

En général, vous devriez viser à obtenir votre droit logique sans eux. Je les ai vus utilisés aussi, mais seulement comme une solution d'urgence. Votre description semble trop peu comme ce qui en fait une pratique courante. Cela causerait plus de problèmes qu'elle en résout.

La seule raison pour laquelle je peux voir pour ajouter des enregistrements « factices » est quand vous avez une conception d'application et base de données sérieusement mauvaise.

Il est certainement pas une pratique courante.

Si votre logique métier dépend d'un enregistrement existant, vous devez faire une des deux choses: soit vous assurer qu'un enregistrement CORRECT est créé avant l'exécution de cette logique; ou, changer la logique de prendre les informations manquantes en compte.

Je pense que toute situation où quelque chose n'est pas très facilement identifiable en tant que « logique métier » est une cause pour essayer de penser à une meilleure façon.

Le fait que vous mentionnez « qui indique un type: factice » conduit moi à croire que vous utilisez une sorte de ORM pour traiter votre accès aux données. Un très bon point de contrôle (mais pas la seule) des solutions ORM NHibernate comme est que votre code source décrit très EXPLICITE vos structures de données au volant de votre application. Cela permet non seulement votre accès aux données à gérer facilement sous le contrôle de la source, mais il permet également de faciliter le débogage la ligne devrait se produire un problème (et avouons-le, ce n'est pas une question de si un problème se produira, mais quand).

Lorsque vous présentez une sorte de « béquille » comme un disque factice, vous ne tenez pas compte du point d'une base de données. Une base de données est là pour faire respecter les règles par rapport à vos données, dans un effort pour éliminer la nécessité de ce genre de chose. Je vous recommande de jeter un oeil à votre logique de la première application, avant de recourir à ce genre de technique. Pensez à votre compagnon de dev de, ou une nouvelle location. Que faire s'ils ont besoin d'ajouter une fonctionnalité et d'oublier votre petite logique « record factice »?

Vous vous mentionnez dans votre appréhension sentiment de question. Allez avec votre intestin. Débarrassez-vous des enregistrements fictifs.

Je dois aller avec le sentiment commun ici et argumenter contre des enregistrements fictifs.

Qu'est-ce qui va se passer est qu'un nouveau développeur ne saura pas sur eux et pas le code pour les manipuler ou supprimer une table et d'oublier d'ajouter dans un nouvel enregistrement factice.

Je les ai connu dans les bases de données existantes et ont vu les deux mentionnés ci-dessus se produire.

En outre plus ils existent plus il est difficile de les faire sortir et plus de code que vous devez écrire pour tenir compte de ces enregistrements fictifs qui auraient probablement pu être retirées si vous venez de faire la conception originale sans eux.

La bonne solution serait de mettre à jour votre logique métier.

Pour citer votre explication élargie:

Supposons que vous avez un objet Package et vous avez mettre en œuvre une logique métier qu'un paquet sans aucun contenu ne peut pas être créé. Vous avez créé des règles de la couche d'affaires et conçu votre Db avec des contraintes pertinentes. Mais après quelques années, une nouvelle fonctionnalité est demandée et d'accomplir que vous devez être en mesure de créer un package sans contnent. Pour remédier à cela, vous décidez de créer un contenu factice qui n'est pas visible sur l'interface utilisateur, mais vous permet de créer un package vide.

Donc à un moment donné à un ensemble w / o contenu était invalide ainsi la couche d'affaires appliquée existence de contenu dans un objet de package. Ça a du sens. Maintenant, si le scénario monde réel a changé tel, il est maintenant nécessaire VALIDE raison de créer des objets Package sans contenu, il est la couche logique métier qui doit être changé.

Presque universellement en utilisant quoi que ce soit partout « factice » est une mauvaise idée et indique généralement un problème dans la mise en œuvre. Dans ce cas, vous utilisez des données fictives pour permettre la « conformité » avec une couche d'affaires qui ne représente plus précisément les contraintes du monde réel de l'entreprise.

Si package sans contenu n'est pas valide, les données factices pour permettre la « conformité » avec la couche d'affaires est un hack stupide. Essentiellement vous avez écrit des règles pour protéger votre propre système et alors comment essayer de contourner votre propre protection. D'autre part si l'emballage sans contenu est la couche d'affaires alors valable ne doit pas être appliquer des contraintes fausses. Dans aucun cas sont des données fictives valide.

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