2010-11-18 10 views
0

タイトルはうまくいきますが、私が質問のために考えることのできる最も良い説明が例です。DDD:多くの他のオブジェクトのうちの1つに関連するオブジェクト、または他のオブジェクトのみに関連する多くのオブジェクト?

アカウント、予定などのシステム内の他の種類のオブジェクトに添付できるメモを表すオブジェクト「ノート」があるとします。ノートは日付とノートの内容のみを持ち、別のオブジェクトの1つのインスタンスにしか適用できません。ある

だから、より良い:

  • 一つ、ノートがために作られた任命への参照を持つことになります(注に適用されていないタイプのヌル参照を持つことができます注の種類、しかし場合はnullアカウント/システム内の他のオブジェクトではない)
  • 同じロジックを複製するが、注釈の参照が不要な複数のノートタイプ(AppointmentNote、AccountNote)。

これらは永続クラスであり、私はサブクラス化されたノートタイプを持つことによって技術的に複雑にしたくないことに注意してください。この例ではドメインを可能な限りフラットにしておきたいと思います。

答えて

-1

他のオブジェクトが参照する単一のNoteクラスではないのはなぜですか?アポイントメント、アカウントなどは、単にノートオブジェクトの総称リストを有するだけである。

+0

永続オブジェクトで起こるためには、n-1フィールド(nはそれらにメモを付けることができるオブジェクトの数)に対して、Noteはnull fkeysを持ちます。それが私が最初の方法で持っている問題の要点です。多重度は '予約/勘定1 - *注' –

+0

@ SnOrfusです:あなたのORMについての何かが見えていないのかもしれません。しかし、少なくともドメインの観点からは、それらに適用される注釈をオブジェクトに持たせるのが理にかなっているようです。ノートで始まり、その親を見つける必要がある場合を除きますか?私はノートがファーストクラスの親オブジェクトに第2クラスのアドオンであると考えました。なぜノートは親を参照する必要がありますか? – David

2

だから、これは良いです。それが適用されていないタイプのヌル参照を持つことができます注

  • 一つのタイプ(注ノートがために作られた任命への参照を持っていますが、nullになります
  • 複数のノートタイプ(AppointmentNote、AccountNote)は、同じロジックを複製しますが、メモの参照が無関係にならないようにしています。

どちらもありません。また、私たちがあなたの物やテーブルについて話しているかどうかについては完全にはっきりしていません。

メモの種類は1つです。それは、それがまったく関連しているオブジェクトを参照すべきではありません。

public class Note 
{ 
    public DateTime CreatedAt { get; set; } 
    public string Content { get; set; } 
} 

public class Account 
{ 
    public ICollection<Notes> Notes { get; } 
} 

public class Appointment 
{ 
    public ICollection<Notes> Notes { get; } 
} 

はその後でサポートするものの、必ずしも容易ではない(任意のORMをサポートするために簡単にする必要がありますどちらのデータベーステーブルをレイアウトする方法、のカップルがありません - 本当に-ORM-が、 -half-look-like-one(Linq2SQLやSubSonicなど、データベーステーブルごとにクラスを生成するツール)。

まずDBレイアウト:

TABLE Notes 
(
    Id, 
    CreatedOn, 
    Content, 
    AccountId, 
    AppointmentId 
) 

だから何のn-1外部キーがnullの場合。これは、クラスごとの階層構造であり、特定のサブクラスでは無意味な列を持つために受け入れられます。

第二の方法:

TABLE Notes 
(
    Id, 
    CreatedOn, 
    Content 
) 

TABLE AccountNotes 
(
    AccountId, 
    NoteId 
) 

TABLE AppointmentNotes 
(
    AppointmentId, 
    NoteId 
) 

そして、これは、テーブル・クラスごとのレイアウトのより多くのだろう。コード内でサブクラス化されたNote型が実際に必要であるとは言わないが、たとえそれを行っても、 "ツールとの戦い"を避けるために、論理の重複を意味するものではない。

最後に、選択する必要があります。任命に関する注釈は本質的に勘定科目とは異なりますので、あなたはあるレベルでそれに対処しなければなりません。

+0

+1 - あなたは私の難解をもっと簡潔な方法で正確に再現しました。そして、あなたが正しいと思うのは、私が選択しなければならない、私はあなたが主張しているのか分かりません。 –

+0

まあ、あなたのコメントや質問は、どちらかを選びたくないと言っているようです。また、あなたのオブジェクトモデルやデータベーステーブルに関する質問もありましたか?オブジェクトの場合、私は1つのオプションしか与えませんでした。テーブルの場合、いずれかが完全に有効です。データアクセスツールに適したものを選択してください。私はクラスごとの階層ごとに行く傾向がありますが、すべての余分なテーブルとIDが開発のデバッグサイクルに影響する可能性があるからです。 –

関連する問題