避免对多对多对象关系的循环引用

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)

你的 类 应该遵循这一点。