オブジェクト指向設計とデータベース設計
-
05-07-2019 - |
質問
C#で製品販売業者向けのアプリケーションを開発しているとします。
ディストリビューターは、次の3種類のトランザクションを実行します。
(1)インデント
(2)販売
(3)ストック
次のようにクラスを設計しています:
public abstract class Transaction
{
}
public class Indent : Transaction
{
}
public class Sell : Transaction
{
}
public class Stock : Transaction
{
}
これらの3種類の情報を3つの別々のテーブルに保存する場合、DAレイヤーをどのように設計する必要がありますか?
次のような個別のDAクラスを構築する必要があります
(1) IndentDA
(2) SellDA
(3) StockDA
または単一のクラス TransactionDA
で、 as / is
演算子を使用してタイプをチェックすることでCRUD操作を実行しますか?
または他に何ができますか?提案はありますか?
解決
まず、単一クラスTransactionDAを作成し、クラス内で型をチェックしてCRUD操作を実行すると、オープン/クローズの原則なので、絶対にその道をたどりません。
DALを構築する方法の提案については、このトピックについて私が考えていることよりもはるかに賢い人々に関するいくつかのブログ投稿に従うことをお勧めします。
リポジトリis Dead:Long Live Repository
Night of the Living Repositories
会話は継続していると思いますが、それで始められるはずです。
他のヒント
NHibernateなどのORMを使用し、マルチテーブル継承機能を使用するので、自分で心配する必要はありません。
ここでは、エンティティサブタイプを使用します。トランザクション用のテーブルを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
)
データが3つの個別のテーブルに送られることがわかっている場合、通常は3つの個別のDAクラスがあります。
ただし、テーブルがほぼ同じ場合は、TransactionDAを汎用化し、データレイヤーを簡素化できます。大量のトランザクションが発生し、テーブルを別のファイルなどに分割することがわかっている場合にのみこれを行います。そうでない場合は、単純化してすべてを結合します。
すべての個別のトランザクションタイプが極端に類似している場合を除き、TransactionDAを作成しようとしないでください。
依存性注入を使用して、それぞれにDAクラスを作成し、CRUD操作で同じインターフェイスITransactionDAをすべて実装させることができます。
public interface ITransactionDA
{
void Read();
void Update();
...
}
public class StockDA : ITransactionDA
{
//implement interface methods
}
Stock stock = new Stock(new StockDA());
そのようなことをします
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
{
}
4つのデザインパターンのギャングをご覧ください。