我已经阅读了一些UML类图。我用这种方式看到了一些UML设计:
例如:有两个类:class Student和class Transcript。每个学生都有成绩单,每个成绩单都与学生一起。所以,班级学生和班级成绩单一起依赖。那么,这是一个设计良好的课程吗?
如果没有,我们如何解决这个问题。如果可以的话,我怎样才能很好地实现这种关系呢?
谢谢:)
答案 0 :(得分:1)
我不会说这是一个非常好的设计:显然,你希望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
并返回的方法。
然而,这种双向关系......不寻常。它基本上有一个大的物体切成两半 - 但仍然保持那些一半非常紧紧地绑在一起。你为什么要这样做?相反,它并没有消除任何复杂性:它引入了以前没有的新的人为复杂性。
答案 1 :(得分:0)
这里你应该考虑的是导航性。听起来这种关系是完全合适的,但是,您是否必须从Transcript
导航到Student
?如果没有,则您的关系不是双向的,Transcript
不再依赖Student
。您是否始终首先找到Student
,然后找到Transcript
?
说实话,我不会太担心。如果它对你有用 - 那就去吧!