2009-06-16 13 views
5

Supongamos que estoy desarrollando una aplicación para un distribuidor de productos en C#.OO Design vs Database Design

El distribuidor los siguientes 3 tipos de transacciones:

(1) La letra

(2) Vender

(3) de la

Estoy diseñando mis clases de la siguiente manera:

public abstract class Transaction 
{ 
} 

public class Indent : Transaction 
{ 
} 

public class Sell : Transaction 
{ 
}  

public class Stock : Transaction 
{ 
} 

Ahora si quiero guardar estos tres tipos de en formación en tres tablas separadas, ¿cómo debería diseñar mi capa DA?

Debo construir clases separadas DA como

(1) IndentDA 
(2) SellDA 
(3) StockDA 

o una sola clase TransactionDA y realizar operaciones CRUD comprobando sus tipos mediante el uso de as/is operadores?

¿O qué más puedo hacer? ¿Alguna sugerencia?

+4

No utilizaría TRanasction como nombre de entidad; podría generar confusión ... –

+0

Depende de cuánto son similares los métodos en las clases DA. ¿Qué métodos usas en los DA? – Paco

Respuesta

5

En primer lugar, si creó una clase única TransactionDA y comprobó los tipos dentro de la clase para realizar operaciones CRUD, estaría violando el Open/Closed Principle, así que definitivamente no seguiría por ese camino.

En cuanto a las sugerencias sobre cómo lograr la construcción de su DAL, sugiero seguir algunas publicaciones en el blog sobre personas mucho más inteligentes que yo sobre lo que piensan sobre este tema.

Repository is the new Singleton

Repository is Dead: Long Live Repository

Night of the Living Repositories

La conversación continúa, creo, pero que debería empezar.

2

Si sabe que sus datos van en tres tablas separadas, entonces normalmente tendría tres clases DA diferentes.

Sin embargo, si sus tablas son prácticamente iguales, puede genérico TransactionDA y simplificar su capa de datos. Solo haría esto si sabe que tendrá un gran volumen de transacciones y separará sus tablas en diferentes archivos o algo así, de lo contrario, probablemente simplifique las cosas y lo combine todo.

No intente crear una TransactionDA a menos que todos sus tipos de transacciones independientes sean extremadamente similares.

2

Puede usar la inyección de dependencia, crear una clase DA para cada una y hacer que todas implementen la misma interfaz ITransactionDA con sus operaciones CRUD.

public interface ITransactionDA 
{ 
    void Read(); 
    void Update(); 
... 
} 

public class StockDA : ITransactionDA 
{ 
    //implement interface methods 
} 

Stock stock = new Stock(new StockDA()); 
3

Yo usaría subtipos de entidades aquí.Cree una tabla para las transacciones (y, como dijo un cartel anterior, quizás un término diferente sería mejor) y almacene todo lo que es común allí. Luego crea una tabla de "subtipo" para cada especialización. Estas tablas de subtipo deben tener la misma clave principal que la tabla principal (la entidad "fuerte") y los campos que son exclusivos de esa especialización en particular. Cada subtipo está relacionado con la entidad fuerte de forma individualizada, con participación opcional en el subtipo final y participación requerida en el extremo de la entidad fuerte.

Luego, para facilitar las consultas, defina una vista que (externa) se una a la entidad fuerte con todos los subtipos de entidades para que pueda "ver" todo fácilmente.

He aquí una simple (y común) ejemplo de cómo configurar esto:

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 
) 
0

voy a hacer algo así

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 
{ 
} 
3

me gustaría utilizar un ORM como NHibernate y utilizarlo es capacidades de herencia multi-tabla y luego no tener que preocuparse por eso yo mismo.