2012-05-31 7 views
7

私は古いパズルを持っているので、私はあなたとそれを共有すると思った、正しい方向を得ることができるかもしれません。 データベース内のいくつかのエンティティは非常に大きく(多くのプロパティを持っています)、ビジネスロジックがすべてのエンティティプロパティを使用することはめったにないため、ビジネスロジックが正しく動作するためにロードするプロパティを考える必要があるたびにあります。非常に架空のサンプル。エンティティが多すぎますか?

public class Product 
{ 
    public string Title {get;set;} 
    public string Description {get;set;} 

    public string RetailPrice {get;set;} 
    public string SupplierId {get;set;} 

    public Supplier Supplier { get;set;} 

    // many other properties 
} 

public class ProductDiscountService 
{ 
    public decimal Get(Product product) 
    { 
     // use only RetailPrice and Supplier code 
     return discount; 
    } 
} 

public class ProductDescriptionService 
{ 
    public string GetSearchResultHtml(Product product) 
    { 
     // use only Title and Description 
     return html; 
    } 
} 

私はそれらの各インターフェイスを実装小さいのDTOを作成し、これらのインタフェースを実装するようインターフェースIDiscountProductとISearchResultProduct、マーク生成物を抽出ことができように見えますが、それはやり過ぎのように一瞬で見えます(少なくとも私は誰もインターフェイスを使用してプロパティをグループ化するのを見ていない)。

データベース内のエンティティをより小さなエンティティに分割することは、これらのプロパティがすべて製品に属しているため、妥当ではありません。何かを選択するために多くの結合を使用することを余儀なくされます。一部のプロパティは別のエンティティに属し、その移動は実装するのが非常に困難です。

特定のメソッドのビジネスロジックで使用されるすべてのプロパティをメソッドパラメータとして持つことは、悪い解決策のように見えます。

+0

いくつのプロパティについて話していますか? – walther

+0

通常は10以上20未満です。 – Giedrius

+0

私は、あなたのメソッドが使用するプロパティを事前に知っていて、これが固定されていると、パラメータを使うことは良い解決策かもしれません。テストが簡単で、再利用が簡単です。ただし、実装がメソッドシグネチャで定義されていない場合(現在の実装では2つのプロパティが使用されていますが、明示的には3になる可能性があります)、すべてのプロパティを使用できるようにProduct全体を消費します。これは一貫した方法で話します:この方法はこれらのパラメータを必要とし、この方法は製品を必要とします。 – Polity

答えて

1

プロパティが大きい(長い文字列やバイナリを読み込む)場合を除いて、それらをすべてロードするだけです。以下

ポイントは、単純なプロパティ(タイトル)

  1. ない余分なコード(タイトルだけでこの製品を入手、価格だけで、何とか、何とかしてもらう)
  2. 製品インスタンスが常にあるためです完全であるため、プロパティがnullであるかどうかを確認せずに渡すことができます。
  3. 他のプロパティを遅延ロードする必要がある場合は、それらを熱心に読み込むよりも多くの費用がかかります。 20個のプロパティがある場合、これは大きなオブジェクトでもありません(また、仮説的なDescriptionプロパティのサイズがキロバイトでない場合)。

ここで、関連するオブジェクト(ProductSupplier)がある場合、このプロパティが使用されることがわかっている場合を除き、これは遅延ロードされます。

+0

実際のプロジェクトの説明はhtmlですので、数キロバイトが通常です。もう1つのことは、ビジネスモデルの性質上、大量の製品(数千個)を処理することが多いため、クエリの数が多いために遅延ロードが受け入れられないということです。だからあなたが何千もの製品とキロバイトのプロパティを持っていれば、データベースからロードすることは非常に重要になります:)私は、書き込みよりもはるかに多くの読み込みがある限り、reddisのようないくつかの高速読み込みストレージを配置することを考えていました。 – Giedrius

+0

処理のタイプによって異なります。過去に大量のデータを処理しなければならないときに、メモリにロードしてそこから作業しましたが、そのセットは読み取り専用でした。そのソリューションを削除してデータベースに戻ってしまいました。とにかく、あなたのケースでは、実際にどのくらい頻繁にプロパティを必要としているのか、それらを熱心に読み込むことの実際の影響は何かを測定すると思います。私はまだレコードごとに数Kbほどだとは思っていません。たとえあなたが数(5〜10?)何千ものレコードを持っていても、読み込まれるのはほんの数MBです。適切なインデックスを持つことはずっと重要です。 – Evgeni

+0

Reddisやmemcachedも見た目に価値があるかもしれません。あなたのニーズにもよりますが、RavenDBのようなものも役に立ちます。 – Evgeni