我在处理多种选择练习的应用程序中面临一些对象关系问题。
考虑这些练习,我可以做到:
1-我有几个练习,有几个问题,有几个选择。 2-一个特定的问题可以是几个练习的一部分。 3-特定的替代方法不能成为几个问题的一部分。
在关系方面:
锻炼
问题<1-n>替代
我按照下面的方式对类进行编码:
class Exercise {
private $id;
private $name;
private $questions = []; //array of ExerciseQuestion
//...
}
class ExerciseQuestion {
private $id;
private $exercise = new Exercise();
private $question = new Question();
private $order; //handles question's order of appearance
//...
}
class Question {
private $id;
private $wording;
//...
}
class Alternative {
private $id;
private $question = new Question();
private $text;
//...
}
我不知道我是否做过,但是,我没有在类属性中存储关系ID,而是在存储相关类的实例。当我开始时这似乎是正确的方法。
我预见的问题是,在关系 Exercise-ExerciseQuestion-Question 中,我将陷入循环引用的境地。我将有一个带有几个ExerciseQuestion的Exercisen,其中包含一个带有很多ExerciseQuestion的Exercises实例。我在这个假设中正确吗?
是否存在更好或正确的方式来表达这种关系?我应该更改存储ID而不是实例,还是可以使用某些设计模式?
答案 0 :(得分:2)
如果我正确地阅读了您的书,那么您实际上没有问题。如果您的域包含循环或自引用关系,那么您的模型也应如此。
由于您的对象是实体(它们具有身份),因此您需要注意每个ID仅存在一个实例。但是只要您强制执行,它们就可以相互引用,但是您需要它们相互引用。
现在,如果您需要以某种详尽的方式遍历对象图,则循环引用可能很难处理。在这种情况下,您需要注意不要陷入无休止的循环。但是,如果您的域实际上具有这些关系,则需要对其进行建模,并且必须实现某种方法来检测周期并进行处理。详细信息将根据您的特定需求提供。
答案 1 :(得分:0)
我不确定我是否理解您的意思,但是如果您要问:循环引用是否有问题?答案是否定的,这取决于您要做什么以及如何处理问题。 但是,如果您正在谈论实现,那么答案肯定是不,这不是问题,因为class属性不存储“对象”而是“对对象的引用”,因此没有循环结构可导致无限递归迭代案件 祝你好运
答案 2 :(得分:0)
您的模型有问题。关系对象应仅存储关系中涉及的零件的ID,exercise_id和question_id,以及适用于两个实体的关系的任何其他属性,例如顺序。您无需在关系对象中实例化所涉及的实体。
准确地说,您的ER模型就是这样
Exercise (id, name)
Question (id, wording)
ExerciseQuestion (exercise_id, question_id, order) // both ids
// form primary key
Alternative (id, text, question_id)
您的课程应该紧随其后。