私はそれが非常に良いデザインだとは言いません:どうやら、あなたはいつでも真実でありたいstudent.transcript.student == student
と思っていますよね?transcript.student.transcript == transcript
しかし、成績証明書のない学生はどうですか?学生のいない成績証明書?それらが禁止されている場合、あなたは面白い状況で終わるかもしれません:あなたは対応するStudent
とTranscript
同時に作成しなければならないでしょう!
データベース領域では、これは通常3つのテーブルでモデル化されます(実際の物理テーブルに直接対応する場合と対応しない場合があります)。
TABLE Student ( studentId ID PRIMARY KEY, ... )
TABLE Transcript ( transcriptId ID PRIMARY KEY, ... )
TABLE StudentTranscriptLink (
studentId ID NOT NULL UNIQUE REFERENCES Student(studentId),
transcriptID Id NOT NULL UNIQUE REFERENCES Transcript(transcriptId)
) PRIMARY KEY ( studentId, transcriptId )
UNIQUE
制約により、Studentを取得し、そのトランスクリプトを取得し、そのトランスクリプトのStudentを取得すると、最初に使用した元のStudentに戻ることが保証されます。Transcript->Student->Transcript
ナビゲーションについても同じことが言えます。
OOPの世界では、おそらく内部に何らかの種類がありStudentTranscriptDispatcher
、向きを変えたり戻したりする方法があります。List<Pair<Student, Transcript>>
Student
Transcript
しかし、そのような双方向の関係は...珍しいものです。基本的には、1つの大きなオブジェクトを2つにスライスしますが、それでもこれらの半分を非常に緊密に結び付けたままにします。なぜあなたはこれをしますか?それどころか、複雑さを取り除くことはありません。以前にはなかった新しい人工的な複雑さをもたらします。