避免对多对多对象关系进行循环引用

时间:2018-12-21 21:22:48

标签: php oop cyclic-reference

我在处理多种选择练习的应用程序中面临一些对象关系问题。

考虑这些练习,我可以做到:

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而不是实例,还是可以使用某些设计模式?

3 个答案:

答案 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)

您的课程应该紧随其后。