2013-07-10 94 views
1

让我们假设我有一个班级Student和一个班级ExamRecord。现在ExamRecord使用Student.ID作为数据库中的外键。我应该如何应对前端模型?我是否应该使用组合并将Student类型的对象作为ExamRecord的成员(因此我可以稍后在需要时使用它的ID),或者只声明一个简单的int(假设int是ID的数据类型)并将其用于存储ExamRecord中的学生ID?在班级中使用外键成员的更好方法是什么?整个对象的组成或者只是声明一个变量

回答

0
  • 它是对学生对象的引用,成为ExamRecord 的一部分,而不是副本。
  • 找到id并执行查找并不是一个好方法。
  • 最喜欢实体框架的对象关系映射(ORM)的,NHibernate的采用这种做法

Ofcourse,当你在数据库中存储这个你需要存储的外键。

1

我会把它作为int存储在类中。我会尽力解释原因。

在处理数据库时,您试图建模实体之间的关系,就像您的情况一样,您有一个ExamRecord,它有一个Student的外键。现在看起来好像它可以(当然可以)直接翻译成程序代码。但是这里有一种语义上的差异,我认为这很重要。

也就是说,如上所述,当您使用关系数据库处理relationships时,在代码中,您正试图在classes的帮助下对objects进行建模。这些objects确实与其他对象有不同的关系,否则编码将非常困难,并且在OOP中关系是其优势之一。 但是您一定听说过Is a(inheritance/interfaces)和Has a(composition),这是讨论OOP关系的常用方法。考试记录是否有学生

我想我想说的是我的上面的ramblings是数据库中的模型与程序中的模型不同。

它归结为什么是语义,什么是有道理的,什么传达你的代码的意义最好?我说我会用存储学生证的考试记录去,因为对我来说这听起来很奇怪,考试记录has a学生,但其他方式却非常合理。但是,这又是关于您的计划背景下有意义的事情,只有您可以回答。

0

我同意丹尼尔菲格罗亚的看法,如果你需要从考试中引用一个学生,那么使用ID听起来很好。

虽然我想挑战这里的前提,在数据库中,您可能必须参考exam中的student,但在您的OO代码中,可能会更自然一些:您是否确实不希望每个student都保留自己的内部列表exam对象?

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

我不是说你应该完全从exam对象中删除StudentId - 只是你应该仔细考虑它们之间的关系,然后你应该通过另一个来访问。

有一点不同:我假设student可以有几个考试,并且对我来说感觉有点“凌乱”,几个考试应该指向同一个学生。如果可能的话,我宁愿在考试中做任何事情,都应该通过那个“拥有”考试的学生来完成。

相关问题