1

私は次のような状況にあります

ここに画像の説明を入力してください

1つのPurchaseOrderには多くのラインアイテムがあり、1つのInvoiceには多くのラインアイテムがあります。 PurchaseOrderInvoiceはかなり異なります。特定のものがある場合はLineItemそうPuchaseOrderではなく、Invoiceその逆も同様です。私はこれらの関係を維持する必要があります。私のアプリではNHibernateを使用しています。

データベースについて考えたところ、LineItemsテーブルには、PurchaseOrderの外部キーを持つ列と、Invoiceの外部キーを持つ別の列があります。

このための最良のアプローチは何ですか?

4

3 に答える 3

1

NHibernateマッピングは、使用する外部キーを識別できるため、アプローチは正常に機能します。このアプローチの唯一の欠点は、常にnullデータを含む列を故意に作成することです。

別の方法は、1つの外部キー列と1つの弁別子列を持つことです。ただし、これはリレーショナルモデルの観点からはよりクリーンな場合がありますが、NHibernateマッピングはより複雑になります。

于 2013-03-26T19:28:09.800 に答える
0

2つの列が相互に除外されているだけなので、提案するソリューションが最適です。LineItemがPurchaseOrderまたはInvoiceに属しており、PurchaseOrderLineItemまたはInvoiceLineItemに固有の他のデータがないことを意味します。

オブジェクトクラスと一種の継承に近いデータベーステーブルを処理したい場合は、EAVモデルがありますが、あなたの場合は過剰に設計されているようです。

エンティティ属性値データベースと厳密なリレーショナルモデルのeコマース

于 2013-03-26T19:45:47.283 に答える
0

モデル

LineItemを階層としてマップできます。

LineItem階層

public class LineItem
{
   //common properties of LineItem
}

public class PurchaseLineItem : LineItem 
{
     public PurchaseOrder PurchaseOrder { get; set; }
}

public class InvoiceLineItem : LineItem 
{
     public Invoice Invoice { get; set; }
}

特定の子を参照するようにPurchaseOrderとInvoiceを変更します

注文書 :

public class PurchaseOrder
{
    public IList<PurchaseLineItems> LineItems { get; set; }
}

請求書 :

public class Invoice
{
   public IList<InvoiceLineItems>  LineItems { get; set; }
}

データベース

データベース側では、2つのアイテムを異なるテーブルにマッピングすることを検討できますが、これにより結合が不必要に増加します。型判別子を使用して、階層全体に単一のテーブルを採用できます。

  1. 特定のクラスは、どちらのホルダーがnull許容であるかについてのコードの残りの部分での混乱を回避し、読みやすさを向上させるのに役立ちます。LineItemPurchaseOrderInvoice
  2. PurchaseOrderにパラメーターとしてPurchaseLineItem(同様InvoiceにのコンストラクターパラメーターとしてInvoiceLineItem)追加して、これらのエンティティがそれぞれのホルダーなしで初期化されないようにすることで、設計を改善することもできます。
于 2013-03-26T20:06:14.597 に答える