2009-04-03 20 views
1

私は新しいプロジェクトを開始し、nhibernateの使用を計画しています。私は、外部キーを省いてパーシスタンス情報をドメインモデルできれいにする必要があるかどうかに苦しんでいます。私の「モデル」のいくつかが本当に必要ではなく、パフォーマンスが問題になるような気がします。ドメインモデルからFKを削除する必要がありますか?

私のDBに

私は、次の表があります:

​​

私のモデルでは、私は2クラスを定義している:この表でのFKの関係を持っている

Posting 
    Id 
    StatusId 
    ... 

たとえば、
class Posting 
{ 
    virtual int Id { get; set; } 
    virtual PostingStatus Status { get; set; } 
    // .. 
} 

class PostingStatus 
{ 
    virtual int Id { get; set; } 
    virtual string Name { get; set; } 
} 

PostingStatusは、私のモデルに属していますか?私がFKを事前に知っている場合には、提出後に投稿を更新するのと同じように、FHを設定するのではなく、PostingStatusインスタンスをnhibernateで取得するのはかなり重大なパフォーマンスヒット(または役に立たない仕事)ではありませんか?

私はこの問題が以前に議論されてきたと確信していますが、ショット関連性を持つ議論の断片を見つけ出しています。この問題に関する考えやリソースは高く評価されます。

答えて

3

ドメインモデルで関係を強制する必要がある場合は、外部キーが必要です。

パフォーマンスの問題が実際に発生するまで、パフォーマンスは心配しないでください。

1

ミッチが言ったこと。 NHibernateは、これらの問題を徹底的に考えた人々によってまとめられました。何が正しいのか、問題がある場合は最適化を心配してください。

は(NHibernateはおそらくとにかく、キャッシュからの投稿sttausをフェッチすることになるだろう。)

はまた、NHibernateは、あなたがそれを設定する方法に応じて、あなたのオブジェクトにデータベースをマッピングするためにFK制約が必要な場合があります。

PostingStatusがドメインエンティティの場合は、それを保持する必要があります。そうでない場合は、早期に最適化しようとするのではなく、その理由で削除してください。

1

この非常に特殊なケースでは、エンティティPostingStatusをEnumに置き換えることができます。列挙型の値を適切に指定すると、テーブルにマップしてFKによって強制できます。

NHは「ただキャッシュする」ものではありません。私は、この種の状況のた​​めに、PostingStatusの遅延読み込みを伴う第2レベルキャッシュの使用を推奨します。

関連する問題