我已经阅读了一些 UML 类图。我以这种方式看到了一些 UML 设计:
例如:有两个类:Student 类和 Transcript 类。每个学生都有一份成绩单,每一份成绩单都和一个学生在一起。因此,班级学生和班级成绩单是相互依赖的。那么,这是一门精心设计的课程吗?
如果没有,我们该如何解决这个问题。如果这没问题,我怎样才能很好地实现这种关系?
谢谢 :)
我不会说这是一个非常好的设计:显然,你想要student.transcript.student == student
并且transcript.student.transcript == transcript
在任何特定时刻都是真实的,对吧?但是没有成绩单的学生呢?没有学生的成绩单?如果这些被禁止,您可能会以一个有趣的情况结束:您必须同时创建相应的Student
和Transcript
!
好吧,在数据库领域,这通常用三个表建模(可能直接对应于实际物理表,也可能不直接对应):
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
约束确保如果您选择学生,获取其成绩单,并获得该成绩单的学生,您将返回到您开始使用的原始学生;Transcript->Student->Transcript
导航也是如此。
在 OOP 世界中,您可能会有某种StudentTranscriptDispatcher
内部信息List<Pair<Student, Transcript>>
,以及Student
转入Transcript
和返回的方法。
然而,这种双向关系是……不寻常的。它基本上是将一个大物体切成两半——但仍然将这两半紧紧地绑在一起。你为什么要这样做?相反,它并没有消除任何复杂性:它引入了以前没有的新的、人为的复杂性。
您可能应该在这里考虑的是可导航性。听起来这种关系是完全合适的,但是,您是否必须从 toTranscript
导航Student
?如果不是,则您的关系不是双向的,并且Transcript
不再依赖于Student
. 你总是Student
先找到 a 再找到 aTranscript
吗?
老实说,我不会担心太多。如果它适合你 - 去吧!