1

假设我有一个班级学生和班级考试记录。现在 ExamRecord 使用 Student.ID 作为数据库中的外键。我应该如何在前端模型中满足它?我应该使用组合并将 Student 类型的对象作为 ExamRecord 的成员(以便稍后在需要时使用它的 ID)还是只声明一个简单的 int(假设 int 是 ID 的数据类型)并将其用于存储考试记录中的学生证?

4

3 回答 3

1

我会把它作为一个 int 存储在课堂上。我将尝试解释原因。

使用数据库时,您尝试对实体之间的关系进行建模,例如在您的情况下,您有一个ExamRecord具有外键的Student. 现在这似乎可以(而且肯定可以)直接翻译成程序代码。但是这里有一个语义差异,我认为这是相当重要的。

也就是说,如前所述,在使用您建模的关系数据库时relationships,您尝试objectsclasses. 这些objects确实与其他对象有不同的关系,否则将很难编码,而在 OOP 中,这种关系是它的优势之一。但是,您肯定听说过Is a(inheritance/interfaces) 和Has a(composition),这是谈论 OOP 关系的常用方式。考试记录有学生吗?

我想我在上面的漫谈中想说的是,数据库中的模型与程序中的模型不同。

它归结为语义,什么是有意义的,什么能最好地传达代码的含义?我说我会使用 ExamRecord 存储学生 ID,因为对我来说,一个ExamRecord has a Student听起来很奇怪,但反过来却很有意义。但同样,这是关于在你的程序上下文中什么是有意义的,只有你才能回答这个问题。

于 2013-07-10T12:15:37.503 回答
0

我同意 Daniel Figueroa 的观点,如果您需要参考考试中的学生,仅使用 ID 听起来不错。

不过,我想在这里挑战这个前提;在数据库中,您可能必须student从 an引用 a exam,但是在您的 OO 代码中,扭转这一点可能更自然:您确定您不只是希望每个student人都保留自己的内部exam对象列表吗?

可能是您绝对需要能够通过 查找学生exam,因此您被迫在原始问题的两个选项之间进行选择。如果不是,那么也许考试甚至不需要“知道”它属于哪个学生。

我并不是说你应该StudentId完全从你的exam-object 中删除 - 只是你应该仔细考虑它们之间的关系,以及你应该通过另一个访问哪个。

稍微不同:我假设一个student可以有几门考试,不知何故,我觉得几门考试应该针对同一个学生有点“混乱”。如果可能的话,我希望通过考试完成的任何事情都应该通过“拥有”该考试的学生来完成。

于 2013-07-10T13:34:23.137 回答
0
  • 成为 ExamRecord 一部分的是对 Student 对象的引用,而不是副本。
  • 拥有 id 并执行查找不是一个好方法。
  • 大多数像实体框架的对象关系映射器(ORM),Nhibernate 都遵循这种方法

当然,当您将其存储在数据库中时,您需要存储外键。

于 2013-07-10T12:01:11.690 回答