避免对多对多对象关系的循环引用
Avoid circular reference on many-to-many object relations
我在处理多项选择题的应用程序中遇到了一些对象关系问题。
想到那些练习,我可以:
1- 我有几个练习,有几个问题,有几个备选方案。
2-一个特定的问题可以是几个练习的一部分。
3- 一个特定的替代方案不能作为多个问题的一部分。
关系方面:
练习问题
问题 < 1-n > 备选方案
我按照下面的方式对 classes 进行了编码:
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;
//...
}
我不知道我做的是否正确,但是,我没有在 classes 属性中存储关系 ID,而是存储相关 class 的一个实例。我开始的时候似乎是正确的方法。
我预见的问题是,在 Exercise-ExerciseQuestion-Question 关系中,我将陷入循环引用的地狱。我将有一个包含多个 ExerciseQuestion 的 Exercise,其中包含一个 Exercise 实例,其中包含很多 ExerciseQuestion。我的假设是否正确?
是否有更好或更正确的方式来表达这种关系?我应该改为存储 ID 而不是实例,还是可以使用一些设计模式?
如果我没看错,你实际上没有问题。如果您的领域包括循环或自引用关系,那么您的模型也应该如此。
由于您的对象是实体(它们具有身份),因此您需要注意每个 ID 只存在一个实例。但只要你强制执行,他们就可以按照你的需要相互引用。
现在,如果您需要以某种详尽的方式遍历对象图,循环引用可能很难处理。在这种情况下,您需要注意不要让自己陷入死循环。但是,如果您的领域确实存在这些关系,那么您需要对它们进行建模,并且您必须实施某种方法来检测循环并处理它们。详情将根据您的具体需求而定。
我不确定我是否明白你在说什么,但如果你问:循环引用有问题吗?答案是否定的,这取决于你要做什么以及你如何处理你的问题。
但是如果你在谈论你的实现,答案肯定是不,这不是问题,因为 class 属性不存储 "an objet" 但 "a reference to an object" 因此没有循环构造导致无限递归你的情况下的迭代
祝你好运
您的模型有问题。关系对象应该只存储关系中涉及的部分的 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)
你的 类 应该遵循这一点。
我在处理多项选择题的应用程序中遇到了一些对象关系问题。
想到那些练习,我可以:
1- 我有几个练习,有几个问题,有几个备选方案。 2-一个特定的问题可以是几个练习的一部分。 3- 一个特定的替代方案不能作为多个问题的一部分。
关系方面:
练习
问题 < 1-n > 备选方案
我按照下面的方式对 classes 进行了编码:
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;
//...
}
我不知道我做的是否正确,但是,我没有在 classes 属性中存储关系 ID,而是存储相关 class 的一个实例。我开始的时候似乎是正确的方法。
我预见的问题是,在 Exercise-ExerciseQuestion-Question 关系中,我将陷入循环引用的地狱。我将有一个包含多个 ExerciseQuestion 的 Exercise,其中包含一个 Exercise 实例,其中包含很多 ExerciseQuestion。我的假设是否正确?
是否有更好或更正确的方式来表达这种关系?我应该改为存储 ID 而不是实例,还是可以使用一些设计模式?
如果我没看错,你实际上没有问题。如果您的领域包括循环或自引用关系,那么您的模型也应该如此。
由于您的对象是实体(它们具有身份),因此您需要注意每个 ID 只存在一个实例。但只要你强制执行,他们就可以按照你的需要相互引用。
现在,如果您需要以某种详尽的方式遍历对象图,循环引用可能很难处理。在这种情况下,您需要注意不要让自己陷入死循环。但是,如果您的领域确实存在这些关系,那么您需要对它们进行建模,并且您必须实施某种方法来检测循环并处理它们。详情将根据您的具体需求而定。
我不确定我是否明白你在说什么,但如果你问:循环引用有问题吗?答案是否定的,这取决于你要做什么以及你如何处理你的问题。 但是如果你在谈论你的实现,答案肯定是不,这不是问题,因为 class 属性不存储 "an objet" 但 "a reference to an object" 因此没有循环构造导致无限递归你的情况下的迭代 祝你好运
您的模型有问题。关系对象应该只存储关系中涉及的部分的 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)
你的 类 应该遵循这一点。