假设我有一个班级学生和班级考试记录。现在 ExamRecord 使用 Student.ID 作为数据库中的外键。我应该如何在前端模型中满足它?我应该使用组合并将 Student 类型的对象作为 ExamRecord 的成员(以便稍后在需要时使用它的 ID)还是只声明一个简单的 int(假设 int 是 ID 的数据类型)并将其用于存储考试记录中的学生证?
3 回答
我会把它作为一个 int 存储在课堂上。我将尝试解释原因。
使用数据库时,您尝试对实体之间的关系进行建模,例如在您的情况下,您有一个ExamRecord
具有外键的Student
. 现在这似乎可以(而且肯定可以)直接翻译成程序代码。但是这里有一个语义差异,我认为这是相当重要的。
也就是说,如前所述,在使用您建模的关系数据库时relationships
,您尝试objects
在classes
. 这些objects
确实与其他对象有不同的关系,否则将很难编码,而在 OOP 中,这种关系是它的优势之一。但是,您肯定听说过Is a
(inheritance/interfaces) 和Has a
(composition),这是谈论 OOP 关系的常用方式。考试记录有学生吗?
我想我在上面的漫谈中想说的是,数据库中的模型与程序中的模型不同。
它归结为语义,什么是有意义的,什么能最好地传达代码的含义?我说我会使用 ExamRecord 存储学生 ID,因为对我来说,一个ExamRecord has a
Student听起来很奇怪,但反过来却很有意义。但同样,这是关于在你的程序上下文中什么是有意义的,只有你才能回答这个问题。
我同意 Daniel Figueroa 的观点,如果您需要参考考试中的学生,仅使用 ID 听起来不错。
不过,我想在这里挑战这个前提;在数据库中,您可能必须student
从 an引用 a exam
,但是在您的 OO 代码中,扭转这一点可能更自然:您确定您不只是希望每个student
人都保留自己的内部exam
对象列表吗?
可能是您绝对需要能够通过 查找学生exam
,因此您被迫在原始问题的两个选项之间进行选择。如果不是,那么也许考试甚至不需要“知道”它属于哪个学生。
我并不是说你应该StudentId
完全从你的exam
-object 中删除 - 只是你应该仔细考虑它们之间的关系,以及你应该通过另一个访问哪个。
稍微不同:我假设一个student
可以有几门考试,不知何故,我觉得几门考试应该针对同一个学生有点“混乱”。如果可能的话,我希望通过考试完成的任何事情都应该通过“拥有”该考试的学生来完成。
- 成为 ExamRecord 一部分的是对 Student 对象的引用,而不是副本。
- 拥有 id 并执行查找不是一个好方法。
- 大多数像实体框架的对象关系映射器(ORM),Nhibernate 都遵循这种方法
当然,当您将其存储在数据库中时,您需要存储外键。