OO Design vs Database Design
-
05-07-2019 - |
Question
Supposons que je développe une application pour un distributeur de produits en C #.
Le distributeur effectue les 3 types de transaction suivants:
(1) retrait
(2) Vendre
(3) Actions
Je conçois mes cours comme suit:
public abstract class Transaction
{
}
public class Indent : Transaction
{
}
public class Sell : Transaction
{
}
public class Stock : Transaction
{
}
Maintenant, si je veux enregistrer ces trois types d'informations dans trois tableaux distincts, comment dois-je concevoir ma couche DA?
Devrais-je créer des classes DA distinctes, comme
(1) IndentDA
(2) SellDA
(3) StockDA
ou une seule classe TransactionDA
et effectuez des opérations CRUD en vérifiant leurs types à l'aide d'opérateurs en tant que / est
?
Ou que puis-je faire d'autre? Des suggestions?
La solution
Premièrement, si vous avez créé une classe unique, TransactionDA, et vérifié les types dans la classe pour effectuer des opérations CRUD, vous violeriez le Principe d'ouverture / fermeture , je ne voudrais donc absolument pas emprunter cette voie.
En ce qui concerne les suggestions sur la manière de construire votre DAL, je vous suggérerais de suivre quelques articles de blog sur des personnes beaucoup plus intelligentes que moi sur ce qu'ils pensent de ce sujet.
Le référentiel est le nouveau Singleton
Référentiel est mort: référentiel Long Live
Référentiels La nuit des vivants
La conversation se poursuit, je crois, mais cela devrait vous aider à démarrer.
Autres conseils
Je voudrais utiliser un ORM tel que NHibernate, utiliser ses capacités d'héritage multi-tables et ne pas avoir à m'en soucier moi-même.
Je voudrais utiliser les sous-types d'entité ici. Créez un tableau pour les transactions (et, comme l'a dit une affiche précédente, un terme différent serait peut-être mieux) et stockez tout ce qui y est commun. Créez ensuite un " sous-type " tableau pour chaque spécialisation. Ces tables de sous-types doivent avoir la même clé primaire que la table principale (l'entité "forte") et les champs propres à cette spécialisation particulière. Chaque sous-type est lié à l'entité forte de manière individuelle, avec une participation facultative sur l'extrémité du sous-type et une participation requise sur l'extrémité de l'entité forte.
Ensuite, pour faciliter l'interrogation, définissez une vue (externe) qui associe l'entité forte à tous ses sous-types d'entité afin que vous puissiez facilement "consulter". tout.
Voici un exemple simple (et courant) sur la façon de configurer ceci:
create table Employee (
eid int primary key,
first_name text,
last_name text not null
)
create table Salaried (
eid int primary key,
annualSalaryUSD money not null
)
create table Hourly (
eid int primary key,
hourlyRateUSD money not null
)
Si vous savez que vos données sont classées dans trois tables distinctes, il me faudrait normalement trois classes DA distinctes.
Toutefois, si vos tables sont à peu près identiques, vous pouvez alors générer un générique TransactionDA et simplifier votre couche de données. Je ne le ferais que si vous saviez que le volume de vos transactions serait élevé et que vous diviseriez vos tables en différents fichiers ou quelque chose du genre, sinon je simplifierais probablement les choses et tout combinerais.
N'essayez pas de créer un compte TransactionDA à moins que tous vos types de transaction ne soient extrêmement similaires.
Vous pouvez utiliser l'injection de dépendance, créer une classe DA pour chacune d'elles et les faire implémenter avec la même interface ITransactionDA avec vos opérations CRUD.
public interface ITransactionDA
{
void Read();
void Update();
...
}
public class StockDA : ITransactionDA
{
//implement interface methods
}
Stock stock = new Stock(new StockDA());
Je vais faire quelque chose comme ça
public abstract class DistributerTransaction
{
DistributerDA dataaccess;
}
public class Indent : DistributerTransaction
{
}
public class Sell : DistributerTransaction
{
}
public class Stock : DistributerTransaction
{
}
public abstract class DistributerDA
{
/*Read();
Update();*/
}
public class IndentDA : DistributerDA
{
}
public class SellDA : DistributerDA
{
}
public class StockDA : DistributerDA
{
}
Découvrez le Gang de 4 modèles de conception .