2009-06-16 10 views
5

C#で製品ディストリビュータのアプリケーションを開発しているとします。OO設計とデータベース設計

販売代理店は、取引の以下の3種類を行います。

を(1)インデント

(2)

(3)株式

を売る、次のように私は私のクラスを設計しています:

public abstract class Transaction 
{ 
} 

public class Indent : Transaction 
{ 
} 

public class Sell : Transaction 
{ 
}  

public class Stock : Transaction 
{ 
} 

ここで、これらの3つのタイプを保存したい場合3つの別々のテーブルに編成したら、どのようにDA層を設計すればよいですか?

は私が

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

または単一のクラスTransactionDAのような独立したDAクラスを構築し、as/is演算子を使って、自分のタイプをチェックしてCRUD操作を実行する必要がありますか?

他に何ができますか?助言がありますか?

+4

エンティティ名としてTRanasctionを使用しません。混乱につながる可能性があります... –

+0

DAクラスのメソッドがどれほど似ているかによって異なります。あなたはどのような方法をDAで使用していますか? – Paco

答えて

5

最初に、1つのクラスのTransactionDAを作成し、CRUD操作を実行するクラス内の型をチェックした場合、Open/Closed Principleに違反するため、そのパスを辿ることは間違いありません。

あなたのDALを構築する方法についての提案として、私は彼らがこのトピックについて考えていることよりもはるかに賢い人のブログ記事をいくつかフォローすることをお勧めします。

Repository is the new Singleton

Repository is Dead: Long Live Repository

Night of the Living Repositories

会話は続けて、私は信じているが、それはあなたが始める必要があります。

2

データが3つのテーブルに分かれていることが分かっている場合は、通常は3つの別々のDAクラスがあります。

しかし、テーブルがほぼ同じであれば、TransactionDAを汎用化してデータレイヤーを単純化することができます。私はあなたが大量のトランザクションを持ち、あなたのテーブルを別のファイルや別のものに分けることになることを知っている場合にのみこれを行うでしょう。そうしないと、物事を単純化し、すべてを組み合わせるでしょう。

個別のトランザクションタイプがすべてで、極端にの場合を除き、TransactionDAを作成しようとしないでください。

2

依存性注入を使用して、それぞれにDAクラスを作成し、それらがすべてCRUD操作で同じインタフェースITransactionDAを実装するようにすることができます。

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

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

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

ここでエンティティサブタイプを使用します。トランザクションのテーブルを1つ作成します(以前のポスターが言ったように、おそらく別の用語が良いでしょう)。そこに共通するすべてのものを保存します。次に、各専門分野ごとに1つの「サブタイプ」テーブルを作成します。これらのサブタイプテーブルは、メインテーブルと同じ主キー(「強い」エンティティ)と、その特定の専門分野に固有のフィールドを持つ必要があります。各サブタイプは強固なエンティティと1対1の方法で関連し、サブタイプの終了にはオプションで参加し、強力なエンティティの終了には必須の参加となります。

次に、問合せを簡単にするために、(外部)がすべてのエンティティ・サブタイプと強力なエンティティを結合し、すべてを簡単に「参照」できるビューを定義します。

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

は、私は、このようなNHibernateのようORMを使用して、それはだ使用すること

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

ような何かを行うことになります。ここではこの設定方法の簡単な(共通)の例だ

マルチテーブル継承機能を使用して、それ自体について心配する必要はありません。